【发布时间】:2019-05-28 02:28:19
【问题描述】:
我在 Laravel 应用程序中有一个数组,我想在 Laravel 监听器中进行修改。 PHP 默认按值传递数组,但是 Laravel 事件及其侦听器的工作方式我无法修改原始变量。有没有比我在下面做的更好的方法?
触发事件的模型。
模型:Event.php
namespace Vendor\Package\Models
use Vendor\Package\Events\PageNodeArrayAfter;
use Event;
class Page
{
public function toArray()
{
$data = [];
// do something with the data.
Event::fire(new PageNodeToArrayAfter($data))
// The data should be modified by a listener when I use it here.
}
}
事件:PageNodeToArrayAfter.php
namespace Vendor\Package\Events;
class PageNodeToArrayAfter
{
/**
* Props to be sent to the view
* @var array $data
*/
protected $data = [];
/**
* @param array $data
*
*/
public function __construct(array &$data)
{
$this->data = $data;
}
public function getData()
{
return $this->data;
}
}
监听器:FlashMessagesListner.php
namespace Vendor\Package\Listeners;
class FlashMessagesListner
{
protected $data = [];
public function handle(PageNodeToArrayAfter $event)
{
$this->data = $event->getData();
// The problem here is the $data is no logner a reference here.
}
}
【问题讨论】:
-
您的用例是什么?为什么需要实现这一目标?即使您的侦听器可能尚未完成,您的主线程(执行事件的线程)仍将继续运行。
-
我正在将一些 XML 节点转换为数组,在此过程中,我想通过独立的侦听器附加一些自定义数据,例如验证消息。
-
我明白了。您需要自定义您的 XML 数据,那么为什么要使用侦听器呢?事件/侦听器用于通知应用程序的其他部分(或外部 API)某些事情,但在您的情况下,您希望对您将继续接触的相同数据进行操作。我知道你想解耦你的逻辑以避免用大量代码为你的函数充电。因此,您可以将该逻辑提取到一个函数、一个特征或另一个将返回更新的 XML 文件的类。
-
我同意@HCK 的观点,即观察者模式在这里是一种错误的方法,因为您的转换可能会在听众完成他们的工作之前完成。
-
事件和监听器用于解耦进程。如果您只需要将一些验证消息闪现到会话中,我看不出您需要如何通过引用传递数组。如果您的侦听器的逻辑对于应用程序的另一部分的过程至关重要,那么侦听器无论如何都是错误的选择。仅当触发进程不关心事件是否被任何其他进程使用时才应使用事件侦听器(process 是 business process,而不是线程) . IE。在用户注册后发送欢迎邮件(这对于该过程是完全可选的)。
标签: php laravel laravel-5 laravel-5.8