如何将HTTP Cookie发送到另一个ZF2控制器?

时间:2016-02-23 12:13:12

标签: php cookies zend-framework2

我有两个控制器。其中一个称为OAMLController,另一个称为LoginController。我想在OAMLController中设置HTTP Cookie,然后拨打LoginController并在此控制器中读取它。

我知道如何在PHP中执行此操作,但我不知道如何在Zend Framework 2中执行此操作。

PHP(OAML.php):

setcookie("_ga", "GA1.2.1622977711.1433494392", 0, "/", "http://gnsys.local");
setcookie("_gat", "1", 0, "/", "http://gnsys.local");
header("Location: http://gnsys.local/publico/login.php");

PHP(login.php):

$cookie = "";

foreach (getallheaders() as $name => $value) {
    echo "$name: $value</br>";

    if ($name == "Cookie")
        $cookie = $value;
}

我试图按照ZF2教程进行操作但是很混乱。

更多问题:

我已使用$ this-&gt; redirect() - &gt; toUrl($ url)重定向到其他控制器。

    $cookie = new \Zend\Http\Header\SetCookie("param1", "Hola", null, null, "http://gnsys.local", null, null, null, null);
    $this->getResponse()->getHeaders()->addHeader($cookie);

    return $this->redirect()->toUrl("http://gnsys.local/publico/login");

因为如果我重定向:

    $controllerName = "LoginController";
    $actionName = "index";
    return $this->redirect()->toRoute(
            "publico", 
            array(
                "controller"    =>  $controllerName,
                    "action"    =>  $actionName
            ));

我始终可以访问http://gnsys.local/publico而不是我想要的地方http://gnsys.local/publico/login

另一个问题,在LoginController中我无法读取cookie。如果我通过Firebug检查cookie,我可以看到我在“.gnsys.local”域中创建了cookie而不是在“gnsys.local”域中创建了cookie。

enter image description here

为什么会这样?如果我使用toRoute或toUrl进行重定向,我会在同一个域“.gnsys.local”上创建cookie,而不是在“gnsys.local”中创建。

module.config:

    'router' => array(
    'routes' => array(
        // The following is a route to simplify getting started creating
        // new controllers and actions without needing to create a new
        // module. Simply drop new controllers in, and you can access them
        // using the path /application/:controller/:action
         'publico' => array(
            'type'    => 'Literal',
            'options' => array(
                'route'    => '/publico',
                'defaults' => array(
                    '__NAMESPACE__' => 'Publico\Controller',
                    'controller'    => 'Index',
                    'action'        => 'index',
                ),
            ),
            'may_terminate' => true,
            'child_routes' => array(
                'default' => array(
                    'type'    => 'Segment',
                    'options' => array(
                        'route'    => '/[:controller[/:action]]',
                        'constraints' => array(
                            'controller' => '[a-zA-Z][a-zA-Z0-9_-]*',
                            'action'     => '[a-zA-Z][a-zA-Z0-9_-]*',
                        ),
                        'defaults' => array(
                        ),
                    ),
                ),
            ),
        ),
    ),
),

更新2:

最后,重定向与Jangya Satapathy的解决方案完美配合。但我有一个新问题,这是我无法读取cookie,因为域名不正确。使用这些代码,我创建一个域名为“.gnsys.local”的cookie,而不是域名“gnsys.local”

    $cookie = new \Zend\Http\Header\SetCookie("param1", "Hola", null, null, "http://gnsys.local", null, null, null, null);
    $this->getResponse()->getHeaders()->addHeader($cookie);
    $controllerName = "login";
    $actionName = "index";
    return $this->redirect()->toRoute(
            "publico/default", 
            array(
                "controller"    =>  $controllerName,
                    "action"    =>  $actionName
            )); 

所以,当我尝试写入cookie“param1”的值时,我有下一个错误:

  

注意:未定义的索引:/var/www/html/gnsys/module/Publico/src/Publico/Controller/LoginController.php中的param1

如果我们用firebug检查cookie的值,我们有下一个屏幕截图:

enter image description here

我做错了什么?

更新3:

我不明白发生了什么,但getCookie为空。

getcookie IS NULL

print_r($ this-&gt; getRequest() - &gt; getCookie()); 不会写任何内容。

        $getcookie = $this->getRequest()->getCookie(); // returns object of Zend\Http\Header\Cookie

    if ($getcookie != null)
        echo "getcookie is NOT NULL";
    else 
        echo "getcookie IS NULL";

    print_r($this->getRequest()->getCookie());

    return new ViewModel();

已更新4:

我找到了cookie,但我找不到它的价值。为了找到cookie,我必须指出我将要阅读它的路径。

        $cookie = new \Zend\Http\Header\SetCookie("param1", "Hola", 0, "/publico/login/index", "gnsys.local");
    $this->getResponse()->getHeaders()->addHeader($cookie);

    $controllerName = "login";
    $actionName = "index";
    return $this->redirect()->toRoute(
            "publico/default", 
            array(
                "controller"    =>  $controllerName,
                    "action"    =>  $actionName
            )); 

而且,现在我有了退出......

getcookie不是空的

Zend \ Http \ Header \ Cookie对象([encodeValue:protected] =&gt; 1 [storage:ArrayObject:private] =&gt;数组([zdt-hidden] =&gt; 0))

如果我尝试通过

检索cookie的值
$cookie = $getcookie->param1;

我有下一个错误......

  

注意:未定义的索引:第84行的/var/www/html/gnsys/module/Publico/src/Publico/Controller/LoginController.php中的param1

如果我尝试从$ getcookie获取所有值

        foreach ($getcookie as $key => $value){
        echo "Key: " . $key . " Value: " . $value . "<br />";
    }

我已经......

键:zdt-hidden值:0

更新5:

我在这里什么都不懂。我不是用这些代码创建cookie的!

        $cookie = new \Zend\Http\Header\SetCookie("param1", "Hola", 0, "/", "http://gnsys.local");
    $this->getResponse()->getHeaders()->addHeader($cookie);

    $controllerName = "login";
    $actionName = "index";
    return $this->redirect()->toRoute(
            "publico/default", 
            array(
                "controller"    =>  $controllerName,
                    "action"    =>  $actionName
            )); 

使用firebug检查cookie我们看不到cookie。

enter image description here

1 个答案:

答案 0 :(得分:1)

在您的Cookie设置操作中:

   Public function cookiesetAction(){
      $cookie = new \Zend\Http\Header\SetCookie($name, $value, $expires, $path, $domain, $secure, $httponly, $maxAge, $version);
      $this->getResponse()->getHeaders()->addHeader($cookie);
      return $this->redirect()->toRoute('cookieget'); //to your login controller
   }

在你的cookie获取动作中:

   public function cookiegetAction(){
      $getcookie = $this->getRequest()->getCookie(); // returns object of Zend\Http\Header\Cookie
      $getcookie->name1;    // value1
      $getcookie->name2;    // value2
      return new ViewModel();
   }

关于cookies in ZF2的问题。

回答更新

添加子路线,然后是主路线。

return $this->redirect()->toRoute('publicio/default',array(
                    'controller'=>$controllername,
                    'action'=>$actioname
                 ));