CakePHP控制器中的__call()函数?

时间:2009-10-20 18:30:58

标签: php cakephp magic-methods

是CakePHP控制器中的__call()功能吗?我在Zend Framework中使用了这个函数。

class UsersController extends AppController {
    function home(){
        /*some action*/
    }

    function __call($m, $p){
        print_r($m);
        print_r($p);
    }
}

我收到的错误是这样的:

  

在UsersController中缺少方法

<?php

class UsersController extends AppController {

 var $name = 'Users';


 function somemethodsnotincontoller() {

 }

}
?>
     

网址 site.com/users/somemethodsnotincontoller

7 个答案:

答案 0 :(得分:6)

正如许多人在此指出的那样,__ call()是一种本机PHP5语言“魔术”方法,用于捕获对不存在的类方法的调用。

但是,Cake的核心(我认为它是调度程序)在调用之前检查方法是否存在,如果不存在则会导致丢失方法错误。

解决方案可能是您创建自己的AppError类,并在那里处理“catch all”方法。

Error handling

下的烹饪书中的信息量有限

答案 1 :(得分:1)

是但是它不起作用,因为CakePHP通过ReflectionMethod

调用操作
// CakePHP 2.4.3
// Controller.php
public function invokeAction(CakeRequest $request) {
    try {
        $method = new ReflectionMethod($this, $request->params['action']);

_call {{1}}为方式are not processed调用方法。

答案 2 :(得分:0)

用它来做什么?

__call()方法是PHP中的一个构造,可以在类中使用,允许您“捕获”对类中不存在的方法的显式调用。

来自PHP.net

  调用对象中不可访问的方法时会触发

__ call()   上下文。

所以答案是,只要您使用的是PHP 5或更高版本。

答案 3 :(得分:0)

__ call()是一种语言结构,因此它可以在支持它的所有版本的php中使用。

答案 4 :(得分:0)

__ call()是PHP的神奇方法,而不是任何特定的框架。没有任何上下文就不可能回答这个问题,因为__call()是在特定对象中定义的,而不是全局的。由于CakePHP吹嘘它是php4兼容的事实,而__call()是在php5中引入的,我会说不。

我查看了Models的生产分支,并且有一个调用__()方法,看起来它试图模拟PHP5的__call()。

https://trac.cakephp.org/browser/branches/1.2.x.x/cake/libs/model/model.php?rev=4211#L437


修改(回复评论):

看看Cake的基本控制器,似乎没有一个“catch-all”方法可用于模仿Zend的__call()实现的控制器。完成此操作的替代方法是设置类似于cake的页面路由的路由,以捕获指向控制器的所有操作并将它们发送到单个方法。

基础控制器的Cake Trac: https://trac.cakephp.org/browser/branches/1.2.x.x/cake/libs/controller/controller.php?rev=4211

关于路由的Cake文档: http://book.cakephp.org/view/46/Routes-Configuration

我引用的文档中的一个示例看起来像是可以用来完成我上面提到的内容:

Router::connect(
    '/cooks/:action/*', array('controller' => 'users', 'action' => 'index')
);

无论给定的操作如何,始终使用索引操作。

答案 5 :(得分:0)

在CakePHP 3中,您绝对可以使用__call,只需确保控制器定义isAction()即可。例如:

public function isAction($action) {
    // To allow all actions to go to __call:
    return TRUE;
}

public function __call($name, $arguments) {
  //** your code called for every undefined action here **/
}

答案 6 :(得分:-1)

__call是PHP 5的magic methods之一(有关详情,请参阅“Method overloading”。)

如果您使用的是PHP 5 (如果您使用的是Zend Framework),您可以在类中使用__call方法,而不是取决于您所使用的框架与...合作。