2009-10-02 4 views
27

컨트롤러에서 다른 컨트롤러의 동작을 호출하고 매개 변수로 배열을 전달하는 가장 적합한 방법은 무엇입니까?CakePHP : 배열을 매개 변수로 사용하여 다른 컨트롤러의 동작을 호출하는 가장 좋은 방법은 무엇입니까?

requestAction을 사용하여 다른 컨트롤러 내에서 작업을 호출 할 수 있다는 것을 알고 있습니다. 하지만 요청 액션을 사용하여 매개 변수로 배열을 전달할 수 있습니까?

그리고 아니오, App Controller에 작업을 넣고 싶지 않습니다. 그래서 그것은 저를위한 해결책이 아닙니다.

내가 아는 유일한 방법에 설명 된대로 다른 컨트롤러를로드하는 것입니다 : http://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Configuration.html#importing-controllers-models-components-behaviors-views-and-helpers

그러나 매개 변수로 배열을 전달하면서 바로 다른 컨트롤러의 액션을 호출하는 쉬운 방법은 무엇입니까?

저는 cakePHP에 대한 새로운 소식을 전했습니다. 감사.

+0

어느 cakephp 버전입니까? 그것을 추가 할 수 있습니까? –

답변

24

로직을 두 번째 컨트롤러에서 해당 모델로 옮긴 다음 첫 번째 컨트롤러의 동작에서 이와 같은 작업을 수행하는 것이 적절합니까?

$var = ClassRegistry::init('SecondModel')->myMethod($array); 
$this->set(compact('var')); 

그런 다음 첫 번째 컨트롤러의 동작보기에서 해당 데이터를 사용할 수 있습니다.

항상 컨트롤러 메서드를 브라우저에서 실행하고 내 모델에 많은 로직을 넣고 해당 컨트롤러의 모델이 아닌 모델의 데이터가 필요한 컨트롤러 작업에서 외부 모델 메서드를 호출하고, 그런 다음 내보기에서 해당 데이터를 사용하고 자주 보는 데이터 인 경우 해당 데이터를위한 요소를 만듭니다. 그것은 여러 번 호출

var $controllersArray = array(); 

function _getController($pControllerName){ 
    if (! isset($this->controllersArray[$pControllerName])){ 
     $importRes = App::import('Controller', $pControllerName);// The same as require('controllers/users_controller.php'); 
     $strToEval = "\$controller = new ".$pControllerName."Controller;"; 
     $evalRes = eval($strToEval); 
     if ($evalRes === false){ 
      throw new AppException("Error during eval of given getController '$pControllerName'"); 
     } 
     $controller->constructClasses();// If we want the model associations, components, etc to be loaded 
     $this->controllersArray[$pControllerName] = $controller; 
    } 
    $result = $this->controllersArray[$pControllerName]; 

    return $result; 
} 
+0

좋은 제안. 이전에 컨트롤러에서 컨트롤러로 로직을 분리하는 것에 대해 들었습니다. 하지만 그 개념에 대해서는 아직도 명확하지 않습니다. 어쩌면 내가 케이크에 대한 더 많은 경험을 얻을 때, 나는 더 선명한 그림을 얻을 것이다. 당신의 도움을 주셔서 감사합니다. – Vicer

+4

Neil이 올바른 생각을 가지고 있습니다. 컨트롤러는 들어오는 요청을 처리하고 위임하기위한 것입니다. 비즈니스 논리 또는 물건을 수행하는 코드가 주로 모델에 있어야합니다. –

+1

이것이 정확하다고 생각하지 않습니다. 모델은 데이터베이스 액세스 규칙 용이고 컨트롤러는 다른 모든 것을 처리합니다. 대부분의 경우 응용 프로그램의 대부분은 컨트롤러에 있습니다. "코드가 무엇을 의미하는지 모르겠습니다. 그 물건을 ".. 어쨌든, 모범 사례 IMO 코드를 다시 사용 우선 순위, 그래서 물건을 많이 컨트롤러 콘센트에 배치해야합니다, 모델은 데이터 유효성 검사 등 등 물건에 사용됩니다 이러한 경우는 대개 모델 폴더 내에서 구성 요소로 만들어야하며 이것들을 다시 사용하려면 – Rick

3

CakePHP 1.2.5에서 requestAction()의 두 번째 매개 변수를 통해 다양한 매개 변수 유형을 전달할 수 있어야합니다. 예컨대 : 그런 다음 UsersController의

$this->requestAction('/users/view', array('pass' => array('123'))); 

:

function view($id) { 
    echo $id; // should echo 123 I believe, otherwise try $this->params['pass']. 
} 

대신 위의 '패스'를 사용, 당신은 다른 방법으로 각각 형태/명명 된 매개 변수를 전달하는 '형태'와 '이름'을 시도 할 수 있습니다.

+0

좋아요! 내가 그 일을 할 수 있을지 확신하지 못했습니다. 그것을 시도 할 것이다. 고맙습니다. – Vicer

+0

답장을 보내 주셔서 감사합니다. – Mikelangelo

29

requestAction 메서드를 사용하는 대신 필요한 컨트롤러를 가져 와서 인스턴스화하는 것이 좋습니다. 가져온 컨트롤러 당신을로드하면

http://book.cakephp.org/view/434/requestAction

" 컨트롤러 나 모델에서 사용하는 거의 적절하다"

의 CakePHP 문서는 requestAction에 대해 말한다 매개 변수를 사용하여이 컨트롤러의 모든 메서드를 호출 할 수 있습니다.

<?php 
    //Import controller 
    App::import('Controller', 'Posts'); 

    class CommentsController extends AppController { 
    //Instantiation 
    $Posts = new PostsController; 
    //Load model, components... 
    $Posts->constructClasses(); 

    function index($passArray = array(1,2,3)) { 
     //Call a method from PostsController with parameter 
     $Posts->doSomething($passArray); 
    } 
    } 
?> 
+0

. 네, requestAction에 대한 소문을 들었습니다. 왜 그것이 권장되지 않는지 궁금해. 어쨌든 '가져 오기'는 대체 솔루션입니다. 감사합니다. – Vicer

+0

동의합니다, 이것은 최고입니다, 나는 requestaction을 사용하고 있었지만, 왜 그렇게 좋지 않은지를 보여줍니다. 기본 텍스트가 포함 된 문자열을 전달해야한다면, url 메소드를 사용하기 때문에 제대로 작동하지 않을 것입니다. 특수 문자를 사용할 수없고 문자열에 "/"를 사용하면 htis가 별도의 변수로 구분합니다. – Rick

+0

하나의 컨트롤러에서 다른 컨트롤러를 사용하면 대용량 응용 프로그램에서 자주 발생합니다. Cake가 requestAction 이외의 표준 단일 명령을 구현하면 문서 상태에서도 성능이 좋지 않을 것이라는 뉴스가 있습니까? – Ryan

-1

나는 나의의 AppController 클래스에 다음 방법 및 변수를 넣어.X :

<?php 
App::uses('AppController', 'Controller'); 
App::uses('PostsController', 'Controller'); 

class CommentsController extends AppController { 

    public function index($parameter = null){ 
     //Instantiate 
     $Posts = new PostsController(); 
     //Load model, components... 
     $Posts->constructClasses(); 

     //Call a method of Posts passing a parameter 
     $Posts->aMethod($parameter); 
    } 
} 
+0

이 코드를 테스트 한 것은 불가능합니다. 구문 오류가 발생합니다 .. Eval .. :? 확실한? –

3

CakePHP의 2의 경우 캐시를, 그래서

관련 문제