【问题标题】:Codeigniter routing behavior with the controllers magic method __call使用控制器魔术方法 __call 的 Codeigniter 路由行为
【发布时间】:2012-08-14 07:58:41
【问题描述】:

URI 中的段通常遵循 Codeigniter 中的这种模式:

XYZ.com/Class/Method/param1/param2

当在控制器中定义被调用的方法时,这将按预期工作,但如果我为 URI 提供一些未定义的方法来调用处理任何未定义方法的 __call 魔术方法,则没有任何效果。

__call 仅在从控制器本身调用时才被调用,而不是当我从 URI 调用某些未定义的方法时调用

有什么解释吗?

谢谢

【问题讨论】:

    标签: php codeigniter url routing magic-methods


    【解决方案1】:

    在 CodeIgniter 中,有_remap。所以如果你去

    XYZ.com/Class/UndefinedMethod/param1/param2

    然后_remap会被调用(实际上_remap总是会被调用,所以我们需要确保确实存在的方法被正确调用)。

    function _remap($method, $params=array()){
        $funcs = get_class_methods($this);
        if(in_array($method, $funcs)){ // We are trying to go to a method in this class
            return call_user_func_array(array($this, $method), $params);
        }
        // else do something else
    }
    

    【讨论】:

    • _remap 有效,但无论您的 URI 包含什么,它都会被调用。不管被调用的方法是否被定义。我只需要处理未定义的方法,再加上为什么 __call 在第一个地方不起作用?
    • 是的,_remap 总是会被调用,不过我添加的代码应该会为你解决这个问题。 __call 不起作用,因为这就是 CodeIgniter 的工作方式。 _call 适用于模型(和库),但不适用于控制器。这就是为什么有_remap
    • 我不想调用已定义的函数。我只想让它处理任何未定义的函数。 _remap 不是 __call,它们是不同的,但由于这是 codeigniter 工作的唯一方式,所以问题解决了。
    • 是的,CodeIgniter 可能有点奇怪,它就是这样工作的 :-)
    【解决方案2】:

    查看服务器(Apache?)日志文件。毫无疑问,您会看到导致处理中止的 PHP 错误。除非您通过将未定义的函数重新映射到错误页面来覆盖它们,否则随机 URL 将导致“什么都没有”发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多