将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/的网站。虽然可以在个人电脑上查看,但是主要是为了手机设计的。如果您愿意,可以用它来打发时间,并给我一些反馈意见,我会很高兴的。