Класс Laravel WorkflowSubscriber, который условно вызывает методы защиты на основе текущего перехода, вызывая неправильные методы - PullRequest
0 голосов
/ 31 октября 2018

У меня здесь излишне непонятная ситуация. Я просто пытаюсь создать метод внутри этого 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...