初心者のためのLaravelチュートリアル
⚡ スマートサマリー
Laravelは、Taylor Otwell氏によって開発されたオープンソースのPHP MVCフレームワークで、Webアプリケーションを迅速かつクリーンに構築できます。このチュートリアルでは、Laravelとは何か、Composerを使ったインストール方法、そしてルーティング、コントローラー、フォームリクエストの検証、Bladeテンプレートを使用して動作するファイルアップロードアプリの構築方法を説明します。

Laravelとは何ですか?
ララベル は、PHP 用のオープンソース Web MVC フレームワークです。 Laravel は、専用の依存関係マネージャーを備えたモジュラー パッケージング システム、リレーショナル データベースへのアクセス、アプリケーションの展開とメンテナンスのためのその他のユーティリティなどの機能を備えた、PHP Web アプリケーションの簡単な開発を提供する堅牢なフレームワークです。
LaravelはTaylor Otwellによって開発されました。2011年6月の初回リリース(バージョン1)以来、Web開発業界のPHPフレームワーク分野で着実に人気を高めてきました。この人気の大きな要因は、開発者の利便性を重視した多くの機能が標準搭載されていることにあります。
なぜララベルなのか?
2000年頃、ほとんどの PHP コード 手続き型であり、スパゲッティ コードが複雑に絡み合った「スクリプト」の形で見つかる可能性がありました。 最も単純なページでも、 関心事の分離そのため、アプリケーションがあっという間にメンテナンスの悪夢へと発展してしまうことは容易でした。世界はより良いものを求めていました。そこで登場したのがPHPバージョン5と、さまざまなPHPフレームワークです。これらは、Webアプリケーションの様々な課題に対し、切望されていた構造とより良い解決策をもたらそうと試みました。
それ以来、今日広く使われているフレームワークの先駆けとなる多くのフレームワークがリリースされてきました。現在、トップ3は(私たちの意見では)Zend Framework、Symfony、そしてもちろんLaravelです。これらのフレームワークはそれぞれ似たような原則に基づいており、(基本的に)同じ共通の問題を解決することを目的としていますが、その主な違いは実装方法にあります。それぞれが問題解決の方法について独自のやり方を持っています。それぞれのフレームワークが生成するコードを見ると、互いに明確な違いがあることがわかります。私たちのささやかな意見では、Laravelフレームワークが最高です。
トプカプ宮殿についての詳細 Laravelと Codeイグナイター.
Composer を使って Laravel をダウンロードしてインストールする方法
注意: このチュートリアルはLaravel 5.8向けに書かれていますが、ルーティング、コントローラー、リクエスト、Bladeの概念は現在のリリースでも同じです。2026年現在、最新バージョンはLaravel 13(2026年3月リリース)で、PHP 8.3以降が必要です。一方、Laravel 12はPHP 8.2が必要です。
注意: ローカルシステムにPHPが既にインストールされていることを前提としています。インストールされていない場合は、インストール方法を参照してください。 こちら.
Composer はパッケージと依存関係の両方を管理するものです。インストールするには、ターミナルを開いて新しいディレクトリに移動します。次のコマンドを実行します。
curl -Ss getcomposer.org/installer | php
このコマンドの結果は次のようになります。
注意: Laravelのセットアップに関するより詳細な手順については、Laravelのドキュメントを参照してください。 こちら.
これで、Laravelのインストールに使用するcomposer.pharスクリプトのダウンロードとコンパイルが行われます。新しいLaravelアプリケーションをセットアップする方法は数多くありますが、ここではLaravel composerスクリプトを使用します。このスクリプトをインストールするには、以下を実行してください。
composer global require laravel/installer
これは次のようになります。
これにより、フレームワークファイル自体と、それに必要なすべての依存関係がダウンロードされ、インストールされます。パッケージはvendorディレクトリ内に保存されます。ダウンロードとインストールが完了したら、次のコマンドを実行するだけで簡単に使用できます。
laravel new uploadApp
次のような出力が表示されます。
ComposerがLaravelの実行に必要なすべてのパッケージをインストールしています。数分かかる場合がありますので、しばらくお待ちください。インストールが完了したら、ls -alコマンドを実行してインストールされたパッケージを確認してください。
一般的な Laravel アプリケーションのディレクトリの簡単な内訳は次のとおりです。
- アプリ/ : ここはアプリケーションコードが格納されているソースフォルダです。すべてのコントローラー、ポリシー、モデルはこのフォルダ内にあります。
- ブートストラップ/ : アプリケーションの起動スクリプトといくつかのクラスマップファイルが格納されています。
- 設定/ : アプリの設定ファイルが格納されます。これらのファイルは通常直接変更されることはなく、アプリのルートにある .env (環境) ファイルで設定された値に依存します。
- データベース/ : マイグレーション、シード、テストファクトリなどのデータベースファイルが格納されます。
- 公共/ : コンパイル済みのアセットと、もちろんindex.phpファイルが格納された、一般公開可能なフォルダ。
- リソース/ : フロントエンドアセットが含まれています。 Javaスクリプトファイル、言語ファイル、CSS/SASSファイル、およびアプリケーションで使用されるすべてのテンプレート(ブレードテンプレートと呼ばれる)。
- ルート/ : アプリケーション内のすべてのルートはここにあります。ルートにはいくつかの異なる「スコープ」がありますが、ここではweb.phpファイルに焦点を当てます。
- ストレージ/ : アプリケーションが使用するすべての一時キャッシュファイル、セッションファイル、コンパイル済みビュースクリプト、およびログファイル。
- テスト/ : 単体テストや機能テストなど、アプリケーションのテストファイルが含まれています。
- ベンダー/ : すべての依存パッケージはComposerでインストールされました。
それでは、残りのアプリケーションをビルドして、特別な Artisan コマンドで実行してみましょう (Apache や nginx のような Web サーバーのインストールと設定の手間を省くためです)。.env ファイルには、/config ディレクトリ内のファイルがアプリケーションを設定するために使用するすべての設定値が含まれています。
アプリケーション設計: 要件の簡単な概要
このオンライン Laravel チュートリアルでは、次の XNUMX つのことだけを行う非常に単純なアプリケーションを構築します。
- Web フォームからのファイルのアップロードを処理する
- 以前アップロードしたファイルを別のページに表示する。
このプロジェクトでは、アプリケーションは書き込み専用となります。つまり、ユーザーはファイルの書き込みと、アップロードしたファイルの一覧表示のみが可能です。このアプリケーションは非常に基本的なものですが、Laravelのスキルと知識を習得するための良い練習となるでしょう。簡潔さを期すため、データベースモデリング、マイグレーション、認証は省略していますが、実際のアプリケーションでは、これらも考慮する必要があります。
アプリケーションを期待どおりに動作させるために必要なコンポーネントのリストを次に示します。
- A route これにより、外部(インターネット)からアプリケーションを利用できるようになるだけでなく、アップロードされたファイルを保存するロジックが配置されている場所を示すエンドポイントも指定されます。
- A コントローラ リクエストからレスポンスまでのフローを処理する。
- A template これは、以前にアップロードされたファイルのリストと、実際のアップロードフォーム自体を表示するために使用されます。
- A 要求 コントローラーがWebフォームから渡されたデータを検証するために使用するものです。
ルートとは何ですか?
Laravelにおけるルートとは、基本的にURIで指定されるエンドポイントであり、アプリケーションが提供する機能への「ポインタ」として機能します。最も一般的なのは、ルートがコントローラーのメソッドを指し、そのURIにアクセスできるHTTPメソッドを指定することです。ルートは必ずしもコントローラーのメソッドを指すとは限らず、定義済みのクロージャや匿名関数にアプリケーションの実行を渡す場合もあります。
ルートを使用する理由とは?
ルートは、プロジェクトのルート ディレクトリ内の /routes フォルダーの下のファイルに保存されます。デフォルトでは、アプリケーションのさまざまな「側面」に対応するいくつかの異なるファイルがあります (「側面」は六角形アーキテクチャ手法に由来します)。これには次のものが含まれます。
- web.php: 公開ブラウザベースのルート。これらは最も一般的で、Web ブラウザがアクセスするものです。これらは Web ミドルウェア グループを介して実行され、以下の機能も含まれています。 CSRF対策 (これはフォームベースの悪意のある攻撃から防御するのに役立ちます)そして一般的にある程度の「状態」を含みます(ここで言う「状態」とはセッションを利用することを意味します)。
- api.php: APIグループに対応するルートであり、デフォルトでAPIミドルウェアが有効になっています。これらのルートはステートレスであり、セッションやリクエスト間のメモリ共有はありません(1つのリクエストが他のリクエストとデータやメモリを共有せず、それぞれが自己カプセル化されています)。
- console.php: これらのルートは、アプリ用に作成したカスタム Artisan コマンドに対応しています。
- channels.php: イベント放送用のルートを登録します。
現時点で注目すべき重要なファイルは、ブラウザ固有のファイルであるweb.phpです。デフォルトでは既に1つのルートが定義されており、これはアプリケーションのウェブルート(publicディレクトリ内)に移動した直後にアクセスするルートです。アップロードアプリケーションを機能させるには、3つの異なるルートが必要になります。
- /upload: これは、ファイルアップロード用のウェブフォームを表示するメインページのURIになります。
- /process: これは、/upload URI にあるフォームが送信したデータを送信する場所になります (フォームの「アクション」)。
- /list: このサイトには、アップロードされたすべてのファイルが表示されます。
注意: アップロードフォームとファイル一覧を表示するロジックをすべて1つのページにまとめる場合は、/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()) を使用して、routes ファイル web.php に明示的にリストします。これらの各メソッドの詳細については、以下を参照してください。 この これらのメソッドは、指定されたルートへのアクセスを許可する HTTP 動詞を指定します。ルートが複数の HTTP 動詞を受け入れる必要がある場合(これは、初期データの表示と送信されたフォームデータの送信の両方に単一のページを使用する場合に該当します)、Route::any() メソッドを使用できます。
Route::get() メソッドと Route::post() メソッド (および Route ファサード上の他の HTTP 動詞関連メソッド) の 2 番目の引数は、特定のコントローラの名前と、そのコントローラ内にあり、許可された HTTP リクエスト (GET、POST、PATCH など) でルートのエンドポイントにアクセスしたときに実行されるメソッドです。ここでは、すべてのルートに UploadController を使用しており、次のように指定しています。
各ルートで最後に呼び出すメソッドは、name() 関数です。この関数は引数として単一の文字列を受け取り、特定のルートを覚えやすい名前 (この例では upload、process、list) で「タグ付け」するために使用されます。各ルートに独自の名前を付けることは、それほど優れた機能ではないように思えるかもしれませんが、 URL 名前は全く同じですが、/users/profile/dashboard/config のような特定のルートがある場合に非常に便利です。profile-admin や user-config のように覚えやすい名前になります。
ファサードに関する注記:
- ファサードは、アプリケーションのサービスコンテナ内で利用可能なクラスへの「静的」インターフェースを提供します。
- これらは、手動で挿入または設定する必要がある長いクラス名を覚えなくても、Laravel の機能を使用できる簡潔で覚えやすい構文を提供します。
上記のルート定義では、新しい Illuminate/Routing/Router オブジェクトを手動でインスタンス化してそのオブジェクトの対応するメソッドを呼び出す代わりに、Route ファサードを使用しています。これは単に時間を節約するショートカットです。pingLaravelフレームワークではファサードが多用されています。ファサードについてもっとよく理解しておくべきです。ファサードのドキュメントは以下にあります。 こちら.
コントローラーとは?
コントローラーは、Laravel のベースとなっている「MVC」(モデル - ビュー - コントローラー) アーキテクチャの「C」にあたります。コントローラーの役割は、次のように簡単に定義できます。 クライアントからのリクエストを受け取り、クライアントにレスポンスを返します。 これは最低限の定義であり、あらゆるコントローラーの最低限の要件でもあります。この2つの要素の間にある処理は、一般的にコントローラーの「アクション」(または「ルートの実装」)とみなされます。クライアントにとって、アプリケーションへの2番目の入り口(最初の入り口はリクエスト)として機能し、クライアントはリクエストペイロード(これについては後述します)をアプリケーションに送信し、何らかのレスポンス(成功ページ、リダイレクト、エラーページ、またはその他の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 つの別々のメソッドを定義します。 こんにちは() (NAIST) と さようなら()。 また、 /こんにちは (NAIST) と / さようなら URIをコントローラー上の適切なメソッドに渡します。これは、各ルートの実装をコールバック関数として定義してルーティングファイルを肥大化させるよりも望ましい方法です。
- Laravel には、アプリケーション内のすべてのルート定義をキャッシュする機能が組み込まれているため、特定のルートを見つけるのにかかる時間が短縮されます (アプリケーションのパフォーマンスが向上します)。 しかし、 アプリケーション内の定義されたすべてのルートがコントローラー固有のマップを使用して構成されている場合にのみ、その機能を利用できます。pings(上記の例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() という 2 つのメソッドしか含まれていない、非常にシンプルなファイルであることがわかるでしょう。
検証ロジックの作成
アプリケーションのニーズに合わせてリクエストスタブを修正しましょう。ファイルを以下のように変更してください。
<?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 を返すことで、あらゆるものがリクエストを使用できるようにしています。
もう1つのメソッドである rules() は、検証に関してすべての魔法が発揮される部分です。その考え方はシンプルです。次の形式のルールセットを含む配列を返します。
'formFieldName' => 'constraints this field has separated by pipe characters (|)'
Laravelでは、すぐに使用できるさまざまな検証制約がサポートされています。それらの完全なリストについては、オンラインドキュメントをご覧ください。 こちらアップロードアプリケーションでは、フロントエンドのフォームから POST リクエストで渡されるフィールドが 2 つあります。fileName パラメータはフォーム本文内に含める必要があり (必須)、ストレージにファイルを保存する際のファイル名として使用されます (これはコントローラーで行います。後ほど説明します)。また、ファイル名が文字列である必要があることを指定するために、パイプ文字 (|) と「string」という単語を追加します。制約は常にパイプで区切られるため、指定されたフィールドに対する追加の条件を 1 行で指定できます。
2 番目のパラメータ userFile は、ユーザーがウェブページのフォームからアップロードする実際のファイルです。userFile は必須であり、 しなければなりません ファイルであること。 注意: アップロードされるファイルが画像ファイルであることを想定している場合は、画像制約を使用します。これにより、受け入れ可能なファイル形式は一般的な画像形式(jpeg、png、bmp、gif、svg)のいずれかに限定されます。しかし、ユーザーがあらゆる種類のファイルをアップロードできるようにしたいので、ファイル検証制約のみを使用します。
リクエストオブジェクトについては、以上がほぼ全てです。その主な役割は、アプリケーションの処理を進めるためにフォームの本文パラメータが満たすべき許容条件(制約)を保持することです。また、userFileとfileNameの2つのフィールドは、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 process(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'); //so 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
}
}
つまり、アップロードされたファイルをディスクに保存するには、かなり簡単な方法です。上記の process() メソッドの詳細な説明は以下のとおりです。
- メイン機能を実行するコントローラーメソッド内でリクエストクラスの型ヒントを指定することで、受信データの自動検証が可能になります。
- コントローラーメソッド内で、(検証済みの)リクエストオブジェクトからファイルを取得します。
- リクエストからファイル名を取得します。
- ファイルを保存するために使用される最終的なファイル名を生成します。 getClientOriginalExtension() メソッドは、アップロードされたファイルの元の拡張子を取得するだけです。
- storeAs() メソッドを使用してファイルをローカル ファイルシステムに保存し、最初の引数として /storage ディレクトリ内の名前付きパスを渡し、1 番目の引数としてファイルを保存するファイル名を渡します。
- リクエストが成功したことを示すJSONレスポンスを返します。
ブレードテンプレート
このパズルの最後の重要なピースはブレードテンプレートで、すべての HTML、CSS、および Javaシンプルなアプリケーションのスクリプトです。コードは以下のとおりです。後ほど説明します。
<body>
<h1>Upload a file</h1>
<form id="uploadForm" name="uploadForm" action="{{route('process')}}" 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 フォームと Java非同期機能を追加するためのスクリプト/jQuery(ページがリロードされないようにするため)。メソッド属性のないタグ(これについては後ほど説明します)と、値が {{route('process')}} という奇妙なアクション属性を持つタグ。 Blade では、これは 指令。 ディレクティブとは、関数の別名です。これらはBladeテンプレートに固有の関数で、WebページやWebアプリケーションの構築に共通するさまざまな操作を実行します。Bladeの便利な機能について詳しく知りたい場合は、ドキュメントを参照してください。 こちら上記の場合、ルートディレクティブを使用して、 URL フォーム送信のため。
アプリケーションのweb.phpファイル内で、以前にルートを定義し、それぞれに覚えやすい名前を付けたことを思い出してください。{{route()}}ディレクティブはルート名を受け取り、内部キャッシュされたルートリストからその名前を検索し、完全なルート情報を生成します。 URL web.php ファイル内のそのルートの定義に基づいています。この最初のケースでは、フォームが送信したデータを /process に送信するように指定しています。 URL 当社のアプリケーションは、 POST ルートのようにリストされたキーがあります。
次に気づいたのは、開始フォーム タグのすぐ下にある @csrf タグです。Blade では、このタグはフォームに _token パラメータを生成し、フォーム データが処理される前にアプリケーション内でチェックされます。これにより、フォーム内のデータが有効なオリジンであることを保証し、クロスサイト リクエスト フォージェリ攻撃を防ぎます。詳細については、以下を参照してください。 ドキュメント.
この後、通常通りフォームを定義しますが、フォームパラメータのuserFileとfileNameの名前は、 まったく同じ リクエストオブジェクト内で定義されているとおりです。リクエストオブジェクトで定義されている特定のパラメータの入力を忘れた場合(またはスペルミスがあった場合)、リクエストは失敗し、エラーが返されるため、元のフォームリクエストが UploadController@process にあるコントローラメソッドに到達することはありません。
ぜひ試してみてください。このフォームを使用してアプリケーションにいくつかのファイルを送信してください。その後、 /リスト ページにアクセスすると、アップロード フォルダーの内容が表示され、アップロードしたファイルが表にリストされます。
大きな画像
少し立ち止まって、このLaravelチュートリアルで何をしてきたのかを振り返ってみましょう。
この図は、現在のアプリケーションの状態を示しています(詳細な情報は省略)。
この Laravel チュートリアルの冒頭で作成したリクエスト オブジェクトには、ブレード テンプレートのフォームで定義されているものと同じパラメーターが rules メソッドで定義されている必要があることを思い出してください (そうでない場合は、「検証ロジックの作成」のセクションを読み直してください)。ユーザーは、ブレード テンプレート エンジンによってレンダリングされる Web ページのフォームに入力し、フォームを送信します。テンプレートの下部にある jQuery コードは、デフォルトの送信 (自動的に別のページにリダイレクトされます) を停止し、Ajax リクエストを作成し、フォーム データとアップロードされたファイルでリクエストを読み込み、すべてをアプリケーションの最初のレイヤーであるリクエストに送信します。
リクエストオブジェクトは、rules() メソッド内のパラメータを送信されたフォームパラメータと関連付けることで作成され、指定された各ルールに従ってデータが検証されます。すべてのルールが満たされると、リクエストはルートファイル web.php で定義された値に対応するコントローラメソッドに渡されます。この場合、UploadController の process() メソッドが処理を実行します。コントローラに到達した時点で、リクエストが検証に合格したことがわかっているため、指定されたファイル名が実際に文字列であるかどうか、または userFile パラメータに実際に何らかのファイルが格納されているかどうかを再テストする必要はありません。通常どおり処理を続行できます。
コントローラーメソッドは、リクエストオブジェクトから検証済みのパラメータを取得し、渡された fileName パラメータと userFile の元の拡張子を連結して完全なファイル名を生成し、アプリケーション内のディレクトリにファイルを保存した後、リクエストが成功したことを示すシンプルな JSON エンコードのレスポンスを返します。このレスポンスは jQuery ロジックによって受信され、成功 (またはエラー) メッセージを 5 秒間表示してから非表示にする、以前のフォームエントリをクリアするなど、UI 関連のタスクがいくつか実行されます。これにより、ユーザーはリクエストが成功したことを確実に確認でき、必要に応じて別のファイルをアップロードできます。
また、上記の図でクライアントとサーバーの境界線がどこに引かれているかにも注意してください。この概念を理解することは非常に重要であり、例えば、いつでも発生する可能性のある複数の非同期リクエストを処理する際に、将来発生する可能性のある問題や課題を解決するのに役立ちます。分離はリクエストオブジェクトの境界にあります。リクエストオブジェクト自体は、アプリケーションの残りの部分への「ゲートウェイ」と考えることができます。Webブラウザから渡されたフォーム値の初期検証と登録を行います。値が有効と判断された場合、コントローラに進みます。それ以前のすべてはフロントエンド(「クライアント」とは文字通り「ユーザーのコンピュータ上」を意味します)にあります。応答はアプリからクライアント側に返され、そこでjQueryコードが応答の到着を辛抱強く待ち、応答を受け取るといくつかの簡単なUIタスクを実行します。
また、よくある質問にも多数対応しました。 Laravel と PHP 関連の面接での質問 新人だけでなく経験豊富な候補者も適切な仕事に就くことができます。







