2009-10-20 3 views
2

은 CakePHP의 컨트롤러에서 사용할 수있는 기능입니까? __call()입니까? Zend Framework에서이 함수를 사용했습니다. 이 같은CakePHP 컨트롤러에서 __call() 함수가 필요합니까?

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

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

내가지고있어 오류 :

의 URL site.com/users/somemethodsnotincontoller에 대한 UsersController

<?php 

class UsersController extends AppController { 

var $name = 'Users'; 


function somemethodsnotincontoller() { 

} 

} 
?> 

에 방법을 누락

답변

0

무엇 때문에 사용 했습니까?

__call() 메서드는 클래스 내에 존재하지 않는 메서드에 대한 호출을 "catch"할 수있는 클래스 내에서 사용할 수있는 PHP의 구문입니다. PHP.net 가입일

: 오브젝트 컨텍스트에서 액세스 메소드를 호출 할 때

__call()가 트리거된다.

PHP 5 이상을 사용하는 경우 대답은 입니다.

+0

이것은 CakePHP 컨텍스트를 무시합니다. – theraccoonbear

0

__call()은 언어 구조이므로 지원하는 모든 PHP 버전에서 사용할 수 있습니다.

-1

__call은 PHP 5의 magic methods 중 하나입니다 (자세한 내용은 "Method overloading"참조).

당신이 PHP 5 를 사용하는 경우 (당신이 젠드 프레임 워크 usinf있는 경우이다), 당신은 당신이 작업중인 프레임 워크에 따라하지, 수업에 __call 방법이있을 수 있습니다.

0

__call()은 특정 프레임 워크가 아닌 PHP의 마법 방법입니다. __call()이 전역이 아닌 특정 객체에 정의되어 있기 때문에 컨텍스트없이이 질문에 대답하는 것은 불가능합니다. CakePHP는 php4와 호환이 가능하고 php5에서 __call()이 소개되었으므로 no라고 말합니다.

Models의 프로덕션 분기를 살펴보면 PHP5의 __call()을 에뮬레이트하려고하는 것처럼 보이는 __() 호출 메서드가 있습니다.

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


편집은 (주석에 응답) : 케이크의 기본 컨트롤러를 보면

는 컨트롤러에서 사용할 수있는 '캐치 올'방법이있을 나타나지 않습니다 모방 젠드의 __call() 구현. 이것을 달성하기위한 대안은 케이크의 페이지 경로와 유사한 경로를 설정하여 컨트롤러로 향하는 모든 동작을 잡아서 단일 방법으로 전송하는 것입니다.기본 컨트롤러에 대한

케이크 Trac에 : 나는 당신이 내가 위에서 언급 한 것을 수행하는 놀 수있는 일이 같은 외모를 참조하는 문서의 예제의 http://book.cakephp.org/view/46/Routes-Configuration

하나 : 라우팅에 https://trac.cakephp.org/browser/branches/1.2.x.x/cake/libs/controller/controller.php?rev=4211

케이크 문서 :

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

주어진 동작과 관계없이 항상 색인 동작을 사용하십시오.

+0

CakePHP는 __call을 사용합니다. –

+0

내 Qustion 업데이트를 확인하십시오. – coderex

6

많은 사람들이 지적했듯이 __call()은 존재하지 않는 클래스 메소드에 대한 호출을 잡기위한 기본 PHP5 언어 "마법"메소드입니다.

그러나 Cake의 핵심 (나는 그것이 dispatcher라고 생각합니다)은 메소드를 호출하기 전에 먼저 존재하는지 확인한 다음, 메소드가없는 경우 메소드 오류를 렌더링합니다.

해결 방법은 자체 AppError 클래스를 만들고 거기에 "모두 포착"메서드를 처리하는 것일 수 있습니다.

Error handling

1

예에서 요리 책에서 제한된 양의 정보는하지만, CakePHP의는 _call에 의해 are not processed이 방법이라고 ReflectionMethod

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

및 방법을 통해 작업을 호출하기 때문에 작동하지 않습니다.

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