4

Symfony 1.4フレームワークを使用して、変数をCookieに保存しようとしています。これが私のsfAction派生クラスのスニペットです:

class productActions extends sfActions
{
    public function preExecute()
    {
        $this->no_registration_form = true;
        $request = $this->getRequest();

        $cookie_value = $request->getCookie('pcatid');
        $this->prod_category_id = (!isset($cookie_value)) ? 0 : $cookie_value;

        $cookie_value = $request->getCookie('pitid');
        $this->product_item_id = (!isset($cookie_value)) ? 0 : $cookie_value;

        $cookie_value = $request->getCookie('pcatnm');
        $this->product_category_name = (!isset($cookie_value)) ? null : base64_decode ($cookie_value);

        $cookie_value = $request->getCookie('pipnm');
        $this->product_info_partial_name = (!isset($cookie_value)) ? null : $cookie_value;

        $cookie_value = $request->getCookie('protl');
        $this->title = (!isset($cookie_value)) ? null : base64_decode ($cookie_value);
    }

    public function postExecute()
    {
        $expire = time()+2592000;
        $path = '/products/';
        $response = $this->getResponse();

        $value = $this->prod_category_id;
        if (isset($value))
            $response->setCookie('pcatid', $value, $expire, $path);

        $value = $this->product_item_id;
        if (isset($value))
            $response->setCookie('pitid', $value, $expire, $path);

        $value = base64_encode($this->product_category_name);
        if (isset($value))
            $response->setCookie('pcatnm', $value, $expire, $path);

        $value = $this->product_info_partial_name;
        if (isset($value))
            $response->setCookie('pipnm', $value, $expire, $path);

        $value = base64_encode($this->title);
        if (isset($value))
            $response->setCookie('protl', $value, $expire, $path);        
    }

    public function executeIndex(sfWebRequest $request)
    {
        // uses defaults or settings stored in cookies
    }

    ... // other functions that set the required instance member fields
}

sfWebResponseデバッグセッションでコードをステップ実行しましたが、Cookieの値が変数で照合されていることがわかります(ただし、Cookieは設定されていません)。これはpreExecute()関数で示されています。取得されたすべてのCookieの値はnullです。

なぜこうなった?

4

2 に答える 2

4

新しい symfony プロジェクトで簡単なテストを行いました。

preExecute&をコピーして貼り付けpostExecute、空のテンプレートで簡単なアクションを追加しました。

public function executeIndex(sfWebRequest $request)
{
  var_dump($_COOKIE);

  $this->prod_category_id          = 123;
  $this->product_item_id           = 456;
  $this->product_category_name     = 789;
  $this->product_info_partial_name = 159;
  $this->title                     = 753;
}

そして、この行$path = '/products/';を に変更しました$path = '/';

最初の試行では、Cookie がないため、何もありません。

array
  empty

更新すると、Cookie が定義されており、次のように表示されます。

array
  'symfony' => string 'c04khrspp5fmg3sh797uq9c9s1' (length=26)
  'pcatid' => string '123' (length=3)
  'pitid' => string '456' (length=3)
  'pcatnm' => string 'Nzg5' (length=4)
  'pipnm' => string '159' (length=3)
  'protl' => string 'NzUz' (length=4)

コードで間違っている可能性がある/products/のは、Cookie パスを に設定していることです。つまり、これらの Cookie にアクセスできるのhttp://exemple.com/products/....

でこれらの Cookie にアクセスしようとしてhttp://exemple.com/も、何も得られません。

これで問題が解決しない場合は、定義された uri (少なくともドメインの後の部分) で問題が発生した場所からのアクションの例を貼り付けていただけますか。

于 2013-02-12T13:50:14.060 に答える
1

メソッドに $path を渡すと、同じ URL から Cookie にアクセスする場合にのみ Cookie を使用できます。

すべてのサイトから Cookie にアクセスする場合は、パスに何も渡さないでください。

$response = $this->getResponse();
$response->setCookie('stack', 'This cookie is readable from all site for the next 60 segs.', time() + 60);
$response->setCookie('overflow', 'This cookie is readable from mypage for the next 60 segs.', time() + 60, 'http://mysite.com/mypage');
于 2013-02-12T15:42:35.930 に答える