簡體   English   中英

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

[英]__call() function in CakePHP controllers?

在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() { } } ?> 

用於URL site.com/users/somemethodsnotincontoller

正如許多人在這里指出的那樣,__call()是原生的PHP5語言“魔術”方法,用於捕獲對不存在的類方法的調用。

但是,Cake的核心(我認為是調度程序)在調用該方法之前先檢查該方法是否存在,如果不存在,則會呈現缺少的方法錯誤。

一個解決方案可能是讓您創建自己的AppError類,並在那里處理“全部捕獲”方法。

烹飪書中“ 錯誤處理 ”下的信息量有限

是的,但是它不起作用,因為CakePHP通過ReflectionMethod調用動作

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

_call 不會處理以這種方式調用的方法。

用它做什么用?

__call()方法是PHP中的一種構造,您可以在類中使用__call()方法,該類允許您“捕獲”對明確不在類中存在的方法的調用。

PHP.net

在對象上下文中調用不可訪問的方法時,會觸發__call()。

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

__call()是一種語言構造,因此在所有支持它的php版本中都可用。

__call()是PHP的魔術方法,不是任何特定的框架。 在沒有任何上下文的情況下不可能回答這個問題,因為__call()是在特定對象而非全局對象中定義的。 由於CakePHP吹捧它與php4兼容,並且在php5中引入了__call(),我會拒絕。

我查看了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

關於路由的Cake文檔: http : //book.cakephp.org/view/46/Routes-Configuration

我引用的該文檔中的示例之一看起來就像可以用來完成我上面提到的事情的東西:

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

無論給定動作如何,都始終使用索引動作。

在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 **/
}

__call是PHP 5的魔術方法之一 (有關更多詳細信息,請參見“ 方法重載 ”)。

如果您使用的是PHP 5 (如果使用的是usinf Zend Framework,則使用) ,則可以在類中使用__call方法,而不取決於所使用的框架。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM