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>