Laravel 5.3 - 在注册时实施Entrust角色的最佳方式?

时间:2016-09-22 14:08:40

标签: laravel laravel-5.3 entrust

我正在与Laravel 5.3合作,当有人注册时,我正试图设置一个角色,我使用了Zizaco Entrust库。

我不确定如何实现这样的最佳方式。

我尝试在RegisterController的{​​{1}}方法中执行此操作,如下所示:

create

但显然这不对。所以我对这种事情的最佳实践有点不确定。

3 个答案:

答案 0 :(得分: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 );
        // ...
    }

    // ...

}

答案 1 :(得分: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,
        ],
    ];

    // ...

}

现在我们只需要举起活动 - 请参阅我关于模型观察员的其他帖子。首先,您需要导入EventApp\Events\UserHasRegistered,然后在created方法中,只需致电Event::fire( new UserHasRegistered( $user ) )

答案 2 :(得分: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);

它可能不是最好的解决方案,但是它完成了工作,而且它是未来的教授,所以如果用户创建的逻辑增长也可以实现。