Route::resource和Form-Model-Binding_html/css_WEB-ITnose

关于Route::resource

app/Http/routes.phpRoute::group(['middleware' => ['web']], function () {    Route::get('/articles','ArticlesController@index');    Route::get('/articles/create','ArticlesController@create');    Route::get('/articles/{id}','ArticlesController@show');    Route::post('/articles','ArticlesController@store');    Route::get('/articles/{id}/edit','ArticlesController@edit');});

一般我们的一个普通网站的文章有这些url,这些url分别是文章编辑,创建,查看列表,查看文章内容等,laravel框架对于这些有规律的url做了一个叫RESTful Resource Controllers的可重用的资源控制器

php artisan route:list //用这个命令可以查看当前laravel项目的路由情况+--------+----------+--------------------+------+------------------------------------------------+------------+| Domain | Method   | URI                | Name | Action                                         | Middleware |+--------+----------+--------------------+------+------------------------------------------------+------------+|        | POST     | articles           |      | App\Http\Controllers\ArticlesController@store  | web        ||        | GET|HEAD | articles           |      | App\Http\Controllers\ArticlesController@index  | web        ||        | GET|HEAD | articles/create    |      | App\Http\Controllers\ArticlesController@create | web        ||        | GET|HEAD | articles/{id}      |      | App\Http\Controllers\ArticlesController@show   | web        ||        | GET|HEAD | articles/{id}/edit |      | App\Http\Controllers\ArticlesController@edit   | web        |+--------+----------+--------------------+------+------------------------------------------------+------------+

改为使用resource

app/Http/routes.phpRoute::group(['middleware' => ['web']], function () {    Route::resource('/articles','ArticlesController'); //将之前的一批路由改为这个。}); php artisan route:list+--------+-----------+--------------------------+------------------+-------------------------------------------------+------------+| Domain | Method    | URI                      | Name             | Action                                          | Middleware |+--------+-----------+--------------------------+------------------+-------------------------------------------------+------------+|        | GET|HEAD  | articles                 | articles.index   | App\Http\Controllers\ArticlesController@index   | web        ||        | POST      | articles                 | articles.store   | App\Http\Controllers\ArticlesController@store   | web        ||        | GET|HEAD  | articles/create          | articles.create  | App\Http\Controllers\ArticlesController@create  | web        ||        | DELETE    | articles/{articles}      | articles.destroy | App\Http\Controllers\ArticlesController@destroy | web        ||        | PUT|PATCH | articles/{articles}      | articles.update  | App\Http\Controllers\ArticlesController@update  | web        ||        | GET|HEAD  | articles/{articles}      | articles.show    | App\Http\Controllers\ArticlesController@show    | web        ||        | GET|HEAD  | articles/{articles}/edit | articles.edit    | App\Http\Controllers\ArticlesController@edit    | web        |+--------+-----------+--------------------------+------------------+-------------------------------------------------+------------+//再次查看路由,依旧会生成这些有规律的常用的路由list,不过需要注意一些路由,有些是用了PATCH方法,这个是因为浏览器本身只支持get和post,对于其他的方法是无法处理的,所以laravel会在表单的里面提供支持这些其他的方法的语法,当然,在这里我们只需要知道有这些路由,这些路由有这些方法

详情参考:https://laravel.com/docs/5.2/controllers#restful-resource-controllers

在controller里面编写edit方法,

app/Http/Controllers/ArticlesController.php    public function edit($id){        $article = Articles::findOrFail($id); //findOrFail方法是laravel的model的提供的可以处理model数据的方法,而model是直接关联数据库的,所以可以理解为直接操作数据库的方法        //这里是查找主键为$id的项,然后返回一个model        return view('articles.edit',compact('article'));    }

以下是findOrFail的介绍

Model|Collection findOrFail(mixed $id, array $columns = array('*'))Find a model by its primary key or throw an exception.Parametersmixed   $id array   $columns    Return ValueModel|Collection

创建edit的blade模板

resources/views/articles/edit.blade.php@extends('layout.app')@section('content')    

{{$article->title}}

//用这里来验证是否能够查找到$article的title信息 @if($errors->any())
    @foreach($errors->all() as $error)
  • {{$error}}
  • @endforeach
@endif@stop

查看数据库

id  title   content publish_at  created_at  updated_at5   我是一篇新文章 你好  2016-05-21 00:00:00 2016-05-21 07:32:48 2016-05-21 07:32:48

在浏览器访问http://localhost:8000/articles/5/edit出来的是正确的title

编辑PATCH method

确认edit模板和edit方法是正常之后,再次修改edit模板

resources/views/articles/edit.blade.php@extends('layout.app')@section('content')    

{{$article->title}}

{!! Form::open(['method'=>'PATCH','url'=>'/articles'.$article->id]) !!} //因为之前的提到的用resource路由,其中有一个路由是用PATCH方法的,所以在这里写
{!! Form::label('title', 'Title:') !!} {!! Form::text('title', null, ['class' => 'form-control']) !!}
{!! Form::label('content', 'Content:') !!} {!! Form::textarea('content', null, ['class' => 'form-control']) !!}
{!! Form::label('publish_at', 'publish_at:') !!} {!! Form::date('publish_at', date('Y-m-d'), ['class' => 'form-control']) !!}
{!! Form::submit('发表文章',['class'=>'btn btn-primary form-control']) !!} {!! Form::close() !!} @if($errors->any())
    @foreach($errors->all() as $error)
  • {{$error}}
  • @endforeach
@endif@stop

检查网页源代码

< !DOCTYPE html>    Laravel        <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css"/><body>    

我是一篇新文章

//可以发现会自动生成一个input,里面是方法PATCH,通过这种hacker的方式来将一些自定义的method来使用,很方便

关于Form-Model-Binding

 {!! Form::open(['method'=>'PATCH','url'=>'/articles'.$article->id]) !!} 

改为

 //这里需要注意的是这个就是改为Form-Model-Binding{!! Form::model($article,['method'=>'PATCH','url'=>'/articles'.$article->id]) !!}

Form-Model-Binding是将model和from进行绑定,这样可以实现自动将model的数据写入form表单,对于编辑页面,要出现编辑之前的数据的话,很有用。

再次检查网页源码

< !DOCTYPE html>    Laravel        <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css"/><body>    

我是一篇新文章

//title自动输入了
//内容也是

郑重声明:本文版权包含图片归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们(delete@yzlfxy.com)修改或删除,多谢。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

留言与评论(共有 0 条评论)
昵称:
匿名发表
   
验证码: