Laravel 组件小总结

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

  1. 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'),这样就能拿到信息了。

  1. 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的这一块极大的方便了开发。具体如何使用验证的,请参考文档
  1. 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,具体还没实验,日后补上。
  1. Event
    说到Event组件,不得不说,这一层也可以完美的处理我们的一个事件流程,这里我说一个场景来帮助我们理解这个组件。
    假设有一个系统,上面如果有用户注册了,需要发送短信以及邮件去通知管理员,那我们最平常的处理方法就是在将用户信息写入数据库之后,再调用发送短信以及邮件函数,去达到通知管理员的目的,但是这样做有存在一个问题,就是假设多个地方需要做这样的通知,那就会有茫茫多的冗余代码,而假设不止要做短信通知和邮件通知那么简单,在短信通知里面还要分对象,不同模板去通知,这样下来的处理就会大爆炸,代码会非常恶心,都是一块一块的冗余。然而这个组件帮我们解决了这样的问题,而且我们还可以十分方便的做多个通知,甚至还能阻止事件冒泡(关于这个后面举一个详细的例子)。
    关于Event组件如何使用,代码如何写,配置如何写的,这里不做赘述,文档非常清楚。我想通过一个流程来说明这个组件:
用户注册->信息写入数据库->Event::fire(new UserRegister())(触发注册事件)->Listenser捕捉并处理事件

这一套处理流程能让我们更清晰以及更简洁的去描述整个注册流程,鹅妹子吟。当然我所说的只是一种应用场景,还有更加丰富的用法,我举这个例子,是为了帮助我们更好的去理解Event在我们这整个系统中的应用

  1. 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会根据你的配置,调用策略,前面的参数则是调用策略的方法。

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

如果你有什么问题,可以在文章下留言,进行交流。以下推荐了两个网站是关于laravel文档的,你可以在里面获取laravel相关的知识。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容