Я знаю, что прошло много времени, но у меня тоже была эта проблема, и вот как я ее решаю.
Что касается cakePHP 2.3.5, решение, предоставленное Introgy, не будет работать, так как определение для controller-> dispatch равно
public function dispatch(CakeRequest $request,
CakeResponse $response, $additionalParams = array())
вместо этого вы можете использовать
$this->requestAction
Как поясняется в коде
/**
* Calls a controller's method from any location. Can be used to connect
*controllers together
* or tie plugins into a main application. requestAction can be used to
*return rendered views
* or fetch the return value from controller actions.
*
* Under the hood this method uses Router::reverse() to convert the $url
*parameter into a string
* URL. You should use URL formats that are compatible with
*Router::reverse()
*
* #### Passing POST and GET data
*
* POST and GET data can be simulated in requestAction. Use
*`$extra['url']` for
* GET data. The `$extra['data']` parameter allows POST data simulation.
*
* @param string|array $url String or array-based URL. Unlike other URL
*arrays in CakePHP, this
* URL will not automatically handle passed and named arguments in the
*$url parameter.
* @param array $extra if array includes the key "return" it sets
*theAutoRender to true. Can
* also be used to submit GET/POST data, and named/passed arguments.
* @return mixed Boolean true or false on success/failure, or contents
* of rendered action if 'return' is set in $extra.
*/
Таким образом, пример Introgy будет изменен как:
$login['Login']['username'] = $username;
$login['Login']['password'] = $password;
$url = array('plugin' => 'plug_in_if_there_is',
'controller' =>'your_target_controllers',
'action' =>'actionOnThatController');
$this->requestAction($url, array('data' => $login));
Ваши данные будут доступны в данных цели:
class YourTargetControllerController extends PlugInIfThereIsAppController
{
public function actionOnThatController()
{
$this->data; //will be having ['Login']['username'] = $username
// ['password'] = $password
}
}
и представление для actionOnThatController будет отображено.
EDIT:
Я забыл добавить это, для отображения целевого представления необходимо добавить ключ 'return' в массиве, передаваемом как $ extra , затем необходимо отобразить представление целевого действия, поэтому правильная модификация будет
$login['Login']['username'] = $username;
$login['Login']['password'] = $password;
$url = array('plugin' => 'plug_in_if_there_is',
'controller' =>'your_target_controllers',
'action' =>'actionOnThatController');
$this->requestAction($url, array('return', 'data' => $login));
$this->render('PlugInIfThereIs.YourTargetControllers/action_on_that_controller');