CakePHP kontrolörleri __call () fonksiyonu nedir?

6 Cevap php

__call() function CakePHP'nin kontrolörler mevcuttur? Ben Zend Framework bu işlevi kullanılır.

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

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

Ben böyle hata alıyorum:

Missing Method in UsersController

<?php

class UsersController extends AppController {

 var $name = 'Users';


 function somemethodsnotincontoller() {

 }

}
?>

URL için site.com/users/somemethodsnotincontoller

6 Cevap

Birçok burada belirttiği gibi, __ call () var olmayan sınıf yöntemleri aramaları yakalamak için yerli PHP5 dil "sihirli" yöntemidir.

ANCAK, Cake çekirdek (ben memuru olduğunu düşünüyorum) yöntemi çağırmadan önce ilk olup olmadığını görmek için denetler, ve eğer bu olmuyorsa o eksik yöntem hatası vermektedir.

Bir çözümü kendi AppError sınıf oluşturmak için, ve orada "catch all" yöntemini kolu olabilir.

Error handling altında yemek kitabı bilgi sınırlı bir miktarda var

CakePHP ReflectionMethod ile eylemleri çağırır çünkü Evet, ama bu iş olmaz

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

ve bu şekilde are not processed tarafından çağrılan yöntemleri _call.

Ne için kullanılır?

__ Call () yöntemi "yakalamak" açıkça sınıfta yoktur yöntemleri aramaları için izin sınıfları içinde kullanabileceğiniz PHP bir yapıdır.

Dan PHP.net:

__call() is triggered when invoking inaccessible methods in an object context.

Yani cevap sürece PHP 5 veya yukarı kullandığınız gibi, yes olduğunu.

__call () yani onu destekleyen php tüm sürümlerinde kullanılabilir bir dil oluşumudur.

__call () PHP'nin bir büyü bir yöntem değil, herhangi bir çerçevedir. __ Call () değil küresel, belirli bir nesne tanımlanır çünkü herhangi bir bağlam olmadan bu soruyu cevaplamak için imkansız. CakePHP bu PHP4 uyumlu ve __ çağrı olduğunu gerçeğini Sundu beri () hayır derim php5 tanıtıldı.

Ben modeller için üretim dalı baktı ve PHP5 en __ () çağrısı taklit etmeye çalışır gibi görünen bir call__ () yöntemi vardır.

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


Edit (Yorumlamak için Yanıt):

Cake baz kontrolör baktığımızda, kontrolörler bulunan bir 'catch-all' yöntemi olması görünmüyor __ çağrı taklit zerdüştlerin uygulaması (). Bunu gerçekleştirmek için alternatif kurulum için bir kontrolör yönelik tüm eylemleri yakalamak ve tek bir yöntemle bunları göndermek için kekinin sayfasına yönlendirmek için benzer bir yol olacaktır.

Cake Trac for base controller: https://trac.cakephp.org/browser/branches/1.2.x.x/cake/libs/controller/controller.php?rev=4211

Cake documentation on routing: http://book.cakephp.org/view/46/Routes-Configuration

Sana yukarıda belirtilen ne başarmak için oynayabilirsiniz şey gibi görünüyor başvurulan belgelerinde örneklerinden biri:

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

Ne olursa olsun verilen-eylem, her dizin eylemini kullanın.

__call PHP 5 adlı bir magic methods (daha fazla bilgi için "Method overloading" bakınız).

Eğer PHP 5 kullanıyorsanız (and you are, if you are usinf Zend Framework), siz çalıştığınız çerçevesinde bağlı olarak değil, kendi sınıflarında bir __call yöntemi olabilir.