
Laravelの新規ユーザー登録の画面は、 resources/views/auth/register.blade.php に作られています。
標準の状態では、コントローラを通して、この blade に対して何らかの情報を渡す方法はありません。
マスターテーブル等に会員を分類するための属性を保存するとします。
モデルとマイグレーションを作ります。
$ php artisan make:model Attribute -m
id だけガードをいれときます。
class Attribute extends Model
{
use HasFactory;
protected $guarded = [ 'id' ];
}
マイグレーションでは、名前の属性だけ追加しておきます。
class CreateAttributesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('attributes', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('attributes');
}
}
属性のマスターテーブルができました。
seeder を使って Attribute を追加しておきます。
class AttributeSeeder extends Seeder
{
public function run()
{
$attrs = array('経営', '営業', '技術', '事務', 'その他');
foreach ($attrs as $attr) {
Attribute::create([
'name' => $attr,
]);
}
}
}
マスターテーブルにデータをいれます。
$ php artisan db:seed AttributeSeeder
新規ユーザー登録するときに属性も登録してもらいたい場合、
通常の blade ならば、コントローラから view を呼び出すときに、
$attributes = Attribute::all();
return view('auth.register', compact('attributes'));
などのようにしてデータを渡せるのですが、RegisterController には view を呼び出しているコードが存在しないために、そのような手段がありません。
このまま使うのであれば、バックエンドに API を用意して、Ajaxで情報を取得して HTML を更新するなどの方法もあります。
まあ、APIを作った方が手っ取り早い気もしますが、ここではコントローラから渡す方法を紹介します。
RegisterController で、RegistersUsers トレイトを使っていて、これが view を呼び出しています。
vendor/laravel/ui/auth-backend/RegistersUsers.php
trait RegistersUsers
{
use RedirectsUsers;
/**
* Show the application registration form.
*
* @return \Illuminate\View\View
*/
public function showRegistrationForm()
{
return view('auth.register');
}
:
この、showRegisterationForm() をオーバーライドしてやればいけそうです。
どうやってオーバーライドするのかというと、自作のトレイトを追加してやります。
app/Http/Controllers/Auth/MyAppRegistersUsers.php
(MyAppの部分はウェブアプリの名前にするのがいいかもしれません)
use Illuminate\Foundation\Auth\RegistersUsers;
trait MyAppRegistersUsers
{
use RegistersUsers {
RegistersUsers::showRegistrationForm as orgShowForm; // 元の名前を置き換えて呼べないようにする
}
public function showRegistrationForm()
{
$attributes = Attribute::all();
return view('auth.register', compact('attributes'));
}
}
これで blede 内で $attributes が使えるようになりました。
resources/views/auth/register.blade.php
<label for="attributes">職種</label>
<select id="attributes" name="attributes">
@foreach($attributes => $attr)
<option value="{{ $attr->id }}">{{ $attr->name }}</option>
@endforeach
</select>