2

Laravel 5.3誰かがサインアップしたときに役割を設定しようとしています。ライブラリを使用しましたZizaco Entrust

このようなことを達成する最善の方法がわかりません。

RegisterController以下のようにのcreateメソッド内でこれを実行しようとしました:

protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
    ]);

    $user = User::where('email', '=', $data['email'])->first();

    // role attach alias
    $user->attachRole($employee);
}

しかし、明らかにそれは正しくありません。したがって、この種のベストプラクティスが何であるかについては少しわかりません。

4

3 に答える 3

2

OPに関するコメントが示唆するように、常に同じロールを登録ユーザーに割り当てたい場合は、モデルオブザーバーを使用できます-それは本当に簡単です。

// app/Observers/UserObserver.php

<?php namespace App\Observers;

use App\Models\User;
use App\Models\Role; // or the namespace to the Zizaco Role class

class UserObserver {

    public function created( User $user ) {
        $role = Role::find( 1 ); // or any other way of getting a role
        $user->attachRole( $role );
}

次に、オブザーバーを AppServiceProvider に登録するだけです。

// app/Providers/AppServiceProvider.php

use App\Models\User;
use App\Observers\UserObserver;

class AppServiceProvider extends Provider {

    public function boot() {
        User::observe( new UserObserver );
        // ...
    }

    // ...

}
于 2016-09-22T15:53:06.837 に答える
1

この回答は主に、元の質問を少し加えて、現在のソリューションを検討することに基づいています。

のようなメソッドでモデルを埋め尽くすよりもcreateNew、特にモデルと対話するためのタイプのクラスを作成すると、管理が容易になるでしょう。これをリポジトリ、サービス、または好きなように呼び出すことができますが、サービスで実行します。

// app/Services/UserService.php

<?php namespace App\Services;

use App\Models\User; // or wherever your User model is

class UserService {

    public function __construct( User $user ) {
        $this->user = $user;
    }

    public function create( array $attributes, $role = null ) {
        $user = $this->user->create( $attributes );

        if ( $role ) {
            $user->attachRole( $role );
        }

        return $user;
    }

}

ここで、パスワードのハッシュが失われたという事実に対処する必要があります。

// app/Models/User.php
class User ... {

    public function setPasswordAttribute( $password ) {
        $this->attributes[ 'password' ] = bcrypt( $password );
    }

}

そして今、アクティベーションメールを送信するという問題があります - これはイベントできれいに解決できます. ターミナルでこれを実行します。

php artisan make:event UserHasRegistered

次のようになります。

// app/Events/UserHasRegistered.php

<?php namespace App\Events;

use App\Models\User;
use Illuminate\Queue\SerializesModels;

class UserHasRegistered extends Event {

    use SerializesModels;

    public $user;

    public function __construct( User $user ) {
        $this->user = $user;
    }

}

次に、イベントのリスナーが必要です。

php artisan make:listener SendUserWelcomeEmail

そして、これは好きなだけ複雑にすることができます。これは、私が横たわっているプロジェクトからコピー/貼り付けしたものです。

// app/Listeners/SendUserWelcomeEmail.php

<?php namespace App\Listeners;

use App\Events\UserHasRegistered;
use App\Services\NotificationService;

class SendUserWelcomeEmail {

    protected $notificationService;

    public function __construct( NotificationService $notificationService ) {
        $this->notify = $notificationService;
    }

    public function handle( UserHasRegistered $event ) {
        $this->notify
            ->byEmail( $event->user->email, 'Welcome to the site', 'welcome-user' )
            ->send();
    }

}

あとは、作成したばかりのイベントとリスナーが関連していることを Laravel に伝え、イベントを発生させるだけです。

// app/Providers/EventServiceProvider.php

use App\Events\UserHasRegistered;
use App\Listeners\SendUserWelcomeEmail;

class EventServiceProvider extends ServiceProvider {

    // find this array near the top, and add this in
    protected $listen = [
        UserHasRegistered::class => [
            SendUserWelcomeEmail::class,
        ],
    ];

    // ...

}

あとはイベントを発生させるだけです。モデル オブザーバーに関する私の別の記事を参照してください。まず、インポートEventしてからApp\Events\UserHasRegisteredcreatedメソッドで を呼び出す必要がありますEvent::fire( new UserHasRegistered( $user ) )

于 2016-09-22T15:49:04.303 に答える
0

ユーザー作成で複数の操作を行う必要があるため、私がやったことは、ユーザー作成用に別の機能を持っていることです。

ユーザーモデル

/**
 * Create a new user instance after a valid registration.
 *
 * @param array $attributes
 * @param null  $role
 * @param bool  $send_activation_email
 *
 * @return User $user
 *
 * @internal param array $args
 */
public function createNew(array $attributes, $role = null, $send_activation_email = true)
{
    $this->name = $attributes['name'];
    $this->company_id = $attributes['company_id'];
    $this->email = $attributes['email'];
    $this->password = bcrypt($attributes['password']);
    $this->save();

    if (isset($role)) {
        // Assigning the role to the new user
        $this->attachRole($role);
    }

    //If the activation email flag is ok, we send the email
    if ($send_activation_email) {
        $this->sendAccountActivationEmail();
    }

    return $this;
}

そしてそれを次のように呼び出します:

ユーザーコントローラー

$user = new User();
$user->createNew($request->all(), $request->role);

それは最善の解決策ではないかもしれませんが、それは仕事をし、将来の教授であるため、ユーザー作成のロジックが成長した場合にも実装できます.

于 2016-09-22T15:07:32.333 に答える