将Laravel4的Cookie类封装起来,使其更易于使用的讨论

目标

Laravel4的Cookie类,接口非常易懂和好用,

    • 値をすべてCookieに埋め込む(ある意味当然だけど)

 

    しかもその時暗号化する

因此,很容易超过RFC的4KB上限(而且开发者不会通过抛出异常等方式告知),所以我尝试着将Cookie类进行封装,并实现一个容量无限的HugeCookie类。

前提 tí)

    • Laravel4.1 on PHP5.4/5.5

 

    • MongoDB 2.4.9

 

    jenssegers / Laravel-MongoDB を導入済み(https://github.com/jenssegers/Laravel-MongoDB)

实施

由于它是一个Wrapper类,尝试将其实现为模型。一切都在一个文件中完成。

巨型饼干模型/HugeCookie.php

<?php
// see : http://laravel.com/docs/requests#cookies

class HugeCookie extends Moloquent {
    // see https://github.com/jenssegers/Laravel-MongoDB.
    protected $collection = 'huge_cookies';
    protected $softDelete = false;
    protected $guarded = array();

    //
    const real_cookie_name = 'hgc';


    /**
     * Retrieve or New HugeCookie (Moloquent)  Object.
     *
     * @return HugeCookie
     */
    static function me(){
        $huge_cookie_id = Cookie::get(self::real_cookie_name, null);
        if(empty($huge_cookie_id) || is_null(self::find($huge_cookie_id))){
            $huge_cookie = new self;
        }else{
            $huge_cookie = self::find($huge_cookie_id);
        }
        return $huge_cookie;
    }


    /**
     * Create a new cookie instance.
     *
     * @param  string  $name
     * @return
     */
    static function get($name, $default_value){
        $huge_cookie = self::me();
        return !empty($huge_cookie->$name)? $huge_cookie->$name: $default_value;
    }

    /**
     * Create a new cookie instance.
     *
     * @param  string  $name
     * @param  mix  $value
     * @param  int     $minutes
     * @param  string  $path
     * @param  string  $domain
     * @param  bool    $secure
     * @param  bool    $httpOnly
     * @return \Symfony\Component\HttpFoundation\Cookie
     */
    static function make($name, $value, $minutes = 60, $path = null,
                         $domain = null, $secure = false, $httpOnly = true){
        $huge_cookie = self::me();
        $huge_cookie->$name = $value;
        $huge_cookie->save();

        return Cookie::make(self::real_cookie_name, $huge_cookie->_id, $minutes, $path, $domain, $secure, $httpOnly);
    }

    /**
     * Create a cookie that lasts "forever" (five years).
     *
     * @param  string  $name
     * @param  mix  $value
     * @param  string  $path
     * @param  string  $domain
     * @param  bool    $secure
     * @param  bool    $httpOnly
     * @return \Symfony\Component\HttpFoundation\Cookie
     */
    static function forever($name, $value, $path = null,
                            $domain = null, $secure = false, $httpOnly = true){
        $minutes = 2628000; // Cookie::forever() と同様に5年
        return self::make($name, $value, $minutes, $path, $domain, $secure, $httpOnly);
    }

    /**
     * Expire the given cookie.
     *
     * @param  string  $name
     * @param  string  $path
     * @param  string  $domain
     * @return \Symfony\Component\HttpFoundation\Cookie
     */
    static function forget($name, $path = null, $domain = null){
        return Cookie::make($name, null, -2628000, $path, $domain);
    }

    /**
     * Queue a cookie to send with the next response.
     *
     * @param  dynamic
     * @return void
     */
    static function queue($name, $value, $minutes = 60){
        $huge_cookie = self::me();
        $huge_cookie->$name = $value;
        $huge_cookie->save();
        Cookie::queue(self::real_cookie_name, $huge_cookie->_id, $minutes);
    }

}

有一点解释

大致上说,我正在做的是

    • データ部の保存先をcookieではなくMongoDBにしている。(see: http://laravel.com/api/class-Illuminate.Cookie.CookieJar.html)

で、バンドル版のCookieにはその参照キー(MongoDBのObjectID)のみを値として保存するようにする。
インターフェイスはバンドル版のCookieを踏襲しています。(が今回私が必要だったものしか実装してません)
extends の Moloquent というのは Laravel-MongoDB のエイリアスです。(https://github.com/jenssegers/Laravel-MongoDB#optional-alias )

使用方法

只要模仿列在其中的使用示例,您不会对使用方法感到困惑。
只需将”Cookie”替换为”HugeCookie”即可。

HugeCookie的示范用法

$response = Response::make('Hello World');
$response->withCookie(HugeCookie::make('huge_data', 'Some Huge Data', $minutes));
$huge_data = HugeCookie::get('huge_data');

这次的实现是基于Laravel-MongoDB的依赖,但在其他驱动程序或存储方案中,也可以实现类似的功能。

以上就是。玩得开心使用Laravel吧!


通知

其实这是一个宣传,这篇文章也与其相关。

2ch汇总巡长β

我做了一个名为http://j.inthemaking.net/的网站。虽然可以在个人电脑上查看,但是主要是为了手机设计的。如果您愿意,可以用它来打发时间,并给我一些反馈意见,我会很高兴的。

广告
将在 10 秒后关闭
bannerAds