Laravel
Laravelの共通化に便利な機能まとめ
Uga
更新日:2024/06/18
Laravelでのシステム開発を学んでから約1年経過し、
コードの共通化による可読性の向上と、保守性の向上に力を入れれるようになってきました。
まだまだ使いこなせてはいないですが、これから共通化に使えそうな機能をまとめてみました。
@include
別のビュー内からBladeビューを読み込めます。親ビューで使用できるすべての変数は、読み込むビューで使用できます。
※引用:https://readouble.com/laravel/8.x/ja/blade.html
@include('common_parts.test')
追加でデータを渡すこともできる。
@include('common_parts.test', [{変数名} => {データ}])
ViewComposer
アプリケーション内の複数のルートかコントローラが同じビューを返し、常に特定のデータが必要な場合にきわめて役立ちます。
※引用:https://readouble.com/laravel/8.x/ja/views.html
・ServiceProviderの作成
<?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クラスの作成
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を登録
'providers' => [
// 既存のプロバイダ...
App\Providers\ViewServiceProvider::class,
],
Scope
ローカルスコープ
アプリケーション全体で簡単に再利用できる、共通のクエリ制約を定義できます。
※引用:https://readouble.com/laravel/8.x/ja/eloquent.html
・ローカルスコープの定義
public function scopeActive($query)
{
$query->where('active', 1);
}
・ローカルスコープを使用
※クラス名からscopeを除いて呼び出す
self::active()->orderBy('created_at')->get();
グローバルスコープ
特定のモデルのすべてのクエリに制約を追加できます。
※引用:https://readouble.com/laravel/8.x/ja/eloquent.html
・カスタムグローバルスコープの作成
<?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);
}
}
・グローバルスコープの適用
protected static function booted()
{
static::addGlobalScope(new ActiveScope());
}
・グローバルスコープの削除
self::withoutGlobalScope(ActiveScope::class)->get();
// クロージャ使用時
self::withoutGlobalScope('active')->get();
// すべてのグローバルスコープを削除
self::withoutGlobalScopes()->get();
// グローバルスコープの一部を削除
self::withoutGlobalScopes([
FirstScope::class, SecondScope::class
])->get();
・動的な値の設定
// 動的な値を保持するためのプロパティ
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の作成
<?php
namespace App\Traits;
trait GetDataTrait
{
public function getData()
{
// 処理内容を記述
}
}
・任意の箇所でTraitを使用
class TestController
{
// 使用するTraitを呼び出しておく
use GetDataTrait;
public function test(Request $request)
{
// Trait内のメソッドを呼び出す
$data = $this->getData();
// 後の処理を記述
}
}