Отключение анонсирования событий
События 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).».