Новое в Symfony 5.1: Улучшения рабочего процесса

Отключение анонсирования событий

События workflow.announce запускаются для каждого перехода, который теперь доступен для субъекта.

В Symfony 5.1 вы можете отключить эти события, используя контекст, переданный методу apply():

use Symfony\Component\Workflow\Workflow;

$workflow->apply($subject, $transitionName, [Workflow::DISABLE_ANNOUNCE_EVENT => true]);

Проверка существования рабочего процесса

Вы можете внедрить службу реестра, чтобы иметь доступ ко всем рабочим процессам, определенным в приложении. В Symfony 5.1 этот реестр добавил новый метод has(), который проверяет, существует ли рабочий процесс для данного субъекта:

use App\Entity\BlogPost;
use Symfony\Component\Workflow\Registry;

public function myController(Registry $registry, BlogPost $post)
{
    // check if a workflow exists for this object
    if ($registry->has($post)) {
        // ...
    }

    // check if a workflow called 'publishing_workflow' exists for this object
    if ($registry->has($post, 'publishing_workflow')) {
        // ...
    }

    // ...
}

Объяснение заблокированных переходов

В Symfony 5.1, когда блокируете переход внутри события, теперь вы можете передать необязательный второй аргумент в setBlocked() с сообщением, объясняющим, почему переход был заблокирован:

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Workflow\Event\GuardEvent;

class BlogPostReviewListener implements EventSubscriberInterface
{
    public function guardReview(GuardEvent $event)
    {
        $blogPost = $event->getSubject();

        if (empty($blogPost->title)) {
            $event->setBlocked(true, 'This blog post cannot be marked as reviewed because it has no title.');
        }
    }

    // ...
}

Если вы не предоставите пользовательское сообщение, Symfony создаст общее сообщение со следующим синтаксисом: “The transition has been blocked by a guard ($caller).”.