ホームページ > バックエンド開発 > PHPチュートリアル > Laravel 5 の基本 (9) - フォーム

Laravel 5 の基本 (9) - フォーム

WBOY
リリース: 2016-06-13 12:17:18
オリジナル
762 人が閲覧しました

Laravel 5 の基礎 (9) - フォーム

まず、ルーティングを変更して記事の公開を追加します。

<code>Route::get(&#39;articles/create&#39;, &#39;[email&#160;protected]&#39;);</code>
ログイン後にコピー

次にコントローラーを変更します

<code>    public function create() {        return view(&#39;articles.create&#39;);    }</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>&#39;Illuminate\Html\HtmlServiceProvider&#39;,</code>
ログイン後にコピー

を追加します。これを紹介するために IlluminateHtmlFromFacade のような長い名前は使用したくありません。短い名前が必要です。現在の app.php でエイリアス セクションを見つけて、最後にエイリアスを追加します。

<code>&#39;Form&#39;      => &#39;Illuminate\Html\FormFacade&#39;,&#39;Html&#39;      => &#39;Illuminate\Html\HtmlFacade&#39;,</code>
ログイン後にコピー

それではビューを作成しましょう。views/articles/create.blade.php

<code>@extends(&#39;layout&#39;)@section(&#39;content&#39;)    <h1>Write a New Article</h1>    <hr/>    {{--使用我们添加的 illuminate\html 开源库--}}    {!! Form::open() !!}    {!! Form::close() !!}@stop</code>
ログイン後にコピー

にアクセスしてエラーを確認してください。なぜですか? テストしてみましょう。コントローラーで次の変更を加えます。 /articles/create

<code>    public function show($id) {        dd(&#39;show&#39;);                $article = Article::findOrFail($id);        return view(&#39;articles.show&#39;, compact(&#39;article&#39;));    }</code>
ログイン後にコピー
はい、そのとおりです。

メソッドを show メソッドに追加するだけです。このメソッドは単にメッセージを出力して終了します。もう一度 dd() にアクセスしてみましょう。出力 /articles/create が見えますか? show

なぜ

にアクセスし、ルートから create が得られたのでしょうか? ルートを確認して何が起こったのか見てみましょう。 show

<code>Route::get(&#39;articles&#39;, &#39;[email&#160;protected]&#39;);Route::get(&#39;articles/{id}&#39;, &#39;[email&#160;protected]&#39;);Route::get(&#39;articles/create&#39;, &#39;[email&#160;protected]&#39;);</code>
ログイン後にコピー
上記は私たちのルートです。

はこれがワイルドカードであることを意味し、articles/{id} 以降のすべてが一致することに注意してください。私たちのarticles/も彼にマッチしました。ああ、神様! /articles/create

解決策は、順序を調整することです:

<code>Route::get(&#39;articles&#39;, &#39;[email&#160;protected]&#39;);Route::get(&#39;articles/create&#39;, &#39;[email&#160;protected]&#39;);Route::get(&#39;articles/{id}&#39;, &#39;[email&#160;protected]&#39;);</code>
ログイン後にコピー
つまり、今後のルーティング設定では、この問題に常に注意する必要があります。現在、

にアクセスしていますが、すべて問題ありません。 articles/create

ブラウザでソース コードを確認すると、

method が生成されるだけでなく、サーバーによる偽造を避けるためにフォームを検証するときに、非表示の action フィールドも生成されることがわかります。ハッカーの攻撃。 _token

ビューを変更してフィールドを追加しましょう:

<code>@extends(&#39;layout&#39;)@section(&#39;content&#39;)    <h1>Write a New Article</h1>    <hr/>    {{--使用我们添加的 illuminate\html 开源库--}}    {!! Form::open() !!}        <div class="form-group">            {!! Form::label(&#39;title&#39;, &#39;Title:&#39;) !!}            {!! Form::text(&#39;title&#39;, null, [&#39;class&#39; => &#39;form-control&#39;]) !!}        </div>        <div class="form-group">            {!! Form::label(&#39;body&#39;, &#39;Body:&#39;) !!}            {!! Form::textarea(&#39;body&#39;, null, [&#39;class&#39; => &#39;form-control&#39;]) !!}        </div>        <div class="form-group">            {!! Form::submit(&#39;Add Article&#39;, [&#39;class&#39; => &#39;btn btn-primary form-control&#39;]) !!}        </div>    {!! Form::close() !!}@stop</code>
ログイン後にコピー
フォームが送信されると、実際には

メソッドを使用して post に送信されますが、RESTful に従ってカスタムでは、articles/createpost に移動できるようにしたいと考えています。ビューのフォーム メソッドを変更し、送信パスを設定しましょう。 /articles

<code>{!! Form::open([&#39;url&#39; => &#39;articles&#39;]) !!}</code>
ログイン後にコピー
次に、ルート内でフォーム送信イベントを処理します。

<code>Route::post(&#39;/articles&#39;, &#39;[email&#160;protected]&#39;);</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(&#39;articles&#39;);    }</code>
ログイン後にコピー
レコードを追加してみてください。素晴らしいです。でも忘れないでください。

というフィールドもあるので、それを扱いましょう。 published_at

<code>    public function store() {        $input = Request::all();        $input[&#39;published_at&#39;] = Carbon::now();        Article::create($input);                return redirect(&#39;articles&#39;);    }</code>
ログイン後にコピー
新しいレコードを追加してテストします。

もう一つ問題があります。新たに追加したものが最前面に表示されるはずです。次のコントローラーを修正してみましょう。

<code>	public function index() {        //倒序获取文章        //可以这样        //$articles = Article::orderBy(&#39;published_at&#39;, &#39;desc&#39;)->get();        //简单方式,当然还有 oldest()        $articles = Article::latest(&#39;published_at&#39;)->get();        return view(&#39;articles.index&#39;, compact(&#39;articles&#39;));    }</code>
ログイン後にコピー
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート