初心者のためのLaravelチュートリアル
Laravelとは何ですか?
ララベル は、PHP 用のオープンソース Web MVC フレームワークです。 Laravel は、専用の依存関係マネージャーを備えたモジュラー パッケージング システム、リレーショナル データベースへのアクセス、アプリケーションの展開とメンテナンスのためのその他のユーティリティなどの機能を備えた、PHP Web アプリケーションの簡単な開発を提供する堅牢なフレームワークです。
Laravel は Taylor Otwell によって作成されました。 2011 年 1 月の最初のリリース (バージョン XNUMX) 以来、Web 開発業界の PHP フレームワーク分野で着実に人気が高まっています。 この人気の多くは、開発者を第一に考えた多くの機能が標準搭載されていることに起因すると考えられます。
なぜララベルなのか?
2000年頃、ほとんどの PHP コード 手続き型であり、スパゲッティ コードが複雑に絡み合った「スクリプト」の形で見つかる可能性がありました。 最も単純なページでも、 関心事の分離したがって、アプリケーションがすぐにメンテナンスの悪夢に発展するのは非常に簡単でした。 世界はより良いものを必要としていました…PHP バージョン 5 とさまざまな PHP フレームワークが登場し、Web アプリケーションのさまざまな問題に対して切望されている解決策とより優れたソリューションを提供しようとしています。
それ以来、現在存在し、使用されている人気のフレームワークへの道を開く多くのフレームワークがリリースされてきました。今日、トップ 3 は (私たちの意見では) Zend Framework、Symfony、そしてもちろん Laravel です。これらのフレームワークはどれも同様の原則に基づいて構築され、(基本的に) 同じ一般的な問題を解決することを目指していますが、主な違いはその実装にあります。問題解決の方法にはそれぞれ独自の癖があります。それぞれのフレームワークによって生成されたコードを見ると、それぞれを隔てるかなり明確な境界線があることがわかります。私たちの控えめな意見では、Laravel フレームワークが最高です。
詳細については、こちらから LaravelとCodeIgniterの違い
Composer を使って Laravel をダウンロードしてインストールする方法
注意 ローカル システムに PHP のコピーがすでにインストールされていることを前提としています。 そうでない場合は、インストール方法を読むことができます こちら
Composer はパッケージと依存関係の両方を管理するものです。インストールするには、ターミナルを開いて新しいディレクトリに移動します。次のコマンドを実行します。
curl -Ss getcomposer.org/installer | php
このコマンドの結果は次のようになります。
注意 Laravel のセットアップに関する詳細な手順については、Laravel のドキュメントを参照してください。 こちら.
Laravel のインストールに使用する composer.phar スクリプトをダウンロードしてコンパイルしているのがわかります。新しい Laravel アプリケーションをセットアップする方法は多数ありますが、ここでは Laravel composer スクリプトを使用してセットアップします。このスクリプトをインストールするには、次のコマンドを実行します。
composer global require laravel/installer
これは次のようになります。
これにより、すべてのフレームワーク ファイル自体と、必要なすべての依存関係がダウンロードされ、インストールされます。パッケージはベンダー ディレクトリ内に保存されます。ダウンロードしてインストールしたら、次のコマンドを発行するだけです。
laravel new uploadApp
次のような出力が表示されます。
Composer は、Laravel の実行に必要なすべてのパッケージをインストールしています。数分かかる場合がありますので、しばらくお待ちください。完了したら、ls -al コマンドを実行して、インストールされた内容を確認します。
一般的な Laravel アプリケーションのディレクトリの簡単な内訳は次のとおりです。
- アプリ/ : これは、アプリケーション コードが存在するソース フォルダーです。 すべてのコントローラー、ポリシー、モデルはこのフォルダー内にあります
- ブートストラップ/ : アプリケーションの起動スクリプトといくつかのクラス マップ ファイルを保持します。
- 設定/ : アプリの構成ファイルを保持します。 通常、これらは直接変更されず、アプリのルートにある .env (環境) ファイルに設定された値に依存します。
- データベース/ : マイグレーション、シード、テスト ファクトリを含むデータベース ファイルを格納します。
- 公共/ : コンパイルされたアセットともちろんindex.phpファイルを保持するパブリックにアクセス可能なフォルダー
- リソース/ : JavaScript ファイル、言語ファイル、CSS/SASS ファイル、アプリケーションで使用されるすべてのテンプレート (ブレード テンプレートと呼ばれる) などのフロントエンド アセットが含まれます。
- ルート/ : アプリケーション内のすべてのルートはここにあります。 ルートにはいくつかの異なる「スコープ」がありますが、ここで焦点を当てるのは web.php ファイルです。
- ストレージ/ : アプリケーションによって使用されるすべての一時キャッシュ ファイル、セッション ファイル、コンパイルされたビュー スクリプト、およびログ ファイル
- テスト/ : 単体テストや機能テストなどのアプリケーションのテスト ファイルが含まれます。
- ベンダー/ : すべての依存パッケージはcomposerでインストールされます
それでは、アプリの残りの部分をビルドし、特別な職人コマンドを使用して実行しましょう (Apache や nginx などの Web サーバーをインストールして構成する手間を省くため)。 .env ファイルには、/config ディレクトリ内のファイルがアプリケーションの構成に使用するすべての構成値が含まれています。 その中には、アプリケーションの内部で使用されるさまざまなパラメーターの構成値が含まれていることがわかります。
アプリケーション設計: 要件の簡単な概要
このオンライン Laravel チュートリアルでは、次の XNUMX つのことだけを行う非常に単純なアプリケーションを構築します。
- Web フォームからのファイルのアップロードを処理する
- 以前にアップロードしたファイルを別のページに表示します。
このプロジェクトでは、アプリケーションは書き込み専用になります。つまり、ユーザーはファイルの書き込みと、アップロードしたファイルのリストの表示のみが可能になります。 このアプリケーションは非常に基本的なものですが、Laravel のスキルと知識を構築し始めるための良い練習として役立つはずです。 簡潔にするために、データベースのモデリング、移行、認証を除外しましたが、実際のアプリケーションでは、これらはさらに考慮する必要があることに注意してください。
アプリケーションを期待どおりに動作させるために必要なコンポーネントのリストを次に示します。
- A route これにより、外部 (インターネット) がアプリケーションを使用できるようになり、アップロードされたファイルを保存するためのロジックが配置される場所を示すエンドポイントを指定できるようになります。
- A コントローラ リクエストからレスポンスまでのフローを処理します
- A template これは、以前にアップロードされたファイルのリストと実際のアップロード フォーム自体を表示するために使用されます。
- A 要求 コントローラーが Web フォームから渡されたデータを検証するために使用するもの
ルートとは何ですか?
Laravel のルートは基本的に、アプリケーションによって提供される機能の一部への「ポインター」として機能する URI によって指定されるエンドポイントです。 最も一般的には、ルートは単にコントローラー上のメソッドを指し、どの HTTP メソッドがその URI にアクセスできるかを指定します。 ルートは必ずしもコントローラー メソッドを意味するわけではありません。 アプリケーションの実行を定義済みのクロージャまたは匿名関数に渡すこともできます。
ルートを使用する理由
ルートは、プロジェクトのルート ディレクトリ内の /routes フォルダーの下のファイルに保存されます。デフォルトでは、アプリケーションのさまざまな「側面」に対応するいくつかの異なるファイルがあります (「側面」は六角形アーキテクチャ手法に由来します)。これには次のものが含まれます。
- web.php パブリック向けの「ブラウザ」ベースのルート。 これらは最も一般的なものであり、Web ブラウザーによってヒットされるものです。 これらは Web ミドルウェア グループを通じて実行され、次の機能も含まれています。 csrfプロテクション (フォームベースの悪意のある攻撃やハッキングから防御するのに役立ちます)、通常はある程度の「状態」が含まれています (これは、セッションを利用することを意味します)
- api.php API グループに対応するルートで、API ミドルウェアがデフォルトで有効になっています。 これらのルートはステートレスであり、セッションやクロスリクエスト メモリを持ちません (XNUMX つのリクエストは他のリクエストとデータやメモリを共有せず、それぞれが自己カプセル化されています)。
- console.php これらのルートは、アプリ用に作成したカスタム職人コマンドに対応します。
- Channels.php イベントブロードキャスト用のルートを登録します
現時点で関係する重要なファイルは、ブラウザ固有の web.php です。 デフォルトですでに XNUMX つのルートが定義されています。これは、アプリケーションの Web ルートに移動するときに右にヒットするルートです (Web ルートはパブリック ディレクトリにあります)。 アップロード アプリケーションが機能するには、次の XNUMX つの異なるルートが必要です。
- /upload これは、ファイルをアップロードするための Web フォームを表示するメイン ページの URI になります。
- /process これは、/upload URI にあるフォームがフォーム送信データを投稿する場所になります (フォームの「アクション」)
- /list これにより、サイトにアップロードされたすべてのファイルがリストされます
注意 アップロード フォームとファイルのリストを表示するためのすべてのロジックを XNUMX つのページに配置したい場合は、/list エンドポイントは必要ないかもしれませんが、当面の主題にもう少し問題を追加するために、現時点ではそれらを分離しておきます。 。
//inside routes/web.php Route::get('/upload', 'UploadController@upload')->name('upload'); Route::get('/download, 'UploadController@download)->name(‘download'); Route::post('/process', 'UploadController@process')->name('process'); Route::get('/list', 'UploadController@list')->name('list');
この Laravel フレームワーク チュートリアルでは、必要なルートごとに、利用可能な HTTP 固有のリクエスト メソッド (get()、post()、put()、delete()、 patch() または options() )。 これらのそれぞれの内訳については、次を確認してください。 この 外。 これらのメソッドは、どの HTTP 動詞がその特定のルートへのアクセスを許可されるかを指定します。 複数の HTTP 動詞を受け入れられるルートが必要な場合 (初期データの表示と送信されたフォーム データの送信の両方に単一ページを使用している場合がこれに該当します)、 Route::any( ) 方法。
Route::get() メソッドと Route::post() メソッド (および Route ファサードの他の HTTP 動詞関連メソッド) の両方の 2 番目の引数は、特定のコントローラーとそのコントローラー内に格納されているメソッドの名前です。これらのメソッドは、許可された HTTP リクエスト (GET、POST、PATCH など) でルートのエンドポイントに到達したときに実行されます。3 つのルートすべてに UploadController を使用しており、次のように指定しています。
各ルートで呼び出す最後のメソッドは name() 関数です。これは単一の文字列を引数として受け取り、覚えやすい名前で特定のルートに多かれ少なかれ「タグ」を付けるために使用されます (私たちの場合、アップロード、処理、リスト)。 URL がまったく同じ名前である場合に、各ルートに独自の名前を付ける機能はそれほど優れた機能ではないようですが、/users/profile/dashboard/config のような特定のルートがある場合には非常に便利です。これは、profile-admin または user-config として覚えやすいでしょう。
ファサードに関するメモ:
- ファサードは、アプリケーションのサービス コンテナで使用できるクラスへの「静的」インターフェイスを提供します。
- これらは、手動で挿入または設定する必要がある長いクラス名を覚えなくても、Laravel の機能を使用できる簡潔で覚えやすい構文を提供します。
この Laravel フレームワークチュートリアルの上記のルート定義では、新しい Illuminate/Routing/Router オブジェクトを手動でインスタンス化し、そのオブジェクトの対応するメソッドを呼び出す代わりに、Route ファサードを使用します。 これは入力の手間を省くショートカットです。 ファサードは、Laravel フレームワーク全体で頻繁に使用されます。ファサードについては、もっとよく知ることができますし、そうすべきです。 ファサードのドキュメントはこちらからご覧いただけます こちら.
コントローラーとは?
コントローラーは、Laravel のベースとなっている「MVC」(モデル - ビュー - コントローラー) アーキテクチャの「C」にあたります。コントローラーの役割は、次のように簡単に定義できます。 クライアントからのリクエストを受信し、クライアントに応答を返します。 これは最低限の定義であり、特定のコントローラーの最小要件でもあります。 これら XNUMX つのことの間で行われることは、通常、コントローラー (または「ルートの実装」) の「アクション」とみなされます。 これは、アプリケーション (最初のエントリはリクエスト) へのクライアントへの XNUMX 番目のエントリ ポイントとして機能し、クライアントはリクエスト ペイロード (次に説明します) をアプリケーションに送信し、何らかのタイプの応答 (成功ページ、リダイレクト、エラー ページ、またはその他の種類の HTTP 応答)。
コントローラーは、そのルートがヒットしたときに、「アクション」として設定された匿名関数を使用したルート定義と (基本的に) 同じことを行います。 違いは、ルートが実際の URL 定義にインラインで定義されている一方で、コントローラーは懸念の分離を十分に維持していることです。これは基本的に、ルートに割り当てられた URI をルートの実装、またはそのルートが実行されたときに実行されるコードを結合していることを意味します。打つ。
たとえば、次の 2 つのコードは同じことを実現します。
例 #1: 単一のメソッド呼び出し内でのルートの定義と実装 (web.php ルート ファイル内)
//inside routes/web.php <?php Route::get('/hello-world', function(Request $request) { $name = $request->name; return response()->make("<h1>Hello World! This is ".$name, 200); });
例 #2: ルートの定義はroutes/web.php内にありますが、その実装は/app/Http/Controllers/HelloWorldControllerクラス内にあります
//inside routes/web.php <?php Route::get('/hello-world', 'HelloWorldController@index')->name('hello-world'); ------------------------------------------------------------------------------------ //inside app/Http/Controllers/HelloWorldController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class HelloWorldController extends Controller { public function index(Request $request) { $name = $request->name; return response()->make("<h1>Hello World! This is ".$name, 200); } }
Laravel の例 #2 はさらに多くの作業のように見えますが (実際はそうではありません。コードを少し追加するだけです)、代わりに指定された「hello-world」ルートのアクション ロジックをコントローラー内に配置することで得られる利点を見てください。ルートの定義をコールバック関数として使用します。
- 私たちのロジックは独自のクラスに明確に分離されています (関心事の分離)
- コントローラは、後で機能を追加する必要がある場合に拡張できるように設定されています。たとえば、「さよなら世界」機能を追加したいとします。この場合、コントローラの名前をより一般的な「HelloController」に変更し、2つの個別のメソッドを定義します。 こんにちは() と さようなら()。 また、 /こんにちは と / さようなら コントローラー上の適切なメソッドへの URI。 これは、コールバック関数として定義された各ルートの実装を使用してルート ファイルを太らせることに比べて、望ましい方法です。
- Laravel には、アプリケーション内のすべてのルート定義をキャッシュする機能が組み込まれているため、特定のルートを見つけるのにかかる時間が短縮されます (アプリケーションのパフォーマンスが向上します)。 しかし、 これを利用できるのは、アプリケーション内で定義されたすべてのルートがコントローラー固有のマッピングを使用して構成されている場合のみです (上記の例 2 を参照)
新しいコントローラーを生成するこのコマンドを実行してみましょう。
// ...inside the project's root directory: php artisan make:controller UploadController
基本的に、このコマンドが行うことは、/app/Http/Controllers/UploadController.php のメイン コントローラー ディレクトリ内に「UploadController」という名前のコントローラーのスタブを生成することです。そのファイルを開いて見てください。 これは、正しい名前空間パスとその拡張元の必要なクラスを備えたコントローラーのスタブアウトされたバージョンにすぎないため、非常に簡単です。
リクエストの生成
この PHP Laravel チュートリアルを進めて、UploadController の生成されたスタブにいくつか変更を加える前に、まずリクエスト クラスを作成する方が合理的だと思います。これは、リクエストを処理するコントローラー メソッドが、そのシグネチャでリクエスト オブジェクトに型ヒントを設定する必要があり、これにより、受信フォーム データを自動的に検証できるためです (rules() メソッドで指定されているとおりです。詳細は後述します)。ここでは、artisan コマンドを再度使用して、リクエスト スタブを生成しましょう。
php artisan make:request UploadFileRequest
このコマンドは、app/Http/Requests/UploadFileRequest 内に UploadFileRequest というファイルを生成します。 スタブを開いて覗いてみると、これは非常に単純で、authorize() と rules という XNUMX つのメソッドだけが含まれていることがわかります。
検証ロジックの作成
アプリケーションのニーズを満たすようにリクエスト スタブを変更しましょう。 次のようにファイルを変更します。
<?php namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class UploadFileRequest extends FormRequest { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'fileName' => 'required|string', 'userFile' => 'required|file' ]; } }
それほど多くの変更はありませんが、authorize() メソッドが false ではなく true を返すようになったことに注目してください。 このメソッドは、アプリケーションへのリクエストの送信を許可するかどうかを決定します。 false に設定すると、システム (通常はコントローラー上のメソッド) へのリクエストの入力が停止されます。 これは、ユーザーの承認チェックや、リクエストをコントローラーに転送できるかどうかを決定するその他のロジックを実行するのに非常に便利な場所です。 現時点では、ここでは true を返すだけで、あらゆるものにリクエストの使用を許可します。
もう XNUMX つのメソッド rules() は、検証に関してすべての魔法が発揮される場所です。 考え方はシンプルです。ルールのセットを含む配列を次の形式で返します。
'formFieldName' => 'constraints this field has separated by pipe characters (|)'
Laravelでは、すぐに使用できるさまざまな検証制約がサポートされています。それらの完全なリストについては、オンラインドキュメントをご覧ください。 こちらアップロード アプリケーションでは、フロント エンドのフォームから POST リクエストを介して渡されるフィールドが 2 つあります。fileName パラメータはフォーム本体内に含める必要があり (つまり必須)、ストレージにファイルを保存するファイル名として使用されます (これはコントローラで行われます。これについては後で説明します)。また、パイプ文字 (|) と単語 'string' を追加して、ファイル名が文字列である必要があることも指定します。制約は常にパイプで区切られるため、特定のフィールドに対する追加の条件を 1 行で指定できます。これはすごいことです。
XNUMX 番目のパラメーター userFile は、ユーザーが Web ページ上のフォームからアップロードする実際のファイルです。 UserFile も必須であり、 しなければなりません ファイルであること。 ご注意: アップロードされるファイルが画像であることが予想される場合は、代わりに画像制約を使用します。これにより、受け入れられるファイル タイプが一般的な画像タイプ (jpeg、png、bmp、gif、または svg) の XNUMX つに制限されます。 ユーザーがあらゆる種類のファイルをアップロードできるようにしたいため、ファイル検証の制約だけを守ります。
request オブジェクトに関する情報はこれですべてです。 その主な仕事は、アプリケーションをさらに深く進めるためにフォームの本体パラメーターが満たさなければならない許容可能な基準 (制約) のセットを保持することです。 もう XNUMX つ注意すべき点は、これら XNUMX つのフィールド (userFile と filename) も、HTML コード内で入力フィールドの形式で指定する必要があることです (フィールド名はリクエスト オブジェクト内の名前に対応します)。
「確かにこれはフォームリクエストに含めるべきものの特性を定義しますが、これらの制約の実際のチェックはどこで行われるのでしょうか?」と疑問に思われるかもしれません。 次にそれについて説明します。
コントローラーの変更
app/Http/Controllers/UploadController を開き、次の変更を加えます。
<?php namespace App\Http\Controllers; use Illuminate\Contracts\Container\BindingResolutionException; use Illuminate\Http\Request; use App\Http\Requests\UploadFileRequest; //our new request class use Illuminate\Support\Facades\Storage; class UploadController extends Controller { /** * This is the method that will simply list all the files uploaded by name and provide a * link to each one so they may be downloaded * * @param $request : A standard form request object * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @throws BindingResolutionException */ public function list(Request $request) { $uploads = Storage::allFiles('uploads'); return view('list', ['files' => $uploads]); } /** * @param $file * @return \Symfony\Component\HttpFoundation\BinaryFileResponse * @throws BindingResolutionException */ public function download($file) { return response()->download(storage_path('app/'.$file)); } /** * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * @throws BindingResolutionException */ public function upload() { return view('upload'); } /** * This method will handle the file uploads. Notice that the parameter's typehint * is the exact request class we generated in the last step. There is a reason for this! * * @param $request : The special form request for our upload application * @return array|\Illuminate\Http\UploadedFile|\Illuminate\Http\UploadedFile[]|null * @throws BindingResolutionException */ public function store(UploadFileRequest $request) { //At this point, the parameters passed into the $request (from form) are //valid--they satisfy each of the conditions inside the rules() method $filename = $request->fileName; //parameters have already been validated $file = $request->file('userFile'); //that we don't need any additional isset() $extension = $file->getClientOriginalExtension(); //grab the file extension $saveAs = $filename . "." . $extension; //filename to save file under $file->storeAs('uploads', $saveAs, 'local'); //save the file to local folder return response()->json(['success' => true]); //return a success message } }
したがって、アップロードされたファイルをディスクに保存するのは非常に簡単な方法です。 上記の Upload() メソッドの内訳は次のとおりです。
- 受信データを自動検証できるように、「肉とジャガイモ」機能を実行するコントローラー メソッド内のリクエスト クラスにタイプヒントを追加します。
- コントローラー メソッド内の (現在検証済みの) リクエスト オブジェクトからファイルを取得します (この例では、upload() という名前を付けていますが、store() のような、より標準化された名前を付けることもできます)。
- リクエストからファイル名を取得します
- ファイルを保存するために使用される最終的なファイル名を生成します。 getClientOriginalExtension() メソッドは、アップロードされたファイルの元の拡張子を取得するだけです。
- storeAs() メソッドを使用してファイルをローカル ファイルシステムに保存し、最初の引数として /storage ディレクトリ内の名前付きパスを渡し、1 番目の引数としてファイルを保存するファイル名を渡します。
- リクエストが成功したことを示す JSON レスポンスを返します
ブレードテンプレート
このパズルの最後の主要ピースはブレード テンプレートです。このテンプレートには、このシンプルなアプリケーションのすべての HTML、CSS、および JavaScript が格納されます。コードは次のとおりです。後ほど説明します。
<body> <h1>Upload a file</h1> <form id="uploadForm" name="uploadForm" action="{{route('upload')}}" enctype="multipart/form-data"> @csrf <label for="fileName">File Name:</label> <input type="text" name="fileName" id="fileName" required /><br /> <label for="userFile">Select a File</label> <input type="file" name="userFile" id="userFile" required /> <button type="submit" name="submit">Submit</button> </form> <h2 id="success" style="color:green;display:none">Successfully uploaded file</h2> <h2 id="error" style="color:red;display:none">Error Submitting File</h2> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> $('#uploadForm').on('submit', function(e) { e.preventDefault(); var form = $(this); var url = form.attr('action'); $.ajax({ url: url, type: "POST", data: new FormData(this), processData: false, contentType: false, dataType: "JSON", success: function(data) { $("#fileName").val(""); $("#userFile").val(""); } }).done(function() { $('#success').css('display', 'block'); window.setTimeout(()=>($("#success").css('display', 'none')), 5000); }).fail(function() { $('#error').css('display', 'block'); window.setTimeout(()=>($("#error").css('display', 'none')), 5000); }); }); </script> </body> </html>
これが私たちのものです / アップロード ページは次のようになります:
これは、HTMLフォームとJavaScript/jQueryを含むブレードファイルの典型的な例で、非同期機能(ページが更新されないようにする)を追加します。基本的なメソッド属性を持たないタグ(これについては後で説明します)と、{{route('file.upload')}}という値を持つ奇妙なアクション属性があります。ブレードでは、これは 指令。 ディレクティブは関数の別名です。ブレードテンプレートに固有の関数で、WebページやWebアプリケーションの構築に共通するさまざまな操作を実行します。ブレードで実行できるすべてのクールな機能について理解を深めるには、ドキュメントをご覧ください。 こちら。 上の例では、ルート ディレクティブを使用してフォーム送信用の URL を生成しています。
先ほど、アプリケーション内の web.php ファイル内でルートを定義し、各ルートに覚えやすい名前を指定したことを思い出してください。 {{route()}} ディレクティブはルートの名前を受け取り、内部的にキャッシュされたルート リスト内でそれを検索し、web.php ファイル内のそのルートの定義に基づいて完全な URL を生成します。 この最初のケースでは、フォームが送信されたデータをアプリケーションの /process URL に送信するように指定しています。これは、 POST ルートのようにリストされたキーがあります。
次に気づいた奇妙な点は、開始フォーム タグのすぐ下にある @csrf タグです。 ブレードでは、このタグはフォーム上に _token パラメーターを生成します。このパラメーターは、フォーム データの処理が許可される前にアプリケーション内でチェックされます。 これにより、フォーム内のデータが有効な発信元のものであることが保証され、クロスサイト リクエスト フォージェリ攻撃が防止されます。 これについて詳しくは、を参照してください。 ドキュメント.
この後、通常どおりフォームを定義しますが、フォームパラメータの名前である userFile と fileName が まったく同じ リクエストオブジェクト内で定義されているとおりです。 リクエスト オブジェクトに定義されている特定のパラメーターの入力を含めるのを忘れた場合 (またはスペルを間違えた場合)、リクエストは失敗してエラーが返され、元のフォーム リクエストが UploadController@ にあるコントローラー メソッドに到達することができなくなります。プロセス 。
試してみて、このフォームを使用していくつかのファイルをアプリケーションに送信してください。 その後、次の場所に移動します。 /リスト ページにアクセスすると、アップロード フォルダーの内容が表示され、アップロードしたファイルが表にリストされます。
大きな画像
一歩下がって、この Laravel チュートリアルで行ったことを見てみましょう。
この図は、現時点でのアプリケーションを表しています (高レベルの詳細は除外されています)。
この Laravel チュートリアルの初めに作成したリクエスト オブジェクトには、ブレード テンプレートのフォームにあるものと同じパラメータが rules メソッドで定義されている必要があることを思い出してください (まだの場合は、セクション「検証ロジックの作成」を読み直してください)。 。 ユーザーは、ブレード テンプレート エンジンを介してレンダリングされる Web ページにフォームを入力し (もちろん、このプロセスは自動操縦されるため、考える必要さえありません)、フォームを送信します。 テンプレートの下部にある jQuery コードは、デフォルトの送信 (別のページに自動的にリダイレクトされます) を停止し、Ajax リクエストを作成し、リクエストにフォーム データをロードしてファイルをアップロードし、全体を最初のレイヤーに送信します。アプリケーション: リクエスト。
リクエスト オブジェクトは、 rules() メソッド内のパラメータを送信されたフォーム パラメータに関連付けることによって設定され、指定された各ルールに従ってデータが検証されます。 すべてのルールが満たされると、リクエストはルート ファイル web.php で定義された値に対応するコントローラー メソッドに渡されます。 この場合、作業を行うのは UploadController の process() メソッドです。 コントローラーに到達すると、リクエストが検証に合格したことがすでにわかっているため、指定されたファイル名が実際に文字列であるか、または userFile パラメーターが実際に何らかのタイプのファイルを保持しているかどうかを再テストする必要はありません…次のように続行できます。普通。
次に、コントローラー メソッドは、リクエスト オブジェクトから検証済みのパラメーターを取得し、渡された fileName パラメーターと userFile の元の拡張子を連結して完全なファイル名を生成し、そのファイルをアプリケーションのディレクトリ内に保存して、単純な JSON エンコードされたファイルを返します。リクエストが成功したことを確認するレスポンス。 応答は jQuery ロジックによって受信され、成功 (またはエラー) メッセージを 5 秒間表示して非表示にしたり、以前のフォーム エントリをクリアしたりするなど、さらにいくつかの UI 関連のタスクを実行します。これはユーザーにわかるようにするためです。リクエストが成功したことを確認し、必要に応じて別のファイルをアップロードできます。
また、上の図で、クライアントとサーバーの間に線が引かれている場所にも注意してください。この概念は理解しておくことが非常に重要であり、たとえば、特定の時点で発生する可能性のある複数の非同期リクエストを処理するときに将来発生する可能性のある問題を解決するのに役立ちます。分離は、リクエスト オブジェクトの境界で行われます。リクエスト オブジェクト自体は、アプリケーションの残りの部分への「ゲートウェイ」と考えることができます。Web ブラウザーから渡されたフォーム値の初期検証と登録を行います。有効であると判断された場合は、コントローラーに進みます。それ以前のすべてはフロント エンドにあります (「クライアント」は文字通り「ユーザーのコンピューター上」を意味します)。応答はアプリからクライアント側に返され、jQuery コードが辛抱強く応答の到着を待機し、応答を受信するといくつかの簡単な UI タスクを実行します。
90 以上の重要なよくある質問をカバーしました。 Laravel と PHP 関連の面接での質問 新人だけでなく経験豊富な候補者も適切な仕事に就くことができます。