オブジェクト指向とかデザインパターンとか開発プロセスとかツールとか

satoshi's ソフトウェア開発

js






当サイトはアフィリエイト広告を利用してます。

Laravel

Laravelの新規ユーザー登録の画面にDBから取得した情報を渡す方法

更新日:


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>







-Laravel
-, , , ,

Copyright© satoshi's ソフトウェア開発 , 2024 All Rights Reserved Powered by STINGER.