symfony 5 - 事件未被调度

2023-12-27

当我提交订单时,我使用事件订阅者来处理一些操作。

问题是我的事件没有被调度,但是 symfony 能够找到他,因为他告诉我我的 OrderEvent::ORDER_CREATE 是孤立的。

我预计执行会停止die('Hello you from subscriber');但事实并非如此。

控制器

public function commanderPanierAction(Request $request, SelectionWeb $selectionWeb, TableLumineuse $tableLumineuse, EventDispatcherInterface $eventDispatcher)
{
    // DO PREVIOUS STUFF

    $Order = new Order();
    $OrderForm = $this->createForm(OrderForm::class, $Order);
        
    if ($request->isMethod('POST')) {
      $OrderForm->handleRequest($request);

      if ($OrderForm->isSubmitted() && $OrderForm->isValid()) {
          // OrderForm is valid proceed
          $eventDispatcher->dispatch(
              new OrderEvent($Order),
              OrderEvent::ORDER_CREATE
          );
      }
   } 

订单事件

<?php

namespace App\Event;

use App\Entity\Order;
use Symfony\Contracts\EventDispatcher\Event;

class OrderEvent extends Event
{
    public const ORDER_CREATE = 'order.created';

    protected $order;

    public function __construct(Order $order)
    {
        $this->order= $order;
    }

    public function getOrder(): Order
    {
        return $this->order;
    }
}

订单订阅者

<?php

namespace App\EventSubscriber;

use App\Event\CommandeWebEvent;
use App\Service\SelectionWeb\SelectionWeb;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;


class OrderSubscriber implements EventSubscriberInterface
{
    private $entityManager;

    private $selectionWeb;

    public function __construct(EntityManagerInterface $entityManager, SelectionWeb $selectionWeb)
    {
        $this->entityManager = $entityManager;
        $this->selectionWeb = $selectionWeb;
    }

    public static function getSubscribedEvents()
    {
        return [
            OrderEvent::ORDER_CREATE => [
                // The higher the number, the earlier the method is called.
                ['processOrder', 10],
                ['notifyOrder', -10]
            ]
        ];
    }

    public function processOrder(OrderEvent $event)
    {
        // TODO
        die('Hello you from subscriber');
    }

    public function notifyOrder(OrderEvent $event)
    {
        // TODO
    }
}

EDIT

找到的唯一解决方法(感谢@nikserg)是将订阅者注入控制器操作(订阅者具有依赖项),然后将我的订阅者注册为服务services.yaml最终使用$eventDispatcher->addSubscriber($subscriber); before $eventDispatcher->dispatch(new OrderEvent($Order),OrderEvent::ORDER_CREATE);

对于这么简单的任务来说,所有这些东西似乎都非常复杂

EDIT2

我找到了另一种无需使用即可执行订阅者的方法$eventDispatcher->addSubscriber($subscriber);并且仅与$eventDispatcher->dispatch(new OrderEvent($Order));仅当我将订阅者配置为服务时services.yaml但为什么 symfony 需要在 services.yaml 中提供这些信息?认为 src/ 中的所有内容都可以用作服务..

# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
App\:
    resource: '../src/*'
    exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

# If I add those It works
App\EventSubscriber\OrderSubscriber:
    autowire: true

EDIT3

我的 OrderSubscriber 已加载到容器中,那么为什么我应该将其显式设置为执行?我不明白发生了什么事

php bin/console debug:container
---------------------------------------- ---------------------------------------
Service ID                               Class name
---------------------------------------- ----------------------------------------
App\EventSubscriber\OrderSuscriber App\EventSubscriber\OrderSuscriber

EDIT 4

如果我设置我的OrderSubscriber明确地,容器中有两个实例。 为什么 symfony 显式执行一组而不是执行一组resource: '../src/*'


如果您需要它作为操作中的参数,Symfony 会将您的订阅者自动装配为服务:

public function commanderPanierAction(Request $request, SelectionWeb $selectionWeb, TableLumineuse $tableLumineuse, OrderSubscriber $orderSubscriber)

当然,如果您的订户注册正确。

但我建议您不要手动将订阅者创建为对象。订户的主要好处是您什么都不知道关于他们,当你触发事件时。此活动可能有数十个订阅者,他们都将继续您的活动。这将使您的代码保持良好并降低内聚性。

它在文档中:https://symfony.com/doc/current/event_dispatcher.html#creating-an-event-subscriber https://symfony.com/doc/current/event_dispatcher.html#creating-an-event-subscriber

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

symfony 5 - 事件未被调度 的相关文章

  • 将日期格式(在数据库或输出中)更改为 dd/mm/yyyy - PHP MySQL

    MySQL 将日期存储在我的数据库中 默认情况下 为 YYYY MM DD 我的日期的字段类型是 DATE 我不需要任何时间存储 有没有一种简单的方法可以默认更改它到 DD MM YYYY 我在两个不同的表中调用不同的日期 并且在我的任何代
  • XMLReader - 如何处理未声明的命名空间

    Merged https meta stackexchange com questions 158066 what is a merged question with 如何使用 XMLReader 读取未定义命名空间的 XML 文件 que
  • 从 stdin 读取后,PHP 在每行上给出尾随“=”

    stdin 的内容因自动换行和尾随 而被损坏 这显然破坏了我需要发布的 URL 我需要从电子邮件中提取 URL 链接 然后发布该 URL 因此 我使用我在互联网上看到的标准代码片段将电子邮件传输到 cpanel 中的 php 脚本 fd f
  • CodeIgniter Active Record - 组 OR 语句

    这是我的问题 MySQL 或 条件 https stackoverflow com questions 8604380 mysql or condition 解决方案是将 OR 语句分组 但我正在使用 CodeIgniters Active
  • 通过日期选择器过滤查询后检索具有特定值的行数[重复]

    这个问题在这里已经有答案了 目前 我正在使用 CodeIgniter 来检索特定时间范围内的数据 所有这些条目都有一个状态 我想将具有相同状态的所有条目分组并将其显示在各自的标题中 目前 这是我的模型类 其中我有以下条目来返回特定日期范围内
  • 将 PHP 变量保存到文本文件

    我想知道如何将 PHP 变量保存到 txt 文件 然后 再次检索它们 Example 有一个输入框 提交后写的东西 输入框将被保存到文本文件中 稍后需要结果 作为变量带回 假设变量是 text I 需要将其保存到文本文件并能够将其检索回来
  • PHPstorm - 无法在blade.php 文件中设置断点

    我正在开发 Laravel 应用程序 可以很好地调试我的控制器 php 文件 但我还想调试blade php 文件 在我当前的设置中 我遵循了所有 jetbrains 为 Laravel 推荐的设置 https confluence jet
  • 即使 is_dir 是一个目录,它也会返回 false 吗?

    为什么 is dir 即使是一个目录也会返回 false 没有返回错误 path mysql var lib mysql if is dir path mysql echo error 返回错误 path mysql var lib mys
  • 如何理顺 Laravel Blade @extends 的执行顺序?

    In 我尝试找到一种通过引用刀片 include来传递变量的方法 https stackoverflow com questions 25437939 how to pass variables by reference to includ
  • 如何使 WordPress 中的自定义模板充当受密码保护的页面?

    我正在使用自定义模板构建一个页面 问题是 我需要此页面受密码保护 或者至少可供登录用户访问 但即使我在 WordPress 管理的新页面部分中将其设置为此类 私人 密码保护 它也不会显示菜单项和内容 如果是私有的 或者它会立即显示页面内容
  • Laravel 雄辩的 withCount() 应该比 with() 慢

    所以我问这个的原因是在我当前的应用程序中withCount 与仅通过以下方式获取关系的所有数据相比 响应时间几乎增加了三倍with 并只是从前端获取长度 javascript 我认为使用的要点withCount 是为了加快查询速度 但也许我
  • 如何在 PHP 中递归删除目录及其全部内容(文件+子目录)? [复制]

    这个问题在这里已经有答案了 如何在 PHP 中删除目录及其全部内容 文件和子目录 手册页中的用户贡献部分rmdir http www php net rmdir包含一个不错的实现 function rrmdir dir if is dir
  • 按时间戳字段中的日期过滤结果

    我已经获得了一些帮助 但不确定为什么这不起作用 我正在尝试使用表单让用户过滤他们的活动 存储在数据库中 My code GET from 01 11 2013 GET to 25 11 2013 from DateTime createFr
  • mysqli_connect(): (HY000/2002): 无法建立连接,因为目标机器主动拒绝

    我知道有很多这样的问题 但我没有找到任何解决方案 我尝试过的事情 检查防火墙 重新启动我的电脑和 Apache 服务器 重新启动MYSQL 检查了我的代码 尝试了我所知道的和在互联网上找到的一切 这是我的代码
  • PHP 中 while (true){ 是什么意思?

    我看过这段代码 但不知道这意味着什么 while true echo Hello world 我知道什么是 while 循环 但是 while true 是什么意思 会执行多少次 这不是无限循环吗 虽然是无限循环 但您可以使用以下命令退出它
  • 使用 PHP 将子项添加到 XML 文件

    添加子项时 抛出此错误 无法添加孩子 父级不是 XML 树的永久成员 我无法解决这个问题 这是我的代码 if visited FIRST xml new SimpleXMLElement
  • PHP strtotime返回Mysql UNIX_TIMESTAMP的不同值

    我在 stackoverflow 上搜索过帖子 发现了一些类似的帖子 但我认为这是一篇不同的帖子 我的 PHP 和 Mysql 服务器的时区全部设置为 UTC 在表中我使用时间戳字段 值为 2010 11 08 02 54 15 我使用这样
  • CodeIgniter:使用多维 POST 数据验证表单

    所以框架是CodeIgniter 2 0 2 我有一个表单 其中包含与数据库中的行相对应的字段组 字段名称的格式为 opt 0 foo opt 0 bar opt 1 foo opt 1 bar etc 索引 1 2等 并不对应于数据库中的
  • SQL查询:按字符长度排序?

    是否可以按字符总数对sql数据行进行排序 e g SELECT FROM database ORDER BY data length 我想你想用这个 http dev mysql com doc refman 5 0 en string f
  • 使用 php 变量更改 css 类

    这里需要您的帮助 正如标题所示 我正在尝试使用 PHP 变量更改 css 类 所以基本上我想创建一个回显某些代码的循环 但我希望第一个循环中的 div 类有所不同 它应该被隐藏 这是我为使问题变得清晰而编写的简化代码 我不知道错误在哪里 请

随机推荐

  • Watir-webdriver:如何在没有 js/jquery 的情况下更改属性值

    如何在不使用 js jquery 的情况下使用 watir webdriver 更改 href 属性值 我可以获得一个属性值 browser frames 2 div id mid 2 link class btn lrg attribut
  • 如何创建森林图?

    我想将不同的风险比率合并到一个森林地块中 我希望输出类似于metamiss在 STATA 或metafor在 R 中 我怎样才能在 Python 中做到这一点 通过使用 zEPID 包 我创建了不同风险比的森林图 import matplo
  • 在报告中为 icCube 事件分配值

    我正在使用 icCube 5 0 报告 我想将事件的值分配给 icCube MDX 函数 UserName 返回的值 有点像 eventname UserName 最终 eventname reportParm 将被发送到启动的报告以在过滤
  • 创建可重用的 FormGroup

    我知道创建自定义controls作为组件 但我不知道如何创建自定义groups 同样我们可以这样做实施ControlValueAccessor https angular io api forms ControlValueAccessor并
  • soundex可以用于mysql中列的一部分吗?

    是否可以使用 soundex 将列的一部分与搜索词进行比较 例如 如果用户搜索 五十三 它将找到 Nirve Sports 五十三号巡洋舰金色金属色 我尝试将 soundex 与locate 函数结合起来 但出现错误 这是我的 php 代码
  • Android Studio 中不支持类型“add-resource”

    我在运行时遇到资源合并问题gradle build命令 日志如下 错误 任务 frameworks base core res res common packageReleaseResources 执行失败 gt 文件中不支持类型 add
  • iPhone 上基于位移贴图的 3D 效果

    我正在尝试制作一个使用置换贴图实现 3D 效果的应用程序 在 Flash 中 可以使用位移过滤器来完成 如下所示 http flashflex com pixel bender displacement map fakes 3d effec
  • JPA 多个嵌入字段

    JPA实体类是否可以包含两个嵌入的 Embedded 字段 一个例子是 Entity public class Person Embedded public Address home Embedded public Address work
  • 在 Visual Studio 2017 中生成 .NET Core 控制台应用程序 .exe

    我使用的是 Visual Studio 2017 我启动了一个小型控制台应用程序 我创建了一个 NET Core 应用程序 然后我想构建 exe 文件 但我得到的只是 dll 文件 没有任何 exe 文件 你能帮我吗 我需要在 Visual
  • Mysql从二进制日志读取数据时从master出错1236

    我有 2 个具有主 从配置的 MySql 并且复制失败 MySql Master崩溃了 新的寄存器在mysql bin index被创建 我删除了这个新的寄存器 因为文件系统中不存在该文件 然后MySql Master重启成功 现在 我在从
  • 使 Jackson 子类型可扩展,无需编辑超类型 java 文件

    在我的公司 我们有一个固定的 JSON 消息结构 headerVal1 headerVal2 customPayload payloadType 我想要某种库 它允许我不关心公司定义的消息结构 而只是发送和接收有效负载 我的想法是 将公司模
  • Java如何在Intellij中找到spark、Hadoop和AWS jar

    我正在 Java 中的 IntelliJ 上运行 Spark 应用程序 我已在 pom xml 中添加了 Spark Hadoop 和 AWS 依赖项 但不知何故 AWS 凭证并未加载 我得到的确切错误是Caused by com amaz
  • 如何在Asp.net的图像控件中显示数据库中的图像?

    如何在Asp net的图像控件中显示数据库中的图像 我们必须在asp net页面中显示员工的图像及其详细信息 但问题是如何在asp net图像控件上显示图像 因为图像控件通过属性ImageUrl来拍照 请指导 您可以创建一个 HttpHan
  • 单个 lambda、多个 cloudwatch 日志组

    运行 AWS lambda 后 将填充单个 cloudwatch 日志组 有没有一种方法可以从单个 AWS lambda 填充两个 不同的 cloudwatch 日志组 我搜索了一下但找不到答案 让我知道是否可能 无法从单个 lambda
  • NoReverseMatch at / Reverse for 'post_detail' 未找到关键字参数 '{'pk': ''}'

    我一直在尝试让这个应用程序工作 我运行 python manage py runserver 一切都很好 我能够看到该网站 以超级用户身份登录 发表评论 但是在尝试查看帖子时我开始收到错误 现在 如果我只是访问该网站 就会收到错误消息 我收
  • Javascript/jQuery onclick 不起作用

    我制作了一个 test html 文档来测试脚本 不知怎的 它不起作用 我不明白为什么什么也没有发生 脚本位于 tags 中并用 tag 包裹 CSS 也有它的 tags 为什么它不起作用 这是代码
  • Html 敏捷包帮助

    我正在尝试从网站上抓取一些信息 但找不到适合我的解决方案 我在互联网上读到的每一个代码都会至少产生一个错误 即使他们主页上的示例代码也会给我带来错误 My code HtmlDocument doc new HtmlDocument doc
  • 我可以使 Dialogflow 意图至少需要一个经过训练的实体吗?

    我知道如何使意图需要任何参数值 之后意图将强制获取该值 但有可能让它强制得到atleast给定实体参数之一 您可以为该意图启用 Webhook 实现 如果未提供实体 则重新提示用户至少提供一组实体之一
  • 静态与 Malloc

    与使用 malloc 相比 块作用域中的 static 关键字有什么优势 例如 功能A f static int x 7 功能B f int x malloc sizeof int if x NULL x 7 如果我理解正确的话 这两个程序
  • symfony 5 - 事件未被调度

    当我提交订单时 我使用事件订阅者来处理一些操作 问题是我的事件没有被调度 但是 symfony 能够找到他 因为他告诉我我的 OrderEvent ORDER CREATE 是孤立的 我预计执行会停止die Hello you from s