Cookie

config/session.php 檔案中設定 session cookie 的網域,將網址前方的子網域去除,例如 laravel5-book.kejyun.comabout.kejyun.com 的網域,就僅保留 .kejyun.com 設定就好,這樣不同子網域的 cookie 就能夠互相存取。

return [
    /*
    |--------------------------------------------------------------------------
    | Session Cookie Domain
    |--------------------------------------------------------------------------
    |
    | Here you may change the domain of the cookie used to identify a session
    | in your application. This will determine which domains the cookie is
    | available to in your application. A sensible default has been set.
    |
    */

    'domain' => env('SESSION_DOMAIN', '.kejyun.com'),
];
移除 EncryptCookies Middleware

所有透過 Laravel 設定的 Cooke 都會透過 APP_KEY 去進行加密,但是 JavaScript 在設定 Cookie 時,並沒有經過加密的程序,所以若 Laravel 要取得 JavaScript 設定的 Cookie,經過解密後會無法正確解析。

可以在 app/Http/Kernel.php 檔案中,將 \App\Http\Middleware\EncryptCookies::class 的 Middleware 註解,這樣就可以讓 Laravel 的 Cookie 資料不需要加解密,這樣就可以正常的取的透過 JavaScript 設定的 Cookie 了。

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            // \App\Http\Middleware\EncryptCookies::class,
            // *** 以下省略 ***
        ],
    ];
}

\App\Http\Middleware\EncryptCookies::class 檔案中,有 $except 變數,可以指定哪些鍵值不要加密,設定完後,就可以順利地讀取到未加密的 Cookie 資料了!

class EncryptCookies extends BaseEncrypter
{
    /**
     * The names of the cookies that should not be encrypted.
     *
     * @var array
     */
    protected $except = [
        'js_cookie_key',
    ];
}
cookie_minutes = 3;
Cookie::queue('cookie_name', 'cookie_value', $cookie_minutes);
Cookie::get('cookie_name');

在設定完 Cookie 後,不可以預先在回傳 response 之前就使用 echovar_dump 把資料印出來,因為這樣會預先送 header,導致 Cookie 無法正常設定。

Symfony\Component\HttpFoundation\Response 檔案中,可以看到 sendHeaders() 函數 有定義在使用者有送 Header 後,Laravel 會停送自己的 Header 去設定 Cookie

namespace Symfony\Component\HttpFoundation;

/**
 * Response represents an HTTP response.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Response
{
    /**
     * Sends HTTP headers.
     *
     * @return $this
     */
    public function sendHeaders()
    {
        // headers have already been sent by the developer
        if (headers_sent()) {
            return $this;
        }
    }
}

KeJyun 最新新書推薦
Laravel 5 for beginner 新手道場:優雅運用框架快速開發 PHP 網站
Laravel框架开发详解:从零基础到运用框架快速开发PHP网站

Laravel 是 PHP 的框架(Framework),提供了很多開發網站或 API 所需的工具及環境,經過簡單的設定就可以完成資料的處理及顯示,使開發者可以很優雅且快速的開發出各個不同的產品。本書適合有 PHP 基礎的人,但不知道要怎麼選擇框架,或者不用框架的人也能夠明白它的好處。

雖然 WordPress 也能夠架站,但如果有客製化需求,要開發各式各樣的網站,或提供 App 使用的 API,如此一來你只能選擇用框架,而 Laravel 是目前最受歡迎的。

本書將解說為什麼要使用框架,以及理解框架的優缺點後,要怎麼選擇框架,並用框架快速建構一個網站。除非必要,否則書中會避免專業技術用語,盡量使用最生活化易懂的例子及語氣,讓大家更容易進入 Laravel 的世界。

購書連結

購書連結

results matching ""

    No results matching ""