У меня здесь излишне непонятная ситуация. Я просто пытаюсь создать метод внутри этого 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()
, и это переход, который я ожидаю, и если я буду использовать dd method_exists($this, $guardMethod)
, он ложен для любых / всех методов, кроме guardToOnHold
, поскольку это единственное, что будет существовать после создания переменной $guardMethod
. Если I dd method_exists($this, $guardMethod)
перед оператором if, то оно ложно, но добавление его в оператор if с тем же событием / переходом попадает в оператор if и dd's true
. Это Laravel 5.7, использующий пакет рабочего процесса Brexis / Laravel Symfony. Переход к событию - это всегда то, что я ожидаю. $event->getTransition()
всегда возвращает один объект перехода с правильным именем, froms и tos.