Polecam zmienić nazwy słuchaczy, które mówią bardziej szczegółowo o tym, co się dzieje, więc unikałbym parowania słuchaczy ze zdarzeniami.
Używamy anemicznego podejścia do zdarzenia/słuchacza, więc nasi słuchacze przekazują rzeczywiste zadanie "wykonawcom" (zlecenia, usługi, jak je nazwiesz).
Ten przykład pochodzi z prawdziwego systemu:
app/Dostawcy/EventServiceProvider.php:
OrderWasPaid::class => [
ProvideAccessToProduct::class,
StartSubscription::class,
SendOrderPaidNotification::class,
ProcessPendingShipment::class,
LogOrderPayment::class
],
StartSubscription słuchaczy:
namespace App\Modules\Subscription\Listeners;
use App\Modules\Order\Contracts\OrderEventInterface;
use App\Modules\Subscription\Services\SubscriptionCreator;
class StartSubscription
{
/**
* @var SubscriptionCreator
*/
private $subscriptionCreator;
/**
* StartSubscription constructor.
*
* @param SubscriptionCreator $subscriptionCreator
*/
public function __construct(SubscriptionCreator $subscriptionCreator)
{
$this->subscriptionCreator = $subscriptionCreator;
}
/**
* Creates the subscription if the order is a subscription order.
*
* @param OrderEventInterface $event
*/
public function handle(OrderEventInterface $event)
{
$order = $event->getOrder();
if (!$order->isSubscription()) {
return;
}
$this->subscriptionCreator->createFromOrder($order);
}
}
W ten sposób można wywołać zlecenia/usługi (SubscriptionCreator
w tym przykładzie) w innym er obszarów twojej aplikacji.
Istnieje również możliwość powiązania odbiornika z innymi zdarzeniami, z wyjątkiem OrderWasPaid
.
Zasadniczo lister nie powinien wywoływać zadań. Nie będąc odpowiedzialnym za wykonywanie samych zadań? – AndrewMcLagan