LoginSignup
1
0

More than 5 years have passed since last update.

LaravelでpluckしたデータをControllerからViewに渡す処理をサービスを使って省略する

Last updated at Posted at 2019-01-15

どういうことをするものか

たとえば、セレクトボックスが多くあるフォーム入力画面があり、その中身を DB から取得して View に渡すとします。

下記のコード例は、複数の関連会社のユーザーがアクセスできるシステムで、ユーザーのロール・会社・支店・部署などなどを設定できる画面としましょう。

before

app/Http/Controllers/HogeController.php
public function index()
{
    $roles = $this->role->pluck('name', 'id')->all();
    $companies = $this->company->pluck('name', 'id')->all();
    $branches = $this->branch->pluck('name', 'id')->all();
    $departments = $this->department->pluck('name', 'id')->all();
    $users = $this->user->pluck('name', 'id')->all();
    // ... 省略 ...

    return view('hoge.index', compact(
        'roles',
        'companies',
        'branches',
        'departments',
        'users',
        // ... 省略 ...
    ))
}

例は5つくらいだけど、これが大量に続くとウザいので、スッキリさせたい。
これから紹介する方法だと、このくらいスッキリします。

after

app/Http/Controllers/HogeController.php
public function index()
{
    // 取得、Viewに渡す記述がいらなくなる!
    return view('hoge.index')
}
resources/views/hoge/index.blade.php
@inject('pluck', 'App\Services\Pluck')

<!-- 省略 -->

{{ Form::select(
    'role_id',
    $pluck->getPluck('App\Role'),
    old('role_id')
) }}

やり方

config/app.php
// ... 省略 ...

'aliases' => [
    // ... 省略 ...
    'Pluck' => App\Facades\Pluck::class,
]
app/Facades/Pluck.php
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;

class Pluck extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'Pluck';
    }
}
app/Services/Pluck.php
<?php
namespace App\Services;

class Pluck
{
    protected static $plucks = [];

    public function getPluck($model, $column = 'name')
    {
        $reflection = new \ReflectionClass($model);
        $class = $reflection->getName();

        if (empty(self::$plucks[$class])) {
            self::$plucks[$class] = $model::pluck($column, 'id')->all();
        }

        return self::$plucks[$class];
    }
}
app/Providers/PluckServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Services\Pluck;

class PluckServiceProvider extends ServiceProvider
{
    public function boot()
    {
    }

    public function register()
    {
        $this->app->bind('Pluck', Pluck::class);
    }
}

View に記述する $pluck->getPluck('App\Role') の第一引数に Model、第二引数にカラム名を渡すと、ID とそのカラムで pluck するようになります。
第二引数は省略すると name になります。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0