[Laravel 5 Fundamentals] 27 – Loose Ends and Wrapping Up
零星的扫尾
前言
本节是该系列的最后一节,这节中我们会把一些零碎的问题都收拾掉。
说明
开发环境:Windows 7
Laravel 版本: 5+
IDE: Phpstorm
这节是本系列的最后一讲,我们扫扫尾,把零碎的两个问题做一个“了断”。
关于日期的问题
关于日期的问题,有两个:
1,当你对一篇文章进行编辑的时候,命名修改了其日期,但是当你保存修改后再打开编辑,发现日期还是原来的日期。
2,日期总是显示当天的日期。
先看第 2 个问题,打开 form.blade.php :
{!! Form::label('publish_at','Publish On:') !!}{!! Form::date('published_at',Carbon\Carbon::now(),['class'=>'form-control']) !!}
由此可以看出,每片文章的日期都是由 Carbon\Carbon::now() 来决定的,自然都是当天。修改成下面的:
{!! Form::label('publish_at','Publish On:') !!}{!! Form::date('published_at',$article->published_at->format('Y-m-d'),['class'=>'form-control']) !!}
不难理解吧,从 $article 对象那儿获取到 published_at 这个文章发表字段的值,然后格式化成 Year-month-day 格式。保存再刷新编辑页面,看起来是成功了呢~
等等!当我们创建一篇文章的时候,通过 create 方法,发现会报错。原因也很简单,当我们创建文章的时候,这个文章对象 $article 根本就不存在,因为它自己还在创建中,而我们在对文章进行修改的时候,这个文章对象是已经创建之后的。那怎么办?
打开引用过该表单模板的 create.blade.php 页面,修改如下:
{!! Form::model($article = new \App\Article, ['url'=>'articles']) !!}
此处我们不再使用 open 方法了,而是用 model 方法绑定一个 article 对象,这里的 article 对象你也看到了,是 new 出来的,新建的,是一个空对象。此时创建文章还是会报错,因为 format 方法不能对 null 对象进行操作。下一步,我们到 Article.php 里面编辑新增一个方法:
public function getPublishedAtAttribute($date){ return new Carbon($date);}
这个方法的意义就在于当我们要获取 published_at 这个字段的值的时候,如果没有,则 return 一个新的日期,而且是当前的日期。
这下,你可以刷新一个创建文章的页面了,一切,都,正常了。
标签不能点击的问题
目前文章的标签只能看不能点击,比如一点击就会列出所有持有该标签的文章。下面我们来完成这个点。
首先,打开 routes.php ,添加一条路由:
Route::get('tags/{tag}','TagsController@show');
意思是,当我们访问 /tags/tag 这个 uri 的时候,将该 tag 传递给 TagsController 的 show 方法。
那么我们通过命令行来创建一个 TagsController.php :
phpartisanmake:controllerTagsController
打开 TagsController.php 创建 show 方法:
public function show(Tag $tag){ return $tag;}
记得添加 use App\Tag;下面打开 RouteServiceProvider.php ,找到 boot 方法,添加如下语句:
$router->bind('tags',function($name){ return \App\Tag::where('name',$name)->firstOrFail();});
它的意思是将 tags model与路由绑定,这样的好处就是 laravel 内部会处理这些不同层之间的逻辑关系,对你来说是透明的。
至此,你可以去访问一下 /tags/work 或者 /tags/personal 之类的标签查看。
嗯,不错,可以看到了标签的信息。不过我们想要的是显示拥有该标签的文章列表。
修改 TagsController.php 的 show 方法:
public function show(Tag $tag){ $articles = $tag->articles; return view('articles.index',compact('articles'));}
首先获取到拥有该标签的文章列表,并存于 $articles 这个变量中,然后将这些文章对象都返回到试图层。保存后,再次访问刚才的标签页面,此时的显示应该是持有该标签的文章的列表,而且是可以访问的文章的列表。
总结
本系列对 laravel 5.2 进行了一些讲解,以写一个博客为实践方向,从 mvc 的各个层,各个细节把 laravel 的应用讲了一下。涉及的东西多,但并不复杂,毕竟还是 fundamental ,不过这些基础的点有很值得深挖的地方。
欢迎各位能够坚持观看和学习本系列,我个人也是第一次接触 php 框架,所有有很多理解都是基于 java 的 web 框架而来的,虽然语言不同,但是架构思想都是差不多的,都是基于 mvc ,不过肯定还有一些问题,欢迎大家能够学习的同时提出并交流~
上一篇: php 跨域有关问题
下一篇: 如何说服我的老师使用较新的语言?