命名Laravel事件,监听器和Jobs

时间:2016-02-08 04:15:15

标签: php laravel naming-conventions

我有一个名为UserWasRegistered的事件我也有一个名为UserWasRegistered的监听器,我在那里开发了一个叫做的命令:

EmailRegistrationConfirmation

NotifyAdminsNewRegistration

CreateNewBillingAccount

所有这些作业都将在UserWasRegistered事件监听器类中执行。

这是正确的方法还是应该为UserWasRegistered设置多个听众?我觉得使用工作方法使我能够在不同的时间从我的应用程序中的其他区域调用那些“工作”。例如如果用户更改了他们的详细信息,则可能会调用CreateNewBillingAccount来调用...

1 个答案:

答案 0 :(得分:5)

我建议更改听众名称,以便更清楚地了解发生的事情,因此我避免直接​​将听众与事件配对。

我们正在使用贫血的事件/听众方法,因此听众将实际任务传递给" doers" (工作,服务,您将其命名)。

此示例取自实际系统:

应用/提供者/ EventServiceProvider.php

    OrderWasPaid::class    => [
        ProvideAccessToProduct::class,
        StartSubscription::class,
        SendOrderPaidNotification::class,
        ProcessPendingShipment::class,
        LogOrderPayment::class
    ],

StartSubscription侦听器:

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);
    }
}

通过这种方式,您可以在应用程序的其他区域调用作业/服务(在此示例中为SubscriptionCreator)。

除了OrderWasPaid之外,还可以将侦听器绑定到其他事件。