Laravel 5 の基礎 (9) - フォーム
まず、ルーティングを変更して記事の公開を追加します。
<code>Route::get('articles/create', '[email protected]');</code>
次にコントローラーを変更します
<code> public function create() { return view('articles.create'); }</code>
ビューを返し、新しいビューを作成します。もちろん、HTML を使用して直接フォームを作成することもできますが、より機能的な方法があります。私たちは Jeffrey Way によって開発されたオープンソース ライブラリ、illuminatehtml を使用します。依存ライブラリをインストールします:
<code>composer require illuminate/html</code>
Laravel のライブラリは、使用する前に laravel に登録する必要があります。 config/app.php
には、laravelが提供するprovider
フィールドがあり、ここにlaravelのライブラリ関数が記述されています。 Laravel Framewirk Service Providers...
の最後に新しい HtmlProvider
<code>'Illuminate\Html\HtmlServiceProvider',</code>
を追加します。これを紹介するために IlluminateHtmlFromFacade
のような長い名前は使用したくありません。短い名前が必要です。現在の app.php
でエイリアス セクションを見つけて、最後にエイリアスを追加します。
<code>'Form' => 'Illuminate\Html\FormFacade','Html' => 'Illuminate\Html\HtmlFacade',</code>
それではビューを作成しましょう。views/articles/create.blade.php
<code>@extends('layout')@section('content') <h1>Write a New Article</h1> <hr/> {{--使用我们添加的 illuminate\html 开源库--}} {!! Form::open() !!} {!! Form::close() !!}@stop</code>
にアクセスしてエラーを確認してください。なぜですか? テストしてみましょう。コントローラーで次の変更を加えます。 /articles/create
<code> public function show($id) { dd('show'); $article = Article::findOrFail($id); return view('articles.show', compact('article')); }</code>
メソッドを show
メソッドに追加するだけです。このメソッドは単にメッセージを出力して終了します。もう一度 dd()
にアクセスしてみましょう。出力 /articles/create
が見えますか? show
にアクセスし、ルートから create
が得られたのでしょうか? ルートを確認して何が起こったのか見てみましょう。 show
<code>Route::get('articles', '[email protected]');Route::get('articles/{id}', '[email protected]');Route::get('articles/create', '[email protected]');</code>
はこれがワイルドカードであることを意味し、articles/{id}
以降のすべてが一致することに注意してください。私たちのarticles/
も彼にマッチしました。ああ、神様! /articles/create
<code>Route::get('articles', '[email protected]');Route::get('articles/create', '[email protected]');Route::get('articles/{id}', '[email protected]');</code>
にアクセスしていますが、すべて問題ありません。 articles/create
と method
が生成されるだけでなく、サーバーによる偽造を避けるためにフォームを検証するときに、非表示の action
フィールドも生成されることがわかります。ハッカーの攻撃。 _token
<code>@extends('layout')@section('content') <h1>Write a New Article</h1> <hr/> {{--使用我们添加的 illuminate\html 开源库--}} {!! Form::open() !!} <div class="form-group"> {!! Form::label('title', 'Title:') !!} {!! Form::text('title', null, ['class' => 'form-control']) !!} </div> <div class="form-group"> {!! Form::label('body', 'Body:') !!} {!! Form::textarea('body', null, ['class' => 'form-control']) !!} </div> <div class="form-group"> {!! Form::submit('Add Article', ['class' => 'btn btn-primary form-control']) !!} </div> {!! Form::close() !!}@stop</code>
メソッドを使用して post
に送信されますが、RESTful に従ってカスタムでは、articles/create
を post
に移動できるようにしたいと考えています。ビューのフォーム メソッドを変更し、送信パスを設定しましょう。 /articles
<code>{!! Form::open(['url' => 'articles']) !!}</code>
<code>Route::post('/articles', '[email protected]');</code>
<code>//注意:将下面的 use 语句删除,我们使用 facade 接口中的 Request//use App\Http\Requests\Request;//引入下面的命名空间中的 Requestuse Illuminate\Support\Facades\Request; public function store() { //使用 Illuminate\Html\Request 来返回全部的表单输入字段 $input = Request::all(); //我们直接返回$input,来看一下 return $input; }</code>
フィールドの値のみが必要な場合は、 title
を使用できます。 Request::get('titel')
<code>Article::create($input);</code>
$fillable
に直接入力できるフィールドを定義します。 create
<code> public function store() { $input = Request::all(); Article::create($input); return redirect('articles'); }</code>
というフィールドもあるので、それを扱いましょう。 published_at
<code> public function store() { $input = Request::all(); $input['published_at'] = Carbon::now(); Article::create($input); return redirect('articles'); }</code>
<code> public function index() { //倒序获取文章 //可以这样 //$articles = Article::orderBy('published_at', 'desc')->get(); //简单方式,当然还有 oldest() $articles = Article::latest('published_at')->get(); return view('articles.index', compact('articles')); }</code>