『PHPフレームワークLaravel入門』を読んで学んだことや感想等々

『PHPフレームワークLaravel入門』を読んで学んだことや感想等々Laravel

今回は「PHPフレームワークLaravel入門」を読んだので、新たに知ったことや疑問に思ったことを中心に書きました。

 

クラスを宣言する際のIlluminateはどこを指しているのか?

Laravelのパッケージ自体はIlluminate下にある。そのためプロジェクトファイルは、「vender > laravel > framework > src > Illuminate」に存在する。

 

シングルアクションコントローラ

シングルアクションコントローラとは、1つのアクションだけを含むコントローラのこと。Laravelでは、そのコントローラに__invokeメソッドを設置する。

class HogeController extends Controller
{
  public function __invoke() {
    return "Hoge";
  }
}
Route::get('hoge', 'HogeController');

シングルアクションコントローラを使うメリットについては書かれていませんでしたが、複数のアクションがある場合に比べて、単一アクションの方が可読性が上がるからかなと思っています。

 

CSRF対策

CSRFの図

フォームを利用する際には、csrf_fieldというCSRF対策となるヘルパ関数をフォーム内に用意する必要がある。

<form action="post" action="/hoge">
  {{ csrf_field() }}
  <input type="text" name="name">
  <input type="submit">
</form>

このようにcsrf_fieldをフォーム内に記述することによって、以下のようにトークンが埋め込まれている。

<form method="post" action="/hoge">
    <input type="hidden" name="_token" value="FKkjfaka9Lda0r32llkraR"> 
    <input type="text" name="name">
    <input type="submit">
</form>

実際にCSRF対策の処理はミドルウェアとして用意されている、VerifyTokenクラスで行われている。

あまり使う機会はないと思うが、仮にCSRF対策を行わないようにする場合、VerifyCsrfTokenクラスの$except変数内にそのページを指定してあげることで除外可能。

 

@slotについて

コンポーネント利用時に使用するディレクティブ。「{{ }}」内で指定された変数に値を設定するもの。

例として以下のような感じ

<p class="name">{{ $name }}</p>
@slot('name')
  山田太郎
@endslot

 

ビューコンポーザについて

ビジネスロジックをビュー側にもたせたい場合にビューコンポーザが役立つ。具体的にはビューをレンダリングする際に実行される処理を用意するための部品のこと。

このビューコンポーザを使うためにはサービスプロバイダを使う必要がある。

ビューコンポーザを使うメリットとしては、ビューのロジックを分離することによって可読性を上げることができることだと思っている。

 

サービスプロバイダについて

初期処理の実装を行ってくれるクラスがサービスプロバイダ。

ところで「初期起動処理」とは何を意味しているのでしょうか? サービスコンテナの結合や、イベントリスナ、フィルター、それにルートなどを登録することを一般的に意味しています。サービスプロバイダはアプリケーション設定の中心部です。
引用:Laravel 5.3 サービスプロバイダ

サービスプロバイダはServiceProviderクラスを継承して作成され、その多くはbootメソッドとregisterメソッドを持っている。

bootメソッドはアプリが起動する際に割り込んで実行される処理。registerメソッドはサービスコンテナへの登録を行う。

実際にサービスプロバイダを作成してみる

$ php artisan make:provider HogeServiceProvider

作成したHogeServiceProvider.phpの中身は以下のようになっている。ちなみに作成される場所はapp/providers/内。

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HogeServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

サービスプロバイダを作成しただけでは、まだ動かないのでアプリケーションに登録する必要がある。config/app.php 内に以下のように追記することで登録される。

'providers' => [
    // 省略

    App\Providers\HogeServiceProvider::class,
],

ここからビューコンポーザを用意していく。これを用意する方法は2つ。

  • 無名クラスでビューコンポーザの処理を組み込む
  • bootで設定

 

無名クラスでビューコンポーザの処理を組み込む

<?php

namespace App\Providers;
use Illuminate\Support\Facades\View; //追記
use Illuminate\Support\ServiceProvider;

class HogeServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        // 追記
        View::composer(
            'hoge', function($view) {
                $view->with('hoge_msg', 'hoge!!');
            }
        );
    }
}

 

bootで設定

  1. Httpフォルダ内にコンポーザを用意
  2. 用意したクラスをboot内のView::composerメソッドの第2引数に指定することで完了

 

ミドルウェアについて

リクエストが届く前後に割り込んで処理を実行するもの。コントローラで1つ1つ処理を書いていくのが面倒くさく、効率的でない場合にミドルウェアを使う。

以下のコマンドで作成可能。

php aritisan make:middleware HogeMiddleware

app/Http/Middleware/HogeMiddleware.php

<?php

namespace App\Http\Middleware;

use Closure;

class HogeMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}

 

フォームリクエストについて

一般的にはコントローラ内でバリデーションを実行するが、フォームリクエストを使うことによってリクエスト内部にバリデーションを実行できる。

以下のコマンドで作成可能。

php artisan make:request HogeRequest

app/Http/Requests/HogeRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class HogeRequest 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 [
            //
        ];
    }
}

 

クエリビルダとEloquent(ORM)の違い

クエリビルダは、SQLクエリ文を生成するために用意された一連のメソッド。Eloquentは、DBとモデルを対応づける機能。

この2つの違いは返り値。

  • クエリビルダの返り値は stdClass のインスタンス
  • Eloquentの返り値はモデルクラスのインスタンス

クエリビルダとEloquentではEloquentを好んで使う人が多い。Eloquentを使うメリットとしては以下。

  • 再利用性・拡張性が高い
  • リレーション定義可能

…etc。

 

セッション用のマイグレーションについて

Laravelではセッション用テーブルをartisanコマンドを利用して作成可能。

php artisan session:table

 

その他

  • Bladeで使われている{{ }}の出力はHTMLエスケープ処理がされる。しかし、エスケープ処理をして欲しくない場合は{{!! !!}}の中に記述。これでそのままタグとして出力される

 

コメント