2

関数は__call()CakePHP のコントローラーで利用できますか? 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の場合

4

7 に答える 7

6

ここで多くの人が指摘しているように、__call() は、存在しないクラス メソッドの呼び出しをキャッチするネイティブ PHP5 言語の「魔法の」メソッドです。

ただし、Cake のコア (ディスパッチャーだと思います) は、呼び出す前にメソッドが存在するかどうかを確認し、存在しない場合は、メソッドが見つからないというエラーを表示します。

解決策は、独自の AppError クラスを作成し、そこで「すべてをキャッチ」メソッドを処理することです。

エラー処理の下のクックブックには限られた量の情報があります

于 2009-10-20T20:50:10.323 に答える
0

何に使った?

__call() メソッドは、クラスに明示的に存在しないメソッドへの呼び出しを「キャッチ」できるようにするクラス内から使用できる PHP の構成要素です。

PHP.netから:

__call() は、オブジェクト コンテキストでアクセスできないメソッドを呼び出すときにトリガーされます。

したがって、PHP 5 以降を使用している限り、答えはyesです。

于 2009-10-20T18:35:02.557 に答える
0

__call() は言語構造であるため、それをサポートするすべてのバージョンの php で使用できます。

于 2009-10-20T18:35:24.433 に答える
0

__call() は PHP のマジック メソッドであり、特定のフレームワークではありません。__call() はグローバルではなく特定のオブジェクトで定義されているため、コンテキストなしでこの質問に答えることは不可能です。CakePHP は php4 と互換性があり、__call() が php5 で導入されたという事実を宣伝しているので、私はノーと言います。

Models の production ブランチを調べたところ、PHP5 の __call() をエミュレートしようとしているように見える call__() メソッドがあります。

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


編集(コメントへの返信):

Cake のベース コントローラを見ると、Zend の __call() の実装を模倣するコントローラで利用できる「キャッチオール」メソッドはないようです。これを実現する別の方法は、cake のページ ルートに似たルートを設定して、コントローラーに向けられたすべてのアクションをキャッチし、それらを 1 つのメソッドに送信することです。

ベースコントローラーの 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

私が参照したそのドキュメントの例の 1 つは、上記のことを達成するために遊ぶことができるもののように見えます。

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

given-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

__callPHP 5 のマジック メソッドの 1 つです(詳細については、「メソッドのオーバーロード」を参照してください)。

PHP 5 を使用している場合(および、Zend Framework を使用している場合)__callは、使用しているフレームワークに依存せずに、クラスにメソッドを含めることができます。

于 2009-10-20T18:35:54.520 に答える