I have an event like this
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class NotifyUser implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
protected $user_id;
public $message;
public $link;
public $notification_id;
/**
* Create a new event instance.
*
* #return void
*/
public function __construct($notification)
{
$this->notification_id = $notification->id;
$this->user_id = $notification->user_id;
$this->message = $notification->message;
$this->link = $notification->link;
}
/**
* Get the channels the event should broadcast on.
*
* #return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new Channel('notification.user.'.trim($this->user_id));
}
}
And I have configured both pusher and mercury, is it possible to choose which broadcasting driver to use per event? Instead of always using the default?
Related
I try to send an email to a new user. But I get this error, but I don't understand what is wrong.
TypeError: Illuminate\Mail\PendingMail::send(): Argument #1
($mailable) must be of type Illuminate\Contracts\Mail\Mailable,
App\Events\UserStored given, called in
/Users/kate_kimt/laravel/laravel_block/app/Listeners/SendMailNewUser.php
on line 31 in file
/Users/kate_kimt/laravel/laravel_block/vendor/laravel/framework/src/Illuminate/Mail/PendingMail.php
on line 122
UserStored.php:
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use App\Models\User;
class UserStored
{
public User $user;
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* Create a new event instance.
*
* #return void
*/
public function __construct(User $user)
{
$this->user = $user;
}
/**
* Get the channels the event should broadcast on.
*
* #return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
SendMailNewUser.php:
namespace App\Listeners;
use App\Events\UserStored;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Mail;
use Illuminate\Mail\Mailable;
class SendMailNewUser extends Mailable
{
/**
* Create the event listener.
*
* #return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* #param \App\Events\UserStored $event
* #return void
*/
public function handle(UserStored $event)
{
Mail::to($event->user->email)->send(new UserStored($event->user));
}
}
I am passing an array to an event and I am updating the array in the listeners. But I am not getting back the updated array after the event.
This is where I am calling the event:
$roles_permissions = ["val1"];
event(new SeedingRolesPermissions($roles_permissions));
var_dump($roles_permissions);
This is the event class' code. I am simply using the constructor to set up the event's roles_permissions array. I tried passing array by reference as well but didn't help.
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class SeedingRolesPermissions
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $roles_permissions;
/**
* Create a new event instance.
*
* #return void
*/
public function __construct($roles_permissions)
{
$this->roles_permissions = $roles_permissions;
}
/**
* Get the channels the event should broadcast on.
*
* #return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
This is the listener to the event:
<?php
namespace Modules\Sales\Listeners;
use App\Events\SeedingRolesPermissions;
use Log;
class AddRolesPermissions
{
/**
* Create the event listener.
*
* #return void
*/
public function __construct()
{
}
/**
* Handle the event.
*
* #param SeedingRolesPermissions $event
* #return void
*/
public function handle(SeedingRolesPermissions $event)
{
$event->roles_permissions[] = ["val2"];
}
}
Any help will be greatly appreciated!
I have created a feature called test to test the admin registration. When i run the testcases it gives me this error
1) Tests\Feature\Admin\RegisterTest::testValidRegistration
The expected [App\Events\UserRegistered] event was not dispatched.
Failed asserting that false is true.
/var/www/html/gas-backend/tests/Feature/Admin/RegisterTest.php:85
Below i have stated the admin registration test file and user registered event file
Admin/RegisterTest.php
$response->assertStatus(201);
$response->assertJson($expectedResponse);
$this->assertDatabaseHas('users', $expectedDatabaseRecord);
Event::assertDispatched(UserRegistered::class);
Notification::assertNotSentTo($user, RegistrationComplete::class);
UserRegistered.php
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
use App\Models\User;
class UserRegistered
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $user;
/**
* Create a new event instance.
*
* #return void
*/
public function __construct(User $user)
{
$this->user = $user;
}
/**
* Get the channels the event should broadcast on.
*
* #return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
//return new PrivateChannel('channel-name');
}
}
How should i resolve this error ?
How i can pass some variables to an Event in Laravel 5.5?
I have tried in several mode but not working. Here is my code. Someone have any suggestion?
Basically i need to update the number of followers via socket. Server using Redis and Socket.io and work as well
Route::post('follow', function() {
$negozio = Input::get('id_azienda');
$followers = new \App\Models\Followers;
$followers->entry_by = \Session::get('uid');
$followers->id_azienda = $negozio;
$followers->save();
$this->variabili['negozio'] = $negozio;
$this->variabili['followers'] = $followers->count();
event(new \App\Events\Follow(), $this->variabili);
});
And this is the Event
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class Follow implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
/**
* Create a new event instance.
*
* #return void
*/
public $variabili;
public function __construct()
{
$this->data = array(
'count'=> $variabili['followers'],
'negozio'=> $variabili['negozio']
);
}
/**
* Get the channels the event should broadcast on.
*
* #return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return ['test-channel'];
}
}
You can pass it as Constructor's parameter in your Follow Event class, and if you need it as public field do like this:
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class Follow implements ShouldBroadcast
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $data;
/**
* Create a new event instance.
*
* #return void
*/
public function __construct($variabili)
{
$this->data = array(
'count'=> $variabili['followers'],
'negozio'=> $variabili['negozio']
);
}
/**
* Get the channels the event should broadcast on.
*
* #return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return ['test-channel'];
}
}
And pass him parameters in this way:
Route::post('follow', function() {
$negozio = Input::get('id_azienda');
$followers = new \App\Models\Followers;
$followers->entry_by = \Session::get('uid');
$followers->id_azienda = $negozio;
$followers->save();
$this->variabili['negozio'] = $negozio;
$this->variabili['followers'] = $followers->count();
event(new \App\Events\Follow($this->variabili));
});
I am deleting a filter which model looks like this:
namespace App;
use App\Events\FilterDelete;
use Illuminate\Database\Eloquent\Model;
class Filter extends Model
{
protected $events = [
'deleting' => FilterDelete::class
];
public function filterGroup()
{
return $this->belongsTo('App\FilterGroup');
}
public function products()
{
return $this->belongsToMany('App\Product', 'product_filters')->withPivot('id', 'quantity', 'price');
}
}
The FilterDelete looks like this:
namespace App\Events;
use App\Filter;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class FilterDelete
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $filter;
/**
* Create a new event instance.
*
* #return void
*/
public function __construct(Filter $filter)
{
$this->filter = $filter;
}
/**
* Get the channels the event should broadcast on.
*
* #return \Illuminate\Broadcasting\Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
And the listener looks like this:
namespace App\Listeners;
use App\Events\FilterDelete;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class DeleteProductFilter
{
/**
* Create the event listener.
*
* #return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* #param FilterDelete $event
* #return void
*/
public function handle(FilterDelete $event)
{
$event->filter->products()->detach();
}
}
And when I delete a filter the products are not detached and the records stay in the database. No errors are returned, evetywhing seems to be working fine. Can anyone tell me why the products are not detaching ?