我在这里有一个不必要的令人困惑的情况。我只是想在这个WorkflowSubscriber中创建一个方法来检查事件的转换,创建一个类似于guardToSomePlace的$guardMethod变量,然后如果这个方法存在,就调用它。下面是这个概念的代码:
<?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之外的任何/所有方法都为false,因为这是我创建$guardMethod变量后唯一存在的方法。如果我在If语句之前使用dd method_exists($this, $guardMethod),它就是false,但是在if语句中使用相同的事件/转换dd-ing它会进入if语句和dd的true。这是使用Brexis/Laravel Symfony工作流包的Laravel 5.7。活动的过渡始终是我所期望的。$event->getTransition()始终返回一个具有正确名称的变换对象,即froms和tos。
发布于 2019-12-23 21:29:34
这实际上是与我过去3天所调查的有关的事情。在symfony工作流中发生的情况是,当你应用一个转换时,它会调用一个函数到getEnabledTransitions,然后调用doCan方法和guardTransition,现在guardTransition调度workflow.guard事件,当你有一个侦听器(onGuard)时,你的函数就会被调用。
这就是我认为正在发生的事情,我仍然不能100%确定我是否正确,在这种情况下应该做些什么,也许我需要更多的调查。
相关代码:
// all taken from Symfony/Component/Workflow/Workflow.php
public function apply($subject, $transitionName)
{
$transitions = $this->getEnabledTransitions($subject);
public function getEnabledTransitions($subject)
{
$enabled = array();
$marking = $this->getMarking($subject);
foreach ($this->definition->getTransitions() as $transition) {
if ($this->doCan($subject, $marking, $transition)) {
$enabled[] = $transition;
}
}
return $enabled;
}
private function doCan($subject, Marking $marking, Transition $transition)
{
foreach ($transition->getFroms() as $place) {
if (!$marking->has($place)) {
return false;
}
}
if (true === $this->guardTransition($subject, $marking, $transition)) {
return false;
}
private function guardTransition($subject, Marking $marking, Transition $transition)
{
if (null === $this->dispatcher) {
return;
}
$event = new GuardEvent($subject, $marking, $transition, $this->name);
$this->dispatcher->dispatch('workflow.guard', $event);在这里添加这个,这样它可能会在未来对某人有所帮助。
https://stackoverflow.com/questions/53073196
复制相似问题