我在这里有一个不必要的困惑。我只是想在这个 WorkflowSubscriber 中创建一个方法来检查事件的转换,创建一个$guardMethod看起来像这样的变量,guardToSomePlace然后如果该方法存在,则调用它。这是该概念的代码:
<?php
namespace App\Listeners;
use App\Models\BugTypes\Bug;
use Symfony\Component\Workflow\Event\GuardEvent;
class BugWorkflowSubscriber
{
/**
* Handle workflow guard events.
*
* @param \Symfony\Component\Workflow\Event\GuardEvent $event
*/
public function onGuard(GuardEvent $event)
{
$transition = $event->getTransition();
$guardMethod = 'guard' . studly_case($transition->getName());
// this can be something like guardToAccepted and it
// calls guardToOnHold below
if (method_exists($this, $guardMethod)) { // should fail
$this->$guardMethod($event);
}
}
/**
* Guards the to_on_hold transition
*
* @param \Symfony\Workflow\Event\GuardEvent $event
*
* @return void
*/
private function guardToOnHold(GuardEvent $event)
{
dd('why is it getting here for other transitions?');
}
/**
* Register the listeners for the subscriber.
*
* @param \Illuminate\Events\Dispatcher $events
*/
public function subscribe($events)
{
$events->listen(
'workflow.bug.guard',
'App\Listeners\BugWorkflowSubscriber@onGuard'
);
$events->listen(
'workflow.bug.entered.*',
'App\Listeners\Workflow\Bug\OnEntered'
);
}
}
它正在调用guardToOnHold多个转换的方法,尽管事实上我可以 dd$event->getTransition()并且这是我期望的转换,如果我 ddmethod_exists($this, $guardMethod)它对于除 之外的任何/所有方法都是错误的,因为这是我创建变量guardToOnHold后唯一存在的方法$guardMethod. 如果我method_exists($this, $guardMethod)在 if 语句之前 dd 它是假的,但是在 if 语句中使用相同的事件/转换将它 dd 到 if 语句和 dd'strue中。这是使用 Brexis/Laravel Symfony Workflow 包的 Laravel 5.7。事件的过渡总是我所期望的。$event->getTransition()总是返回一个具有正确名称的转换对象,froms 和 tos。