如何自定义方法行为不使用继承
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.0,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
如何自定义方法行为不使用继承
在方法调用之前或之后执行某些操作
如果你想在方法调用之前或之后做一些事情,你可以在方法的开始或结束分别分派一个事件:
12 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”);//从事件中获取$foo和$bar,它们可能已经被修改$主题=$事件->getSubject ();$消息=$事件->getMessage ();//真正的方法实现在这里$returnValue=……;//在方法之后执行一些操作$事件=新AfterSendMailEvent ($returnValue);$这->调度程序->调度($事件,“mailer.post_send”);返回$事件->getReturnValue ();}}
在这个例子中,有两个事件被抛出:mailer.pre_send
,方法执行前,和mailer.post_send
在方法执行之后。每个事件都使用自定义Event类向两个事件的侦听器传递信息。例如,BeforeSendMailEvent
可能是这样的:
12 34 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名称空间应用程序\事件;使用ob娱乐下载\合同\EventDispatcher\事件;类BeforeSendMailEvent扩展事件{私人$主题;私人$消息;公共函数__construct($主题,$消息){$这->主题=$主题;$这->消息=$消息;}公共函数getSubject(){返回$这->主题;}公共函数setSubject($主题){$这->主题=$主题;}公共函数getMessage(){返回$这->消息;}公共函数setMessage($消息){$这->消息=$消息;}}
和AfterSendMailEvent
甚至像这样:
12 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名称空间应用程序\事件;使用ob娱乐下载\合同\EventDispatcher\事件;类AfterSendMailEvent扩展事件{私人$returnValue;公共函数__construct($returnValue){$这->returnValue =$returnValue;}公共函数getReturnValue(){返回$这->returnValue;}公共函数setReturnValue($returnValue){$这->returnValue =$returnValue;}}
这两个事件都允许你获得一些信息(例如:getMessage ()
),甚至改变这些信息(例如:setMessage ()
).
现在,您可以创建一个事件订阅器来连接到这个事件。例如,你可以听mailer.post_send
事件,并更改方法的返回值:
12 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;使用ob娱乐下载\组件\EventDispatcher\EventSubscriberInterface;类MailPostSendSubscriber实现了EventSubscriberInterface{公共函数onMailerPostSend(AfterSendMailEvent$事件){$returnValue=$事件->getReturnValue ();//修改原始的“$returnValue”值$事件->setReturnValue ($returnValue);}公共静态函数getSubscribedEvents(){返回[“mailer.post_send”= >“onMailerPostSend”];}}
就是这样!您的订阅者将被自动调用(或阅读更多相关内容)事件订阅者配置).
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。