Слушатели и события получают ошибку: слишком мало аргументов для функции App \ Events \ User \ Created :: __ construct (), - PullRequest
0 голосов
/ 02 февраля 2020

Мне нужно, чтобы в одном событии было два прослушивателя, и когда в системе был создан пользователь, Лаварель отправил мне электронное письмо с учетными данными, а другой - для назначения ролей пользователей. Возможно ли иметь двух слушателей на одном мероприятии? Почему система показывает мне это сообщение?

Когда я создаю пользователя, система показывает мне:

Слишком мало аргументов для функции App \ Events \ User \ Created :: __ construct ( ), 1 передано в C: \ xampp \ htdocs \ bwm \ vendor \ laravel \ framework \ src \ Illuminate \ Database \ Eloquent \ Concerns \ HasEvents. php в строке 205 и ровно 2 ожидаемых

Это мое событие:

class UserCreated
{
    use Dispatchable, InteractsWithSockets, SerializesModels;
    public $user;
    public $password;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($user,$password)
    {
        $this->user = $user;
        $this->password = $password;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}

Это мой слушатель Назначить роли:

class AssignRoles
{
    private $request;

    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    /**
     * Handle the event.
     *
     * @param  Created  $event
     * @return void
     */
    public function handle(UserCreated $event)
    {
        $event->user;
        switch($role = $this->request->role) 
        {

            case $role == 'Asesor':
                $event->user->assignRole('Asesor');                
                $asesoria = Asesoria::orderby('created_at', 'desc')->first();
                $asesoria->user_id = $event->user->id;
                $asesoria->published = true;
                $asesoria->update();
                break;  
            case $role == 'Comprador':
                $event->user->assignRole('Comprador');
                break;
            default:
                $event->user->assignRole('Writer');
        }
    }
}

Это мой слушатель Отправить учетные данные для входа:

class SendLoginCredentials
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  Created  $event
     * @return void
     */
    public function handle(UserCreated $event)
    {
        Mail::to($event->user)->queue(
            new LoginCredentials($event->user, $event->password)
        );

    }
}

В моем хранилище функций моего UsersController я вызываю диспетчер:

 UserCreated::dispatch($user, $password);

В моем EventServiceProvider у меня есть это:

protected $listen = [
    Registered::class => [
        SendEmailVerificationNotification::class,
    ],
    'App\Events\User\UserCreated' => [
        'App\Listeners\User\AssignRoles',
        'App\Listeners\SendLoginCredentials',
    ],
];

Ответы [ 2 ]

0 голосов
/ 02 февраля 2020

У меня был защищенный $ dispachesEvents в модели пользователя:

protected $dispatchesEvents = ['created' => 'App\Events\User\Created'];

Вот почему я получил ошибку:

Слишком мало аргументов для функции App \ Events \ User \ Created :: __ construct (), 1 передано в C: \ xampp \ htdocs \ bwm \ vendor \ laravel \ framework \ src \ Illuminate \ Database \ Eloquent \ Concerns \ HasEvents. php в строке 205 и ровно 2 ожидаемых

Я удалил его и отправил вызов диспетчеру в мой RegisterController.

protected function create(array $data)
{
    $user = User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        //'password' => Hash::make($data['password']), //mutador en User model
        'password' => $data['password'],
        'surname1' => $data['surname1'],
        'surname2' => $data['surname2'],
        'comunidad_id' => $data['cbx_comunidad'],
        'provincia_id' => $data['cbx_provincia'],  
        'municipio_id' => $data['cbx_municipio'],            
    ]);
        //dd($data['password']);
    event(new Created($user,$data['password']));

    return $user;

}

Поскольку у меня была защищенная $ dispatchesEvents в пользовательской модели, она выполняется перед моим вызовом в RegisterController.

0 голосов
/ 02 февраля 2020

У вас есть два параметра в конструкторе класса UserCreated, и вы передаете только один, потому что отправляете его неправильно.

вы можете сделать это несколькими способами:

  1. Event::dispatch(new UserCreated($user, $password))
  2. event(new UserCreated($user, $password))

Попробуйте это. Надеюсь, что это работает

...