如何定制一个没有使用继承的方法行为吗

编辑该页面

如何定制一个没有使用继承的方法行为吗

做一个方法调用之前或之后的事

如果你想做正确的事情,或者直接调用方法后,你可以派遣一个事件分别在开始或者结束的时候方法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
CustomMailer{/ /……公共函数发送(美元主题,美元消息){/ /调度事件之前的方法美元事件=BeforeSendMailEvent (美元主题,美元消息);美元- >调度程序- >调度(美元事件,“mailer.pre_send”);/ /得到主题和消息的事件美元,他们可能会被修改美元主题=美元事件- >getSubject ();美元消息=美元事件- >getMessage ();/ /这里的真正的方法实现美元returnValue=……;/ /后做一些方法美元事件=AfterSendMailEvent (美元returnValue);美元- >调度程序- >调度(美元事件,“mailer.post_send”);返回美元事件- >getReturnValue ();}}

在这个例子中,派出两个事件:

  1. mailer.pre_send之前,该方法被调用时,
  2. mailer.post_send方法被调用。

每个使用一个定制事件类信息沟通这两个事件的侦听器。例如,BeforeSendMailEvent可能像这样:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36
/ / src /事件/ BeforeSendMailEvent.php名称空间应用程序\事件;使用欧宝娱乐app下载地址\合同\EventDispatcher\事件;BeforeSendMailEvent扩展事件{私人美元主题;私人美元消息;公共函数__construct(美元主题,美元消息){美元- >主题=美元主题;美元- >消息=美元消息;}公共函数getSubject(){返回美元- >主题;}公共函数setSubject(美元主题){美元- >主题=美元主题;}公共函数getMessage(){返回美元- >消息;}公共函数setMessage(美元消息){美元- >消息=美元消息;}}

AfterSendMailEvent即使是这样的:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
/ / src /事件/ AfterSendMailEvent.php名称空间应用程序\事件;使用欧宝娱乐app下载地址\合同\EventDispatcher\事件;AfterSendMailEvent扩展事件{私人美元returnValue;公共函数__construct(美元returnValue){美元- >returnValue =美元returnValue;}公共函数getReturnValue(){返回美元- >returnValue;}公共函数setReturnValue(美元returnValue){美元- >returnValue =美元returnValue;}}

这两件事让你得到一些信息(如。getMessage ()(如),甚至改变这一信息。setMessage ())。

现在,您可以创建一个事件订阅者钩到这个事件。例如,你可以听mailer.post_send事件和改变方法的返回值:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
/ / src / EventSubscriber / MailPostSendSubscriber.php名称空间应用程序\EventSubscriber;使用应用程序\事件\AfterSendMailEvent;使用欧宝娱乐app下载地址\组件\EventDispatcher\EventSubscriberInterface;MailPostSendSubscriber实现了EventSubscriberInterface{公共函数onMailerPostSend(AfterSendMailEvent美元事件){美元returnValue=美元事件- >getReturnValue ();/ /修改初始的“returnValue“美元价值美元事件- >setReturnValue (美元returnValue);}公共静态函数getSubscribedEvents(){返回(“mailer.post_send”= >“onMailerPostSend”,);}}

就是这样!你的用户应该被称为自动(或了解更多事件用户配置)。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
欧宝娱乐app下载地址Symfony 6.0支持通过SensioLabs