Laravel中间件

来源:互联网 发布:vb 字符串 校验码 编辑:程序博客网 时间:2024/06/05 17:08

最近捣鼓laravel捣鼓的多,感觉不总结一下过阵子又会忘记了,然后又好像没学到什么一样,由于接触到的是新框架,就要多多的理解框架的特性。
这里稍微踩一下,不知道是国内环境问题还是某度问题,laravel相关的知识真心少,真心不多!
这里想写的是对于laravel各个组件的总结。
备注:本篇不是教程!而是总结!没有可以完全照抄的代码,需要理解运作流程再动手写!每个人的环境和流程都不一样,请勿完全照抄。转载的

ORM这一块是相对比较通用的一块,其实关于这个并不是laravel最大的特性,因为很多框架都会有,laravel也有。之前使用这一块的时候,由于文档说明的真心不多,导致使用的时候很多爆炸性报错,然后最后只能慢慢读源码,看一下laravel的设定是怎么样的。首先要说明的是几个属性的问题,如下:
     /**      * 这里设定的是表名,就是本模型在数据库里面所对应的表      */     protected $table = 'user';     /**      * 这里是设定字段,说明什么字段可以赋值      */     protected $fillable = ['user_name', 'user_password'];     /**      * 这里的设定,是当你实例化此模型(意思就是你在数据库里面查出来了某条对应的数据),需要隐藏这个模型某些字段的信息      */     protected $hidden = ['user_password', 'remember_token'];     /**      * 创建时间维护,如果你这里标识为null,就表示不维护创建时间,更新时间是同理的      */     const CREATED_AT = 'create_time';     /**      * 更新时间维护      */     const UPDATED_AT = 'update_time';
这里你很有可能会有这样的需求,就是当你只想让laravel维护你的更新时间,并不想让它维护你的创建时间,或者反过来的情况的时候,你可以设置其中一个时间为null,不对时间进行维护,文档中只说明了,如果开关维护时间,这点比较坑= =,反正我是看完源代码才明白,它里面本身就有这个设定,源码如下:
      /**      * Update the creation and update timestamps.      *      * @return void      */     protected function updateTimestamps()     {         $time = $this->freshTimestamp();         if (! $this->isDirty(static::UPDATED_AT)) {   //这一行代码就对更新时间进行了设定,                                              //如果更新时间不存在,那么就不会设置更新时间,                                              //所以设置UPDATED_AT为null,是可以取消对更新时间的维护的,                                              //下面创建时间是同理的             $this->setUpdatedAt($time);         }         if (! $this->exists && ! $this->isDirty(static::CREATED_AT)) {             $this->setCreatedAt($time);         }     }     /**      * Determine if the model or given attribute(s) have been modified.      *      * @param  array|string|null  $attributes      * @return bool      */     public function isDirty($attributes = null)     {         $dirty = $this->getDirty();         if (is_null($attributes)) {             return count($dirty) > 0;         }         if (! is_array($attributes)) {             $attributes = func_get_args();         }         foreach ($attributes as $attribute) {             if (array_key_exists($attribute, $dirty)) {                 return true;             }         }         return false;     }     /**      * Get the attributes that have been changed since last sync.      *      * @return array      */     public function getDirty()     {         $dirty = [];         foreach ($this->attributes as $key => $value) {             if (! array_key_exists($key, $this->original)) {                 $dirty[$key] = $value;             } elseif ($value !== $this->original[$key] &&                                  ! $this->originalIsNumericallyEquivalent($key)) {                 $dirty[$key] = $value;             }         }         return $dirty;     }
以上是关于模型设置的小总结。这里特别提醒一点,就是关联模型的使用的!在文档中也有提醒,假设你需要使用的关联表数据比较多,请直接贪婪架加载,用with方法!另外,当我们需要进行更多层的关联的时候,可以使用with('xxx.xxx')去关联,来达到这种效果:当前模型->关联模型->关联模型。举个例子:当你需要通过当前的模型来查找用户的信息,而用户的信息的获取需要先关联用户表(假设关联关系user),再关联用户信息表(假设关联关系为info)才能拿到的时候,你可以这样写with('user.info'),这样就能拿到信息了。RequestRequest这个设定极大的方便了对于表单的处理,在这一块功能内,你可以对表单的请求进行控制,当然,可以对整个请求进行控制,权限控制什么的,表单验证什么的。我对于Request的理解,就是这一层可以对表单请求进行验证,以及对此次表单请求的权限等进行验证。
    使用的流程如下:        创建一个Request php artisan make:request MyRequest        在request中加入你的使用逻辑:        <?php        namespace App\\Http\\Requests\\Auth;        use App\\Http\\Requests\\Request;        class MyRequest extends Request        {        /**        * Determine if the user is authorized to make this request.        *        * @return bool        */        public function authorize()        {           //这里写你的权限逻辑,return true or false 代表着请求通过不通过        }        /**        * Get the validation rules that apply to the request.        *        * @return array        */        public function rules()        {           return [               //这里写验证规则           ];        }        }        在控制层的请求实例化它        use App\\Http\\Request\\MyRequest;        public function getIndex(MyRequest $request)        {             //.............你需要做的处理        }
    这样你就能完整使用一个Request了,注意,上面的代码并没有完全实现,只是其中一部分关键代码,请认真理解,而不是直接照抄!    总结:Request极大的方便了对于表单的处理,以前对表单的处理太复杂,验证是表单最麻烦的一块,laravel的这一块极大的方便了开发。具体如何使用验证的,请参考文档Middleware中间件,这是laravel5新增的东西,简直就是666666666666,关于这一块,做权限验证是爆炸性好用,你可以在路由层就直接拦截请求进行处理,实在方便,而且甚至你还可以在请求达到Request层之前,就对数据进行准备!6666。中间件的使用并不难,步骤如下:    php artisan make:middleware MyMiddleware    在Kernel.php内添加这个中间件,还可以设置别名。    在路由层设置中间件。
      Route::put('post/{id}', ['middleware' => 'MyMiddleware', function ($id) {        //        }]);
    这里不对如何使用进行强调了,因为文档已经说得很清楚了,我想说的是另外一件事情,关于resource如何使用中间件的。目前我的使用方式就是将resource放入group来使用。resource本身没有middware的设定。= =在stackoverflow,有鬼佬说可以使用before或者after,具体还没实验,日后补上。Event说到Event组件,不得不说,这一层也可以完美的处理我们的一个事件流程,这里我说一个场景来帮助我们理解这个组件。假设有一个系统,上面如果有用户注册了,需要发送短信以及邮件去通知管理员,那我们最平常的处理方法就是在将用户信息写入数据库之后,再调用发送短信以及邮件函数,去达到通知管理员的目的,但是这样做有存在一个问题,就是假设多个地方需要做这样的通知,那就会有茫茫多的冗余代码,而假设不止要做短信通知和邮件通知那么简单,在短信通知里面还要分对象,不同模板去通知,这样下来的处理就会大爆炸,代码会非常恶心,都是一块一块的冗余。然而这个组件帮我们解决了这样的问题,而且我们还可以十分方便的做多个通知,甚至还能阻止事件冒泡(关于这个后面举一个详细的例子)。关于Event组件如何使用,代码如何写,配置如何写的,这里不做赘述,文档非常清楚。我想通过一个流程来说明这个组件:用户注册->信息写入数据库->Event::fire(new UserRegister())(触发注册事件)->Listenser捕捉并处理事件这一套处理流程能让我们更清晰以及更简洁的去描述整个注册流程,鹅妹子吟。当然我所说的只是一种应用场景,还有更加丰富的用法,我举这个例子,是为了帮助我们更好的去理解Event在我们这整个系统中的应用Polices(策略)关于策略这个组件,最大的好处就是和中间件配合使用了,我对策略这个组件的理解,就是分离函数权限,中间件我用来控制整个控制器的权限,而策略更加细化,可以细化到某个函数,我在某些控制器方法里面进行了过滤,可能我需要的权限检查,不止一层,有好几层,但是只单单针对一个方法的,那么你完全可以使用策略这个组件满足你的需求。策略的使用方法分为以下几个步骤:    创建策略 php artisan make:policy MyPolicy    填写策略
      public function index(User $user,TestModel $test)        {           return $user->can('use_this');        }
    在`Providers/AuthServiceProvider`里面配置$policies    在控制器中使用Gate门面调用。`Gate::denies('index', new TestModel())`    这里给一个注意点,就是策略的使用,第二个参数,只要传模型实例,laravel会根据你的配置,调用策略,前面的参数则是调用策略的方法。

目前只简单的总结这几个组件,接下来有时间,会继续分析这个框架。

原创粉丝点击