どういうことをするものか
たとえば、セレクトボックスが多くあるフォーム入力画面があり、その中身を 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
になります。