Laravel
Laravelの共通化に便利な機能まとめ
Uga
更新日:2024/06/18
Laravelでのシステム開発を学んでから約1年経過し、
コードの共通化による可読性の向上と、保守性の向上に力を入れれるようになってきました。
まだまだ使いこなせてはいないですが、これから共通化に使えそうな機能をまとめてみました。
@include
別のビュー内からBladeビューを読み込めます。親ビューで使用できるすべての変数は、読み込むビューで使用できます。
※引用:https://readouble.com/laravel/8.x/ja/blade.html
1 |
@include('common_parts.test') |
追加でデータを渡すこともできる。
1 |
@include('common_parts.test', [{変数名} => {データ}]) |
ViewComposer
アプリケーション内の複数のルートかコントローラが同じビューを返し、常に特定のデータが必要な場合にきわめて役立ちます。
※引用:https://readouble.com/laravel/8.x/ja/views.html
・ServiceProviderの作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use View; class ViewServiceProvider extends ServiceProvider { /** * Bootstrap services. * * @return void */ public function boot() { View::composer('*', YourComposer::class); } |
・Composerクラスの作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
namespace App\View\Composers; use Illuminate\View\View; use App\Models\YourModel; class YourComposer { public function compose(View $view) { // 処理を記述 $data = $this->yourModel->someMethodToGetData(); $view->with('data', $data); } } |
・config/app.phpにServiceProviderを登録
1 2 3 4 |
'providers' => [ // 既存のプロバイダ... App\Providers\ViewServiceProvider::class, ], |
Scope
ローカルスコープ
アプリケーション全体で簡単に再利用できる、共通のクエリ制約を定義できます。
※引用:https://readouble.com/laravel/8.x/ja/eloquent.html
・ローカルスコープの定義
1 2 3 4 |
public function scopeActive($query) { $query->where('active', 1); } |
・ローカルスコープを使用
※クラス名からscopeを除いて呼び出す
1 |
self::active()->orderBy('created_at')->get(); |
グローバルスコープ
特定のモデルのすべてのクエリに制約を追加できます。
※引用:https://readouble.com/laravel/8.x/ja/eloquent.html
・カスタムグローバルスコープの作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php namespace App\Scopes; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Scope; class ActiveScope implements Scope { public function apply(Builder $builder, Model $model) { $builder->where('active', 1); } } |
・グローバルスコープの適用
1 2 3 4 |
protected static function booted() { static::addGlobalScope(new ActiveScope()); } |
・グローバルスコープの削除
1 2 3 4 5 6 7 8 9 10 11 12 |
self::withoutGlobalScope(ActiveScope::class)->get(); // クロージャ使用時 self::withoutGlobalScope('active')->get(); // すべてのグローバルスコープを削除 self::withoutGlobalScopes()->get(); // グローバルスコープの一部を削除 self::withoutGlobalScopes([ FirstScope::class, SecondScope::class ])->get(); |
・動的な値の設定
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
// 動的な値を保持するためのプロパティ protected static $dynamicValue; protected static function booted() { // グローバルスコープの追加 static::addGlobalScope('active', function (Builder $builder) { if (isset(static::$activeValue)) { $builder->where('active', static::$activeValue); } }); } // 動的な値を設定するためのメソッド public static function setActiveValue($value) { static::$activeValue = $value; } // 対象関数内で動的値をセットしてから処理を開始 public static function getData($data) { // 動的値のセット self::setActiveValue($data->active); // 処理 } |
Trait
再利用可能なメソッドの集まりを指すPHPの機能のこと。
※引用:https://qiita.com/nanami173/items/051140e66a6f328a59bc
継承元が異なるクラスでも使用できるので、コードの重複が減り保守性・可読性の向上につながります。
・Traitの作成
1 2 3 4 5 6 7 8 9 10 11 |
<?php namespace App\Traits; trait GetDataTrait { public function getData() { // 処理内容を記述 } } |
・任意の箇所でTraitを使用
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class TestController { // 使用するTraitを呼び出しておく use GetDataTrait; public function test(Request $request) { // Trait内のメソッドを呼び出す $data = $this->getData(); // 後の処理を記述 } } |