Laravel 学习笔记

2015-07-09 AnnatarHe 更多博文 » 博客 » GitHub »

laravel php framework

原文链接 https://annatarhe.github.io/2015/07/09/Laravel-study-notes.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


Hello

最近看了LaracastsLaravel5教程视频,感慨很多啊。凭着我半吊子英语都觉得Laravel绝对有向Rails看齐的能力。

今天开始做一些小的笔记。

安装

我并没有写安装的介绍。上面的中文文档对安装这一块写的特别的详细,而且是纯中文。

Database

创建数据库:

Notice:

这里有个小坑,好吧,不能算是坑。

创建数据库必须必须必须用复数形式!!!

我们不能通过migrate创建数据库,而是要手动创建,好在我还知道那么些SQL语法,这也难不倒:)

{% highlight sql %} CREATE DATABASE demo DEFAULT CHARSET utf8; {% endhighlight %}

Anyway, here we go.

首先要运行: {% highlight console %} $ php artisan make:migration create_articles_table --create="articles" {% endhighlight %} 添加数据库的表 {% highlight console %} $ php artisan make:migration add_excerpt_to_articles_table --create="articles" {% endhighlight %}

如果想要干掉某行(字段),那么需要添加一个composer包才能运行: {% highlight console %} composer require doctrine/dbal {% endhighlight %}

数据库里面需要一些测试数据怎么办呢? 5.1版本带来了很有用的新方法: database/factories/ModelFactory.php写入: {% highlight php %} <?php $factory->define(App\User::class,function ($faker){ return [ 'name' => $faker->name, 'email' => $faker->email, 'password' => str_random(10), 'remember_token' => str_random(10) ]; }); //文章可以这样用 $factory->define(App\Post::class,function ($faker){ return [ 'title' => $faker->sentence, 'body' => $faker->paragraph ]; }); ?> {% endhighlight %} 在database/seeds/DatabsesSeeder.php写入: {% highlight php %} <?php use App\User; public function run (){ Model::unguard(); User::truncate(); factory(User::class, 50)->create() Model::reguard(); } ?> {% endhighlight %} 现在运行: {% highlight console %} $ php artisan db:seed {% endhighlight %} 好了,去数据库查看数据吧!

当然还有简便的方法,这样的假数据我们只会在测试的时候使用,所以没必要非得在文件里面写入,那么这个简单的方法比较合适

$ php artisan tinker
factory('App\User')->create();

然后创建Model {% highlight console %} $ php artisan make:model Article {% endhighlight %}

现在需要传入数据到数据库中,那么怎么做呢?直接传入数组数据是不行的,因为比较危险,但是我们比较了解,可以这么用,那么就可以在这里 App/Article.php {% highlight php %} <?php class Article extends Model{ protected $fillable = [ 'title', 'body', 'published_at' ]; } ?> {% endhighlight %}

View

使一个页面局部总是接受数据

这个翻译不知道合不合适,原话是When You Want a View Partial to Always Recive Data
好吧,不纠结翻译了。如果是你你怎么做? 之前我在用ThinkPHP的时候技术太差呗,就是一个页面一个页面的写,写重复的内容

发出申请
接收数据
渲染页面
repeat * n

这里完全没有黑ThinkPHP的意思,当初我用它还是很幸福的,把我从手写的困境中拯救了出来.

不扯了,接着说。这样的重复自己是不是非常的无聊,低效率,而且维护比较麻烦.

噔噔噔噔~Laravel出来拯救你啦~

这里做个例子吧: 在导航条里面写一个最后的一篇文章,每个页面都需要。所以建立一个文件nav.blade.php,放在partials里面。因为是一个视图文件,所以要放在Views目录下。 里面写上: {% highlight html %} {!! link_to_action('ArticlesController@show',$latest->title,[$latest->id]) !!} {% endhighlight %} 那么,@include我就不写了。

然后去App目录下的Providers里面的AppServiceProvider.php找到boot函数: {% highlight php %} <?php public function boot(){ view()->composer('partials.nav',function($view){ $view->with('latest',Article::latest()->first()); }); } ?> {% endhighlight %} 这样,所有的有这个视图的文件进行渲染的时候都会经过这一步。而这一步里获取到了数据并填充到文件里,是不是很优雅,很舒适?

其实5.1版本加入一种inject的方法可以更优雅的解决这个问题,先占个坑,想好了再写。

Workflow

首先定义路由: App/Http/Routes.php下,写入: {% highlight php %} <?php Route::resource('/article','ArticlesController'); ?> {% endhighlight %} 那么,创建控制器: {% highlight console %} $ php artisan make:controller ArticlesController {% endhighlight %} 之后是去Controller里面写点儿东西:

Assets

刚好看到Assets,先稍微写一下: Laravel使用gulp来对整理前端依赖的。首先要先把gulp依赖下载下来。 {% highlight console %} $ npm install

国内的网络环境你懂的,当然也可以用

$ cnpm install {% endhighlight %}

默认自动带有bootstrap-sass

resources/assets/sass/app.scss里面解除注释 {% highlight sass %} @import "node_modules/bootstrap-sass/assets/stylesheets/bootstrap"; {% endhighlight %}

然后在glupfile.js中写这样的东西: {% highlight javascript %} var elixir = require('laravel-elixir'); elixir(function(mix){ mix.sass('app.scss').coffee; mix.styles([ 'vendor/normalize.css', 'app.css' ],'public/output/final.css','public/css'); mix.scripts([ 'vendor/jquery.js', 'app.js' ],'public/output/final.js','public/js'); }) {% endhighlight %} 好了,那么都是什么意思呢?mix是mixin的意思哦,第二行首先是把Sass编译成cssCoffeeScript编译成Javascript,是吧^_^

然后是混合选定的css文件,怎么选呢?min.style的三个参数分别是被混合的文件名混合后的生成地址被混合文件的所在目录
那么同理,mix.scripts也是混合喽~

Ok,there we go!

那么,如何运行这个命令?好办: {% highlight bash %} $ glup {% endhighlight %} 这样就可以了。

生产环境怎么办呢? {% highlight bash %} $ glup --production {% endhighlight %} 需要版本更迭的时候,因为浏览器会缓存,所以有时候并不能正确的推送给用户,那么这个时候就需要给这些以相应的版本号,幸好,glup都帮我们干了,我们只要写这么一句: {% highlight javascript %} mix.version('public/css/final.css'); {% endhighlight %} 那么,如何在使用?

只需要在layout文件里把link改成: {% highlight html %} {% endhighlight %} 它就会自动转换成带有版本号的样子

Session

可以用Redis来替代。可以参考我的另一篇Redis笔记

设置: {% highlight php %} <?php \Session::flash('key','value'); //或者: \Session::put('key','value');

//前面使用use Session;了也可以这样 session()->flash('key','value'); ?> {% endhighlight %}

使用(视图模板)

{% highlight php %} <?php @if (Session::has('key')) { { Session::get('key') } } @endif ?> {% endhighlight %} 加入了Flash的package之后更是可以这样使用: {% highlight php %} <?php flash('Hello World'); flash()->success('success infomation'); flash()->overlay('infomation', 'title'); //使用overlay需要在模板加入: //$('#flash-overlay-modal').modal() ?> {% endhighlight %} 当然啦,得在模板里加入: {% highlight php %} <?php @include ('flash::message') ?> {% endhighlight %}

Form

首先要安装下面的Form的package。然后来创作表单吧! {% highlight php %} <?php {!! Form::open() !!} {!! Form::label('title','Title') !!} {!! Form::text('title',null,['class'=>'form-control','placeholder'=>'The Title']) !!} {!! Form::label('title','Title') !!} {!! Form::input('date','published_at',date('Y-m-d'),['class'=>'form-control']) !!} {!! Form::label('title','Title') !!} {!! Form::select('tags[]',['1'=>'personal'],null,['class'=>'form-control','multiple']) !!} {!! Form::submit('save it', ['class'=>'btn btn-default form-control']) !!} {!! Form::close() !!} ?> {% endhighlight %} tags那一段的null表示的是被选中的情况,如果是1,就表示value为1的被选中。

如果有时候忘记了参数是什么,随时看源码,写的非常的清楚!

Upload

{% highlight php %} <?php public function addPhoto(Request $request) { $file = $request->file('file'); $name = time() . $file->getClientOriginalName(); $file->move('projectName/phtots', $name); return 'Done'; } ?> {% endhighlight %} 哈哈~这就上传完成啦~

Cache

无奈嘛,总想让自己的网站快一点儿。

我是因为使用的美帝的VPS。所以我感觉速度可能出在加载图片文件上。

第一步,我申请了一个七牛云存储,然后把比较大的视频和图片文件放在了七牛的空间里,免费用户有10G的空间呢,对我来说还是挺够用个。

第二步,开启Redis缓存,将所有的Cache转用到Redis,这样可以尽量避免一些session的负面影响。

Packages

需要引入的包要用composer的方式引入,例如: {% highlight console %} $ composer require illuminate/html {% endhighlight %}

  • illuminate/html
    config/app.php下注册: {% highlight php %} <?php //'providers'=>里面加入 'Illuminate\Html\HtmlServiceProvider' //'Alias'加入: 'Form' => 'Illuminate\Html\FormFacade', 'Html' => 'Illuminate\Html\HtmlFacade' ?> {% endhighlight %}

  • laracasts/flash
    {% highlight php %} <?php //'providers'=>里面加入 'Laracasts\Flash\FlashServiceProvider' //'Alias'加入: 'Flash' =>'Laracasts\Flash\Falsh' ?> {% endhighlight %}

  • predis/predis

这个不需要再boot里面再加入了。

所要修改的只有config/database.php

cache换成redis就可以啦~

Production

生产环境还是得做一些操作的,比如关掉调试模式 ,以下这些就是需要注意的地方。 {% highlight bash %} $ composer install --optimize-autoloader $ composer dump-autoload --optimize

$ gulp --production $ php artisan clear-compiled $ php artisan optimize {% endhighlight %}

Resources