Last updated at 2017/9/19

Laravel 5 学习小结😂
        申请季过完,又到了咸鱼的时候了。最近,编程社的小盆友们用了一个酷酷的新PHP框架,叫Laravel. 一打开它的官网 (laravel.com ),哇好强势:The PHP Framework For Web Artisans — 6666666。网上有随便插了一波,嗯,果然好评率高,何况之后NoticeBoard的开发肯定还需要我,学起吧?

搭建环境。。。
在搭建环境的时候Laravel就没留给我什么好印象。之前我用的是CI(CodeIgniter),蛮出名的轻量级框架。多简单的setup!直接把文件拖到web根目录,哒哒哒哒~ 好了!Laravel呢。。。 一开始觉得麻烦死我了。。

  • composer install

  • cp .env.example .env

  • 改权限

  • php artisan key:generate

  • 改.env 文件的数据库名,用户名以及密码

  • .......


  • 入门!!
    学一门语言,入门的方法嘛,我一直觉得就是看视频... 先找个老司机带着操作操作,熟练了之后就可以自己看文档然后继续深入学习了。
    嗯于是油管一波,找到了这个光头小哥的视频:https://www.youtube.com/watch?v=R8B4og-BeCk&list=PLwAKR305CRO-Q90J---jXVzbOd4CDRbVx
    跟着这个视频学到了Part 7,感觉基本上已经上手了,后面的学习就开始读文档了。(不得不说,Laravel的文档真是反人类)
    学到这个程度的时候,对这个框架基本上有些看法了:
    1. Routes 什么鬼?? 还要自己定义?? 在CI里Controller Name + Function Name就是 routes了喂!搞错没有?
    2. Blade真是太好用了。。想起以前为了改Navigation Bar上一个内容的时候Find and Replace的经历。。。泪流满面
    3. 错误信息太落后了。。CI里每一个报错基本上会精确到位置以及行数,而Laravel经常是XXXException at \Illuminate\... (Laravel自己的库)。根本搞不清哪里出Bug了喂!
    感觉嘛。。除了blade特别好之外没什么比CI好的了吧。。。

    进阶
    继续深入的时候,对这个框架印象更好了。
    1. Eloquent (Laravel Model)!大神器啊!处理数据关联妥妥的。比如我有个这样的结构哈:
  • Images: id, url, uploader_id

  • Users: id, username, password, nickname

  • 当我需要弄清楚某张Image是谁发的时候,我只需要在images的模型里加一个
    function user(){
        return $this->belongsTo('App\Models\User', 'uploader_id', 'id');
    }
    然后假设我加载前端的时候加载了一个数据$image = Image::find(1)->get();
    当我要在前端给这个id为1的图片加属性creator的时候,我只需要 $image->user 就可以了!

    要是在CI嘛...这个问题就头疼了,你得where两次,根据uploader_id来找user里面的对应id。。。呵呵

    2. Middleware
    这个东西,其实应该是不该出现在MVC架构里的。我对它的使用保留意见。但做验证处理的时候很好用,避免了在Controller里面重复调用验证函数的麻烦

    3. Storage
    Laravel的储存方式蛮麻烦的,默认是存在/storage中。但是laravel对外开放的目录是/public,这就需要你create symbolic link. 方法就是:
  • cd [app folder]/public

  • sudo ln -s ../storage/app/[Your Custom Storage Folder ]

  • 做好了这个之后访问webadress/[Your Custom Storage Folder]/file就能访问里面的文件了
    另外,Laravel在处理文件上传的时候碰到重名文件不会自动改名,这个也很蛋疼 ...

    4. Exception Handler
    Laravel可以让用户根据exception的种类来进行某些动作,只要在Exception/Handler.php里面定义即可。类似web上的try{ }catch{ } ?? 貌似CI是没有这个功能的。。举个例子:
    public function render($request, Exception $exception)
    {
    if ($exception instanceof XXXXXException){
    //Do something with this exception
    }
    return parent::render($request, $exception);
    }


    实践
    嗯。。现在已经习惯后端用这个框架了。学习的时候我其实在边学边做,把这个博客改写成Laravel(之前是CI)写的。(你可能心里会想我为什么不用WordPress,可能是因为我喜欢造轮子??也许是因为我不喜欢footer上有个Powered by WordPress🙃。其实我觉得最大的原因是维护这个玩意能继续提高我web编程的水平。。。 )
    咳咳。。说到哪了(刚刚装逼去了),嗯嗯,我把这个博客改写成Laravel的之后基本就熟悉这个框架了。所以说实践出真知!!

    另外,我现在也在帮忙开发NoticeBoard 3.0。。嘿嘿

    现在想说的大概就这么多了~~
    下次再见~~

    Ethan Hu
    2017 - 2 - 20