オルトプラスエンジニアの日常をお伝えします!

Laravelの機能を使って綺麗なコードを書く

この記事はAltplus Advent Calendar 2017の8日目のエントリです。

概要

  • 主にコード量を減らすことが出来る、読みやすくなるようなLaravelの機能を紹介してく
  • 備忘録的な感じ

ルートプレフィックス

どんなもの?

使わないで書くと?

Route::get('/admin',           'Admin\AdminController@top');
Route::get('/admin/hoge',      'Admin\AdminController@hoge');
Route::get('/admin/huga/piyo', 'Admin\AdminController@hugaPiyo');

使って書くと!

Route::prefix('admin')->group(function () {
    Route::get('/',          'Admin\AdminController@top');
    Route::get('/hoge',      'Admin\AdminController@hoge');
    Route::get('/huga/piyo', 'Admin\AdminController@hugaPiyo');
});

メリット

  • ルーティングを見た時に関連のあるルーティングがぱっと見で分かりやすくなる
  • 上記の例の場合だと、「管理者画面関連のルーティングなんだろうなぁ」と予想が付く

名前空間ルーティング

どんなもの?

  • 同じ名前空間を持つコントローラーを一つにまとめることが出来る
  • 例えば、app/Http/Controllers/Admin/配下にコントローラーファイルを複数作成していた場合にまとめて書ける

使わないで書くと?

Route::prefix('admin')->group(function () {
    Route::get('/',          'Admin\AdminController@top');
    Route::get('/hoge',      'Admin\AdminController@hoge');
    Route::get('/huga/piyo', 'Admin\AdminController@hugaPiyo');
});

使って書くと!

Route::prefix('admin')->namespace('Admin')->group(function () {
    Route::get('/',          'AdminController@top');
    Route::get('/hoge',      'AdminController@hoge');
    Route::get('/huga/piyo', 'AdminController@hugaPiyo');
});

メリット

  • ルートプレフィックスと同じ

リソースフルルーティング

どんなもの?

  • 基本的なCRUD関連のルーティングをまとめて書ける

使わないで書くと?

Route::prefix('users')->group(function () {
    Route::get   ('/',            'UserController@index');
    Route::get   ('/create',      'UserController@create');
    Route::post  ('/',            'UserController@store');
    Route::get   ('/{user}',      'UserController@show');
    Route::get   ('/{user}/edit', 'UserController@edit');
    Route::patch ('/{user}',      'UserController@update');
    Route::delete('/{user}',      'UserController@destroy');
});

使って書くと!

Route::resource('users', 'UserController');

メリット

  • コード量かなり減らせる
  • 一目でそのコントローラーがCRUDの要素を持っていることが分かる
  • コントローラー内のアクションメソッドも同じになるので、共通認識での開発ができる

備考

  • リソースフルルーティングに対応するコントローラーは、下記のようなコマンドで一発で作成できる
    php artisan make:controller UserController --resource

フォームリクエストバリデーション

どんなもの?

  • バリデーションをapp/Http/Requests/配下に作成されるフォームリクエストクラスに書くことが出来る

使わないで書くと?

  • 下記のコードをモデルやサービスクラスでメソッド化して、コントローラで呼び出さなければならない
$request->validate([
    'name'  => 'required',
    'email' => 'required|email',
]);

使って書くと!

  • 下記のようなコマンドでフォームリクエストクラスを作成する
    php artisan make:request StoreBlogPost
  • app/Http/Requests/StoreUser.phpが作成されるので、下記のように修正する
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreUser 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 [
            'name'  => 'required',
            'email' => 'required|email',
        ];
    }
}
  • コントローラーのアクションメソッドで、上記のクラスを引数に指定して呼び出すだけで、バリデーションを通ったもののみがアクションメソッドの処理を実行する
public function store(StoreUser $request)
{
}

メリット

  • バリデーションについてのコードをフォームリクエストクラスに任せることができる
  • (今回は解説しないが)認証機能、エラーメッセージの設定も出来る

最後に

「Laravelにはこんな機能もあるよ!」等のコメントいただけると嬉しいです!