ホームページ >バックエンド開発 >PHPチュートリアル >Laravel 5 シリーズ チュートリアル 10: 記事の変更を実装する
Laravist は私が立ち上げた Laravel コミュニティです。Laravel に関する質問がある場合は、ここに来て質問してください。問題を解決するのに最適です。今後、いくつかのビデオチュートリアルを録画しようとします。形式はおそらく次のとおりです原文は https://laravist.com/article/20 から
https://laravist.com/lesson/2
これまでの一連の記事を合わせて実現しました。記事を公開するプロセス全体ですが、場合によっては、特定の記事の内容を変更する必要がありますか?どうすればこれを達成できるでしょうか?実際、記事の作成方法を知った後、記事を編集(更新)するという考え方は非常に似ています。ここで注目に値する知識ポイントは、Form::model と getAttribute です。具体的な手順を見てみましょう:
ルートを登録します
Route::get('article/edit/{id}','ArticleController@edit');
このルートはパラメータを受け入れます: id、これは記事の ID を意味します。この ID を使用して、変更する記事をクエリします。
edit メソッドを記述します
public function edit($id) { $article = Article::findOrFail($id); $tags = Tag::lists('name', 'id'); return view('articles.edit',compact('article','tags')); }
非常によく知られているように、まず、ID に基づいて編集する必要がある記事をクエリします。$tag については、 create() メソッド 同様に、$tags リストを取得します。次に、ビューをレンダリングし、クエリされた $article と $tags をビューに渡します。
ビューを作成する
@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
ここでは次の点に注意します:
Form::hidden() を使用しますここでは、この目的のためにそれを使用します (非表示のフォームは表示されないため) user ) は、ID があればすべてが簡単に処理できるため、今後のアップデートをより便利かつ暴力的にするためです。
フォーム入力フォームの初期値を設定します{!! Form::text('title',$article->title,['class'=>'form-control') のようにして設定します]) !!} $article->title の形式で、フォームに初期値を割り当てます。
Form::model()を使用しましたFormを宣言するとき、単にForm::open()を使用するのではなく、最初にForm::model()にバインドしたいモデルを渡す必要があります。ここでは $article を使用します。これは edit() メソッドで見つけた $article です。これにはどのような利点があるでしょうか。
Form::model() がバインドされると、後続の入力フォームで初期値を設定しなくても、laravel が自動的にそれを照合し、初期値を提供します。これも利点の 1 つです。たとえば、上記の Form::model の下の {!! Form::text('title',$article->title,['class'=>'form-control']) !!} ()、前と同じように書くことができます:
{!! Form::text('title',null,['class'=>'form-control']) !!}
同じ効果が得られますが、わかりやすくするために、$article->title の初期値を直接割り当てました。
またCarbonを使います
記事のpublished_atフィールドでは、$article->published_at->format('Y-m-d')を拝借して、改めてCarbonの便利さを感じます。
最後に、編集ページが適切かどうかを確認してみましょう:
注意深く見ると、タグがまだ同期されておらず、表示されるタグの選択がすべて空であるため、編集が完全には実現されていないことがわかります。はい、元の記事にはタグが付いていますが、これについてはどうすればよいでしょうか。
getAttribute
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 }
laravel バージョン 5.0 は次のように書かれていることに注意してください return $this->tags->lists('id');
効果を見てみましょう:
OK、これで完了です編集ページで、Form::model() の URL に基づいて投稿ルートを登録します
投稿ルートを登録します
routes.php に移動し、更新メソッドに投稿ルートを追加します:
Route::post('article/update','ArticleController@update');
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、コード ロジックが実装されたら、更新が成功するかどうかを確認してみましょう:
完了、仕事は完了です。 !
概要
チュートリアルに従っている場合は、記事を変更するプロセスが非常に明確になるはずです。ここでもそれを改めて感じます:
注册路由--->控制器写方法--->加载视图
这一个神奇的轮回。这里还是需要强调的是Form::model()和getAttribute这两个知识点。
最后,到这里,貌似我们的整个教程就可以结束了。下面我打算再开一个系列说说laravel 5.1的新特性.
Happy Hacking