LaravelのRequest/Responseを深掘り

はじめに

LaravelのRequest/Responseの仕組みがよくわからなかったので深掘ります。

セットアップ

Controller.phpの確認

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;

class Controller extends BaseController
{
  use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
  
  public function index()
  {
      return view('index');
  }
}

コントローラ作成

$ php artisan make:controller TestsController
Controller created successfully.

TestsController.phpの編集

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Database\Eloquent\Model;

class TestsController extends Controller

{

  public function index(){

    $data = ['ttl'=>'Hello TestsController']; 
    return view('tests.index',$data);

  }

}

tests/index.blade.php

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- CSRF Token -->
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <title>{{ config('app.name', 'Laravel') }}</title>
</head>

<body>
  <h1>{{$ttl}}</h1>
</body>

</html>

web.php

Route::get('/test', 'TestsController@index'); // 上に配置する
Route::get('/{any}', "Controller@index")->where('any','.*');

http://127.0.0.1:8000/test

Request、Responseインスタンスを出力する

TestsController.php

public function reqres(Request $req, Response $res){

  $data = [
    'req'=>$req,
    "res"=> $res,
    "url"=>$req->url(),
    "status"=>$res->status()
  ];
  return view('tests.reqres',$data);
}

web.php

Route::get('/test/reqres', 'TestsController@reqres');

tests/reqres.blade.php

<body>
  <h1>Request</h1>
    {{$req}}
  <h1>Request method</h1>
    {{$url}}
  <h1>Response</h1>
    {{$res}}
  <h1>Response method</h1>
    {{$status}}
</body>

http://127.0.0.1:8000/test/reqres

クエリパラメータを使う

web.php

Route::get('/test/testreq/{query?}', 'TestsController@query');

query.blade.php

<body>
  <h1>Test Query</h1>
    {{$query}}
</body>

TestsController.php

public function query($query){
  return view('tests.query',['query'=>$query]);
}

http://127.0.0.1:8000/test/testreq/testquery

自作Requestの作成

FormRequests/TestRequest.phpを作成

<?php

namespace App\Http\FormRequests;

class TestRequest
{
  /**
   * @var integer
   *
   */
  public $form_default_id = 777;

  /**
   * @var integer
   *
   */
  public $controller_edit_id;
}

TestsController.phpに追記

use App\Http\FormRequests\TestRequest;
~~~~
public function testReq(){

  $testRequest = new TestRequest();
  $testRequest->controller_edit_id = 999;
  $data = [
    'form_default_id'=>$testRequest->form_default_id,
    'controller_edit_id'=>$testRequest->controller_edit_id
  ];

  return view('tests.testreq',$data);

}

アロー演算子でプロパティ参照する際は$が不要。地味にハマりました。。。

web.php

Route::get('/test/testreq', 'TestsController@testreq');

http://127.0.0.1:8000/test/testreq

DI注入で試してみる。

public function testReq(TestRequest $testRequest){ // edit
  // $testRequest = new TestRequest();

これでも同様に動いた◎

今回TestsRequestに関してはリクエストクラスの継承もしていない状態なので試しにディレクトリも変えてみる。

MakeRequest/MyRequest.phpを作成

表示できた◎

おわりに

随時追記していきます。

備忘録

✅アノテーションに関して

最低限書いておきたいPHPのDocコメント

@var タグは プロパティ の値のデータ型を定義

✅クローンしてきたプロジェクトのgit管理リセット

参考:gitのローカルリポジトリを削除する方法

$ rm -rf .git

✅FormRequestの作成 ※途中

参考:Laravel : FormRequestクラスを使ってValidation(MyMemo)

ValidationをControllerのMethodから切り離し、Validation専用のファイルを作り処理をさせることができる。
→記述がわけれてコントローラのロジックがシンプルに!!

Http/Requests/HelloRequest.phpの作成

$ php artisan make:request HelloRequest
  Request created successfully.

ソースコード

<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class HelloRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return false;
    }
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
        ];
    }
}

コメントを残す