laravel HTTPリクエストまわり 調べてみた

laravelのHTTPリクエストに関して

laravelのリクエストは、public/index.php内でIlluminate/Http/Requestのインスタンスとして取得できます。

その後、HTTPカーネルのhandleメソッドを利用してアプリケーション内での呼び出しが可能になります。

public/index.phpの一部

$response = tap($kernel->handle( $request = Request::capture() ))->send();

リクエストをコントローラー内で参照するには、

①Requestファザード

②Requestオブジェクト

③フォームリクエスト

の3通りのやり方があります。

 

Requestファザード

use Illuminate\Support\Facades\Request;

$id = Request::get('id');

Requestファザードは、config/app.phpにエイリアスとして指定してあるように、実態はIlluminate Support\Facades\Requestになります。

その為、使用する時もuse Illuminate Support\Facades\Requestをします。

上記では、getメソッドを利用してリクエストの値を取得する方法を載せていますが、getメソッド以外にもallメソッドやfindメソッドなど様々なメソッドを使用できます。

 

Requestオブジェクト

use Illuminate\Http\Request; ・・・①

class HomeController extends Controller
{
    public function show(Request  $request) { ・・・②
        $id = $request->get('id'); ・・・③
    }
}

Requestオブジェクトは、上記のRequestファザードの実態を直接使用した形になります。

①Requestクラスをインポートします。

②引数にRequestをタイプヒンティングで渡し、インスタンスを作成します。

③今回の例では、getメソッドでidを取得しています。

実態はRequestファザードと同様のものを使用しているので、Requestファザードで使用できるメソッドはRequestオブジェクトでも使用できます。

 

フォームリクエスト

フォームリクエストは、値の取得のタイミングでバリデーションや認証機能などを使用できるリクエストです。

Illuminate\Fundation\Providers\FormRequestServiceProviderに全体の仕組みが記載されています。

Illuminate\Fundation\Providers\FormRequestServiceProvider.php

<?php
namespace Illuminate\Foundation\Providers;
use Illuminate\Contracts\Validation\ValidatesWhenResolved;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Routing\Redirector;
use Illuminate\Support\ServiceProvider;

class FormRequestServiceProvider extends ServiceProvider
{
 public function register()
 {
 //
 }

 public function boot()
 {
   $this->app->afterResolving(ValidatesWhenResolved::class, function ($resolved) {
   $resolved->validateResolved(); ・・・①
   });

   $this->app->resolving(FormRequest::class, function ($request, $app) {
   $request = FormRequest::createFrom($app['request'], $request);

   $request->setContainer($app)->setRedirector($app->make(Redirector::class));
   });
 }
}

①のvalidateResolved内で作成したrulesメソッドで渡される配列を利用してバリデーションが行われます。

肝心のrulesメソッドは、Illuminate\Fundation\Http\FormRequestクラスを継承したクラス内で宣言されます。

クラスは以下コマンドで作成することができます。

php artisan make:request ファイル名

以下作成されたファイルになります。

app\Requests\UserRegister.php

<?phpnamespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class userRegister extends FormRequest ・・・①
{

 public function authorize() ・・・②
 {
   return false;
 }

 public function rules() ・・・③
 {
   return [
     'name' => 'required | string | max:255',
     'email' => [
       'required',
       'string',
       'email',
       'max:255',
     ]
   ];
 }
}

①Illuminate\Fundation\Http\FormRequestクラスを継承したクラスが作成されます。

②認証に関する設定ができます。認証が必要でなければ、trueにします。

③バリデーションのルールを配列で記載します。

これで、フォームリクエストで設定するものは完了しました。

次に作成したフォームリクエストをコントローラー内で使用します。

やり方は、Requestオブジェクトを使用した時と変わりません。

use App\Http\Requests\UserRegister; ・・・①

class HomeController extends Controller
{
    public function show(UserRegister  $request) { ・・・②
        $name = $request->get('name'); ・・・③
    }
}

①UserRegisterをインポートします。

②UserRegisterをタイプヒンティングでインスタンス化します。

③今回の場合では、getメソッドで値を取得しています。

 

以上!!!!!!!