Laravel中间件

最近捣鼓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'),这样就能拿到信息了。

Request
Request这个设定极大的方便了对于表单的处理,在这一块功能内,你可以对表单的请求进行控制,当然,可以对整个请求进行控制,权限控制什么的,表单验证什么的。我对于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会根据你的配置,调用策略,前面的参数则是调用策略的方法。

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值