2

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

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

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

我收到这样的错误:

用户控制器中缺少方法

<?php

class UsersController extends AppController {

 var $name = 'Users';


 function somemethodsnotincontoller() {

 }

}
?>

对于 URL site.com/users/somemethodsnotincontoller

4

7 回答 7

6

正如许多人在这里指出的那样,__call() 是一种原生 PHP5 语言“魔术”方法,用于捕获对不存在的类方法的调用。

但是,Cake 的核心(我认为它是调度程序)在调用它之前首先检查该方法是否存在,如果不存在,它会呈现缺少方法的错误。

一个解决方案可能是让您创建自己的 AppError 类,并在其中处理“catch all”方法。

错误处理下的食谱中的信息量有限

于 2009-10-20T20:50:10.323 回答
1

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

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

并且以这种方式调用的方法不会_call.

于 2014-01-03T22:12:42.863 回答
0

用它做什么?

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

来自PHP.net

__call() 在对象上下文中调用不可访问的方法时触发。

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

于 2009-10-20T18:35:02.557 回答
0

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

于 2009-10-20T18:35:24.433 回答
0

__call() 是 PHP 的一种魔术方法,而不是任何特定的框架。没有任何上下文就不可能回答这个问题,因为 __call() 是在特定对象中定义的,而不是全局定义的。由于 CakePHP 吹捧它与 php4 兼容并且 __call() 是在 php5 中引入的,所以我会说不。

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

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


编辑(回应评论):

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

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

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

我引用的那个文档中的一个例子看起来像你可以用来完成我上面提到的事情:

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

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

于 2009-10-20T18:36:02.570 回答
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 **/
}
于 2015-10-22T22:38:11.527 回答
-1

__call是 PHP 5 的神奇方法之一(有关详细信息,请参阅“方法重载”)。

如果您使用的是 PHP 5 (如果您使用的是 Zend Framework),您的类中可以有一个__call方法,而不取决于您使用的框架。

于 2009-10-20T18:35:54.520 回答