使用POST数据的CakePHP 2.4重定向()?

使用POST数据的CakePHP 2.4重定向()?,php,cakephp,redirect,post,cakephp-2.4,Php,Cakephp,Redirect,Post,Cakephp 2.4,我希望通过控制器方法将用户发送到另一个页面。另一个页面需要POST数据 通常,使用postLink()访问页面。有没有一种方法可以在控制器中使用它,也许是使用redirect()?最好的解决方案是使用javascript重定向 但是如果你想要更多的蛋糕,我给你一些工具 -它允许使用参数执行desire的控制器方法,如果您传递“return”,它将返回该操作的完整视图输出 //very useful in views $result = $this->requestAction('Cont

我希望通过控制器方法将用户发送到另一个页面。另一个页面需要POST数据


通常,使用postLink()访问页面。有没有一种方法可以在控制器中使用它,也许是使用redirect()?

最好的解决方案是使用javascript重定向

但是如果你想要更多的蛋糕,我给你一些工具 -它允许使用参数执行desire的控制器方法,如果您传递“return”,它将返回该操作的完整视图输出

//very useful in views
$result =  $this->requestAction('Controller/method', 
       array('return','user_id'=>$userId)
); 
可通过请求参数在控制器中访问参数

$this->request->params['user_id']

长话短说,用POST数据和重定向来模拟HTML表单并不容易,您需要设置一组包含数据的隐藏变量,并通过Javascript自动将表单发布到目标

我要做的是将需要POST变量的函数中的处理功能去掉,并将其设置为泛型,以便可以从两个函数中调用它

考虑一下这个粗略的例子:

public function myPostDataAction() {
    $name = $_POST['name'];
    $age = $_POST['age'];
    // do stuff
    echo $name . ', ' . $age;
}
假设这是您在本场景中试图将数据发布到的操作,但您不能这样做,因为如果没有上面提到的场景,您无法通过重定向模拟这些$u post变量。您可以这样做:

public function myPostDataAction() {
    $name = $_POST['name'];
    $age = $_POST['age'];
    // call common function
    echo $this->getMyResults($name, $age);
}

// accessible from inside the controller only
private function getMyResults($name, $age) {
    return $name . ', ' . $age;
}
现在,您还可以通过向其中传递常规旧变量来使用
getMyResults()
功能:

public function myProblemFunction() {
    $name = 'John';
    $age = 15;
    echo $this->getMyResults($name, $age);
}
现在,很明显,您不会直接从控制器操作输出任何类似的内容,您会将其设置为视图等,但这是一个如何将功能集中到多个位置的示例


对于免责声明,这种事情正是<强>模型< /强>所适用的,并且你绝对应该考虑将这种函数放入模型而不是控制器——这取决于你的具体应用。

<>用CaKEPHP 2。x使用这个:

$this->autoRender = false;
$request = new CakeRequest(Router::url(array('controller' => 'mycontroller','action' => 'my_action')));
$request->data('dataIndex','value');
$response = new CakeResponse();
$d = new Dispatcher();
$d->dispatch(
    $request,
    $response
);
但它不会重定向,而是分派到另一个控制器/操作,因此如果继续/controller/oldaction,它将保持当前url(不执行HTTP重定向)

您仍然可以使用javascript更改url
请参阅:

有点老了,但仍然没有答案,所以。。。 答案是否定的,也是肯定的。

  • 不,没有直接方法,因为无法使用
    redirect()
    函数传递发布的数据。
    您可以使用
    requestAction()
    ,因为您可以按POST()传递数据。
    在这种情况下,您将传递一个url,然后传递一个包含键数据和发布数据的数组,类似于

    $this->requestAction($url,array('data'=>this->data))

    或者如果您更喜欢

    $this->requestAction($url,array('data'=>$this->request->data))

    requestAction()
    的问题在于,从环境角度看,结果就像是在当前控制器中而不是在目标中生成请求操作的页面,结果不是很令人满意(至少对于我来说,组件的性能不是很好),所以仍然不是。

  • …但是,您可以使用
    会话
    组件执行类似的操作。
    我通常就是这样做的。流程如下:

    查看A=>通过
    postLink()
    到控制器中的操作=>
    =>A控制器
    请求->数据
    到会话变量=>
    =>通过
    重定向()

    =>设置B控制器
    请求->来自会话变量的数据=>
    =>处理B控制器中的数据操作=>查看B

因此,在A控制器中,假设在
sentToNewPage()
操作中,您将有类似

//Action in A controller
public function sentToNewPage()
{
 $this->Session->write('previousPageInfo', $this->request->data);
 $url = array('plugin' => 'your_plugin', 'controller'=>'B',
              'action'=>'processFromPreviousPage');
 $this->redirect($url);
}
在B控制器中:

//Action in B controller
public function beforeFilter()
{//not completelly necessary but handy. You can recover directly the data
 //from session in the action 
 if($this->Session->check('previousPageInfo'))
   {$this->data = $this->Session->read('previousPageInfo')};
 parent::beforeFilter();
}
public function processFromPreviousPage()
{
 //do what ever you want to do. Data will be in $this->data or
 // if you like it better in $this->request->data
 $this->processUserData($this->request->data);
  //...
}

用第一个控制器呈现第二个页面的视图怎么样?用户不关心url,他们只关心浏览器中显示的内容。