2009-10-02 19 views
27

En un controlador, ¿cuál es la forma más adecuada de llamar a la acción de otro controlador y también pasar una matriz como parámetro?CakePHP: ¿la mejor manera de llamar a una acción de otro controlador con matriz como parámetro?

Sé que puede usar requestAction para llamar acciones dentro de otros controladores. Pero, ¿es posible pasar matrices como parámetros mediante la acción de solicitud?

Y no, no quiero poner la acción en el controlador de la aplicación. Entonces esa no es una solución para mí.

La única forma que conozco es cargar el otro controlador como se explica en: http://book.cakephp.org/1.3/en/The-Manual/Developing-with-CakePHP/Configuration.html#importing-controllers-models-components-behaviors-views-and-helpers

Pero hay una manera más fácil simplemente llamar a la acción de otros controladores al pasar una matriz como parámetro?

Soy nuevo en cakePHP por lo que cualquier sugerencia es apreciada. Gracias.

+0

¿Qué versión de cakephp? podrías agregarlo? –

Respuesta

24

sería apropiado para que se mueva la lógica del segundo controlador en su modelo, a continuación, hacer algo como esto en la acción de su primer controlador?

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

Luego, en la vista para la acción del primer controlador, puede usar esa información.

Siempre trato de mantener los métodos del controlador a las acciones que puede realizar a través del navegador, pongo tanta lógica en mis modelos, llamo a métodos de modelos extranjeros desde acciones de controladores que necesitan datos de modelos que no son el modelo para ese controlador luego use esos datos en mis vistas, y si son datos que se ven con frecuencia, creo un elemento para ellos.

+0

buena sugerencia. He escuchado sobre la separación de la lógica del controlador al modelo antes. pero todavía no está claro sobre ese concepto. tal vez a medida que gane más experiencia con el pastel, tenga una idea más clara. Gracias por tu ayuda. – Vicer

+4

Neil tiene la idea correcta. Los controladores están destinados a manejar y delegar las solicitudes entrantes. La lógica empresarial, o el código que hace las cosas, debe estar principalmente en sus modelos. –

+1

No creo que esto sea correcto, los modelos son para las reglas de acceso a la base de datos, los controladores manejan todo lo demás, la mayor parte de una aplicación estaría en el controlador, en la mayoría de los casos ... No sé a qué te refieres con "código" eso hace cosas "... de todos modos, la mejor práctica de la OMI es hacer que la reutilización de códigos sea una prioridad, por lo que idealmente se deben colocar muchas cosas en los componentes de los controladores, el modelo solo se usa para cosas como validación de datos, etc. estos casos generalmente también deben hacerse en componentes (dentro de la carpeta del modelo) para su reutilización también – Rick

3

A partir de CakePHP 1.2.5, debe poder pasar varios tipos de parámetros a través del segundo parámetro en requestAction(). ej .:

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

Luego, en el UsersController:

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

En lugar de utilizar 'pasar' por encima, se puede tratar alternativamente 'forma' y 'llamada' para pasar de forma/parámetros nombrados respectivamente.

+0

¡Genial! no estaba seguro de si puedo hacer eso. Lo intentaré Gracias. – Vicer

+0

puedo confirmar que esto funciona – Mikelangelo

29

No aconsejaría usar el método requestAction, sino importar, y crear una instancia del controlador necesario.

CakePHP doc dice acerca requestAction que:

"rara vez es apropiada para su uso en un controlador o modelo "

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

Una vez que ha importado y se carga el controlador que puede llamar a cualquier método de este controlador con sus parámetros.

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

gracias por su respuesta. sí, he escuchado ese rumor sobre requestAction. Me pregunto por qué no se fomenta. De todos modos, 'Importar' es una solución alternativa, gracias. – Vicer

+0

Estoy de acuerdo, esto es lo mejor, he estado usando petición de petición pero muestra rápidamente por qué no es bueno, si necesita pasar una cadena que contiene algo más que texto básico no funcionará bien, ya que está usando el método url no puede tener caracteres especiales y si usa "/" en una cadena htis la dividirá en variables separadas – Rick

+0

Usar una acción de controlador en otra es bastante común en una aplicación grande. ¿Hay alguna noticia sobre si Cake implementará un único comando estándar para hacer otra cosa que requestAction que incluso la documentación indique que tiene un rendimiento deficiente. – Ryan

-1

que he puesto en mi clase AppController el siguiente método y variable, por lo que es cachés en caso de múltiples llamadas

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

Es imposible que haya probado este código. Sí arroja errores de sintaxis. Eval ..:? ¿Por supuesto? –

3

CakePHP 2.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); 
    } 
} 
Cuestiones relacionadas