原文來自https://laravist.com/article/20javascript
Laravist是我剛剛上線的Laravel社區,有任何與Laravel相關的問題能夠到這裏來問我,我會盡力去幫你們解決問題,後期會嘗試錄製一些視頻教程,形式大概是這樣的php
https://laravist.com/lesson/2java
咱們以前的一系列文章綜合起來就實現了一個發佈文章的整個流程,可是萬一咱們須要修改某篇文章的內容呢?咱們該如何去實現呢?其實,有了怎麼建立一篇文章以後,咱們實現編輯(更新)文章的思路很相似。這裏能夠值得注意的知識點就是Form::model
和getAttribute
了。來看看具體的步驟:laravel
在routes.php
中,註冊咱們的編輯頁面的路由:app
Route::get('article/edit/{id}','ArticleController@edit');
這個路由接受一個參數:id
,意爲文章的id
,咱們會須要根據這個id
來查詢咱們要修改的文章。less
根據路由,咱們在ArticleController
添加edit()
方法:post
public function edit($id) { $article = Article::findOrFail($id); $tags = Tag::lists('name', 'id'); return view('articles.edit',compact('article','tags')); }
很熟悉地,咱們首先根據id
來查詢到咱們須要編輯的文章,對於$tags
,咱們採起跟create()
方法同樣的方法,獲得咱們的$tags
列表。而後渲染視圖,並將查詢到的$article
和$tags
傳給視圖。this
上面的edit()
方法指定了渲染articles.edit(resources/views/articles/edit.blade.php)
這個視圖,咱們來建立之,這裏爲了便利,咱們能夠直接將create.blade.php
這個視圖文件拷貝過來:url
@extends('app') @section('content') <h1>修改文章:{{ $article->title }}</h1> {!! Form::model($article,['url'=>'article/update']) !!} {!! Form::hidden('id',$article->id) !!} <div class="form-group"> {!! Form::label('title','標題:') !!} {!! Form::text('title',$article->title,['class'=>'form-control']) !!} </div> <div class="form-group"> {!! Form::label('content','正文:') !!} {!! Form::textarea('content',$article->content,['class'=>'form-control']) !!} </div> <div class="form-group"> {!! Form::label('published_at','發佈日期') !!} {!! Form::input('date','published_at',$article->published_at->format('Y-m-d'),['class'=>'form-control']) !!} </div> <div class="form-group"> {!! Form::label('tag_list','選擇標籤') !!} {!! Form::select('tag_list[]',$tags,null,['class'=>'form-control js-example-basic-multiple','multiple'=>'multiple']) !!} </div> <div class="form-group"> {!! Form::submit('修改文章',['class'=>'btn btn-success form-control']) !!} </div> {!! Form::close() !!} @if($errors->any()) <ul class="alert alert-danger"> @foreach($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> @endif <script type="text/javascript"> $(function() { $(".js-example-basic-multiple").select2({ placeholder: "添加標籤" }); }); </script> @endsection
這裏咱們注意下面這幾點:spa
咱們使用了Form::hidden()
這裏咱們使用這個目的(由於hidden表單並不會展現給用戶看)
就是爲了後面在更新的時候更加便捷和暴力,由於有了id
,咱們一切的事情都很好辦。
咱們給Form input表單設置了初始值
經過相似{!! Form::text('title',$article->title,['class'=>'form-control']) !!}
中的$article->title
的形式,咱們給表單賦予了初始值。
咱們使用了Form::model()
在聲明Form的時候,咱們並非簡單的使用Form::open()
,Form::model()
首先須要將你要綁定的model
傳進來,這裏咱們用的是$article
,也就是咱們在edit()
方法查找到的$article
,這個有什麼好處呢?
一旦綁定Form::model()
,在後面的input
表單中即便你沒有設置初始值,laravel也會自動爲你匹配,而後
爲你賦予初始值,這也是使用Form的好處之一,就好比上面的{!! Form::text('title',$article->title,['class'=>'form-control']) !!}
,在Form::model()
下,你徹底能夠像以前那樣寫:
{!! Form::text('title',null,['class'=>'form-control']) !!}
你依然會獲得相同的效果,可是這裏爲了更清晰,我直接賦了$article->title
初始值。
咱們又使用Carbon
在文章的published_at
這個字段,咱們借$article->published_at->format('Y-m-d')
又一次感覺到了Carbon的便利。
最後來看看咱們的編輯頁面有沒有好:
仔細看其實就會發現,這樣尚未徹底實現編輯,由於咱們的標籤尚未同步過來,咱們看到的標籤select
都是空的,可是原來的文章是有標籤的啊,這個怎麼辦呢?
getAttribute
就能夠登場了,藉助tag_list[]
這個便利特性,咱們能夠在Article.php
中爲其設置一個getAttribute
方法:
public function getTagListAttribute() { // laravel 5.1 needs all() return $this->tags->lists('id')->all(); // tags means tags() many-to-many relationship with tag }
這裏須要說明一下,相似getAttribute
都統一使用駝峯法。而後取值的時候就統一使用下劃線的方法,好比這裏的tag_list
就是對應TagList
,若是你寫成tag_involved
,方法就是getTagInvolvedAttribute()
。這樣寫laravel會自動獲取這個值。
注意,laravel 5.0版本,寫成這樣
return $this->tags->lists('id');
咱們來看看效果:
OK,這裏咱們實現完編輯頁面以後,咱們根據Form::model()
的url
來註冊一個post
路由
來到routes.php中,爲update方法增長post路由:
Route::post('article/update','ArticleController@update');
修改文章的表單會提交到article/update
,而後觸發ArticleController
的update()
方法。
在ArticleController
中增長update()
方法:
public function update(Requests\StoreArticleRequest $request) { //這裏使用一樣地驗證規則 dd($request->all()); }
咱們來看看有沒有拿到提交過來的數據:
OK,咱們爭取拿到數據了,接下來就是實現更新了。修改咱們的update()
方法:
public function update(Requests\StoreArticleRequest $request) { //根據id查詢到須要更新的article $article = Article::find($request->get('id')); //使用Eloquent的update()方法來更新, //request的except()是排除某個提交過來的數據,咱們這裏排除id $article->update($request->except('id')); // 跟attach()相似,咱們這裏使用sync()來同步咱們的標籤 $article->tags()->sync($request->get('tag_list')); return redirect('/'); }
OK,代碼邏輯實現完了以後,咱們來看看是否能更新成功:
Bang,大工告成!!
若是你一直都跟着教程來,這個修改文章的過程應該思路很清晰。咱們在這裏再一次感覺到:
註冊路由--->控制器寫方法--->加載視圖
這一個神奇的輪迴。這裏仍是須要強調的是Form::model()
和getAttribute
這兩個知識點。
最後,到這裏,貌似咱們的整個教程就能夠結束了。下面我打算再開一個系列說說laravel 5.1的新特性.
Happy Hacking