Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cakephp在重定向后将数据传递给视图_Php_Cakephp_Redirect_Cakephp 1.3 - Fatal编程技术网

cakephp在重定向后将数据传递给视图

cakephp在重定向后将数据传递给视图,php,cakephp,redirect,cakephp-1.3,Php,Cakephp,Redirect,Cakephp 1.3,当数据设置后出现重定向到另一页时,是否可以显示我通过$this->set()传递的数据 谢谢, EL您使用标题('Location:…')重定向?这会使浏览器启动一个新请求。触发重定向的脚本可能与处理新请求的脚本相同,但是现在有两个实例正在运行(或者第一个实例可能已经退出),并且每个实例都无法访问另一个实例的变量。您可以将数据存储在任何位置(会话、共享内存等),或者以与第一个请求相同的方式重新构建数据,或者不发出第二个请求,而是在内部重定向到另一个操作/视图。使用标题('Location:…')

当数据设置后出现重定向到另一页时,是否可以显示我通过
$this->set()
传递的数据

谢谢,
EL

您使用
标题('Location:…')重定向
?这会使浏览器启动一个新请求。触发重定向的脚本可能与处理新请求的脚本相同,但是现在有两个实例正在运行(或者第一个实例可能已经退出),并且每个实例都无法访问另一个实例的变量。您可以将数据存储在任何位置(会话、共享内存等),或者以与第一个请求相同的方式重新构建数据,或者不发出第二个请求,而是在内部重定向到另一个操作/视图。

使用
标题('Location:…')重定向。
?这会使浏览器启动一个新请求。触发重定向的脚本可能与处理新请求的脚本相同,但是现在有两个实例正在运行(或者第一个实例可能已经退出),并且每个实例都无法访问另一个实例的变量。您可以将数据存储在任何位置(会话、共享内存等),或者以与第一个请求相同的方式重新构建数据,或者不发出第二个请求,而是在内部重定向到另一个操作/视图。

最简单的方法可能是将数据存储在会话中:

$this->Session->write('key', 'value');
并在稍后阅读:

$this->Session->read('key');

最简单的方法可能是在会话中存储数据,方法是:

$this->Session->write('key', 'value');
并在稍后阅读:

$this->Session->read('key');

您可以使用上面提到的会话,但是如果不想在会话中保存数据,可以使用dispatcher对象,下面是一个示例。我觉得它很有用

    $login['Login']['username'] = $username;
    $login['Login']['password'] = $password;

    $this->autoRender = false; 
    $d = new Dispatcher(); 
    $d->dispatch( 
        array("controller" => "users", "action" => "login"), 
        array("data" => $login) 
    );                  

您可以使用上面提到的会话,但是如果不想在会话中保存数据,可以使用dispatcher对象,下面是一个示例。我觉得它很有用

    $login['Login']['username'] = $username;
    $login['Login']['password'] = $password;

    $this->autoRender = false; 
    $d = new Dispatcher(); 
    $d->dispatch( 
        array("controller" => "users", "action" => "login"), 
        array("data" => $login) 
    );                  

我知道这已经很久了,但我也有这个问题,这就是我解决它的方法。 至于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  
  }
}
此时将呈现控制器上的ActionOnAtController视图

编辑: 我忘了添加这一点,对于要呈现的目标视图,有必要在作为$extra传递的数组中添加键“return”,然后您必须呈现目标操作的视图,因此需要进行完全正确的修改

$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');

我知道这已经很久了,但我也有这个问题,这就是我解决它的方法。 至于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  
  }
}
此时将呈现控制器上的ActionOnAtController视图

编辑: 我忘了添加这一点,对于要呈现的目标视图,有必要在作为$extra传递的数组中添加键“return”,然后您必须呈现目标操作的视图,因此需要进行完全正确的修改

$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');

你想完成什么?不知何故,由于重定向,显示用户永远看不到的数据没有多大意义……我想在用户被重定向到的页面上显示数据,您想完成什么?不知何故,由于重定向,显示用户永远看不到的数据没有多大意义……我想在用户重定向到的页面上显示数据