ホームページ >バックエンド開発 >PHPチュートリアル >Laravel 5 の基本 (9) - フォーム
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>入力フォームの json 結果を直接見ることができます。
フィールドの値のみが必要な場合は、 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>