使用symfony的ob娱乐下载事件系统
在本教程中,我想向您展示如何添加灵活性使用symfony symfony应用程序内置的事件系统。ob娱乐下载对于这个示例假设我们有一个网站,用户可以从照片打分系统中其他用户。每次用户图片,一些操作会根据应用程序的业务规则:
- 用户将获得分他的行动
- 会话应该更新指示用户打分的图像
- 视图缓存必须清除模板显示用户评价图像的数量
虽然我们可以重写图片::保存()
方法添加一个钩子,所以每次用户率图像我们执行这三个操作,这可以带来一些不必要的后果。举几例:如果用户上传图像,当我们将对象存储在数据库我们将不必要的清晰视图缓存和数据存储在会话中。另外,如果我们有一个后台管理图片,每次一个网站管理员检查图像覆盖save ()
方法将调用,所有额外的行动。
ob娱乐下载Symfony营救事件系统
1.1版本以来,symfony提供了一ob娱乐下载个事件通知系统。基本上,应用程序的框架类调度事件在特定时刻。我们可以注册自己的听众行动事件通知。我们甚至可以创建和分派我们自定义事件。
阅读更多关于symfony的事件系统,请参考以ob娱乐下载下链接:
在我们的例子中,我们将触发自定义事件后用户率的图像我们可将侦听器添加到相应的行动。
在rateImage
行动我们将下面的代码:
公共函数executeRateImage(sfWebRequest美元的请求){/ /代码处理这里的图像速度……这个美元- >调度程序- >通知(新sfEvent(这个美元,“images.image_rated”));}
这将触发一个事件的名称images.image_rated
作为主体行动的生成。我们将稍后使用的主题检索相关信息的上下文事件发生。
的sfEvent
构造函数将按照以下顺序三个参数:事件主题、事件名称和一个可选的参数,可以使用的事件处理程序。因为sfEvent
实现了ArrayAccess
界面我们可以轻松访问参数如下:美元的事件(“my_parameter”)
。
更多的详细信息
ArrayAccess
接口检查PHP文欧宝官网下载app档。
下一步是实际上听这个事件。我们可以添加侦听器在几个地方symfony应用程序。ob娱乐下载对于本例,我们将在应用程序配置文件中。所以,让我们注册监听器:
类frontendConfiguration扩展sfApplicationConfiguration{公共函数配置(){/ /……/ /注册监听器这个美元- >调度程序- >连接(“images.image_rated”,数组(“UsersManager”,“addPointsToUser”));这个美元- >调度程序- >连接(“images.image_rated”,数组(“UsersManager”,“updateSessionPoints”));这个美元- >调度程序- >连接(“images.image_rated”,数组(“UsersManager”,“clearRatePartial”));}}
正如你所看到的,应用程序配置类有一个成员,symfony的引用事件调度器。ob娱乐下载我们告诉它,我们希望得到通知当事件的类型images.image_rated
是解雇。然后,我们将创建一个UsersManager
类提供的方法听事件。在进入之前UsersManager
我们应该谈论类代码sfEventDispatcher
类。
symfony的书ob娱乐下载我们知道这个类提供了机制来添加和删除侦听器和通知事件。让我们看看一些的sfEventDispatcher
公共方法:
公共函数连接(名称、美元侦听器)
我们使用这个方法的frontendConfiguration
我们定制事件类注册监听器。第一个参数是事件名称(images.image_rated
在我们的例子中)和第二个应该是一个变量的一个侦听器回调伪PHP类型。
更多关于PHP的回调PHP文欧宝官网下载app档。
公共函数断开(名称、美元侦听器)
预期的参数和前面的方法一样,但这一次我们使用它来删除一个侦听器。如果我们有一个特定的模块的情况下我们的应用程序不需要听一个特定事件我们可以添加一个config。
文件内的模块配置
文件夹下面的代码:
这个美元- >调度程序- >断开连接(“images.image_rated”,数组(“UsersManager”,“clearRatePartial”));
公共函数hasListeners(名称)
这个方法将返回真正的
如果提供的事件名称注册侦听器。
公共函数getListeners(名称)
如果我们需要做一些注册监听器为一个特定的事件我们也可以检索他们通过调用此方法,提供事件的名称。
现在让我们来看看UsersManager
代码:
类UsersManager{静态公共函数addPointsToUser(sfEvent美元的事件){UserPeer::updateUserPoints(美元的事件- >getSubject()- >getUser()- >getPoints()+ sfConfig::得到(“app_points_for_rating”));}静态公共函数updateSessionPoints(sfEvent美元的事件){$ user=美元的事件- >getSubject()- >getUser();$ user- >定位点($ user- >getPoints()+ sfConfig::得到(“app_points_for_rating”));}静态公共函数clearRatePartial(sfEvent美元的事件){如果(美元的缓存=美元的事件- >getSubject()- >getContext()- >getViewCacheManager()){美元的缓存- >删除(“用户/点? id =”。美元的事件- >getSubject()- >getUser()- >getId());}}}
在addPointsToUser ()
方法,我们实际的用户检索点从会话,我们添加更多的点,然后将它们存储到数据库中。
的updateSessionPoints ()
遵循一个类似的机制,但更新用户会话。
如果你想知道我们如何访问symfony会话用户,答案是在symfony事件背后的魔法体ob娱乐下载系。如果你还记得从代码在我们的行动通知,我们提供当前动作实例为我们定制事件的主题。在syob娱乐下载mfony中,行动可以访问会话的用户通过调用
$ this - > getUser ()
这是我们在我们的例子中。
最后我们注册事件侦听器UsersManager: clearRatePartial ()
,我们得到视图缓存管理器的一个实例,我们让它清楚所需的缓存。
结论
ob娱乐下载Symfony事件系统提供了大量的应用程序功能。它可以用来构建高度解耦系统,使胶水代码。你习惯这个技术之后,它会更容易构建苗条的控制器,MVC的力量最大化。也要记住,因为symfony的书解释说,你甚至可以在运行时调整框架的工作方式,使其高度可ob娱乐下载定制的。
评论
评论都关门了。
以确保评论保持相关,他们关闭了旧的帖子。
伟大的工作,这个科幻特性是非常有用的!
但是我想知道此刻在过滤器链注册监听器实际执行的代码。
我认为重要的是要保持任何与你的互动模型控制器的清晰度。
缓存和会话状态是方便的。
例如可能希望能够激活/禁用应用程序中的一些功能像facebok活动提要之类的。但如果你想禁用这个特性由于太优质负载或bug,硬编码的控制器将迫使你去直接逻辑控制器和评论功能。你可以断开eventlistener使用事件。我非常喜欢这个想法!
读完最后一个博客文章关于事件的系统我昨天添加了一个功能建议uservoice;)
http://ob娱乐下载symfony.uservoice.com/pages/symfony/suggestions/126150-add-more-sfevents-to-core-classes
例:尽管代码长度并不是唯一的方面,它实际上是更长的时间,不是吗?3 + 1 = 4通知连接电话吗?
它是更好的耦合是少紧吗?
但是照顾解雇自己的事件:如果你火超过100事件,你将失去概述,你可以让你难以发现的错误。小姐´t忘记记录了火和哪些对象的事件传递给sfEvent。
@A‰ric RogA©:我不会用sfEventDispatcher模型类。一个模型不应该知道更像其他类似的事情。我会发送这类事件控制器(动作/组件类)。
让我们考虑的情况下事件时触发的一篇文章被删除。
当然,你可以通知事件在每一个动作/组件类,删除一篇文章。但它不利于干燥的概念。
有时候,几乎没有其他的方法。
在您的应用程序,你的客户想要删除,如果一个作家,他的文章也被删除。
然后你将如何火文章删除事件吗?通知还在每个动作/组件,删除一个作者吗?
对我来说,这些事件通知模型类的好地方。
我可能是错的,你的意见呢?
事件系统一般来说:我一直在Java中使用观察者模式很广泛,我喜欢它,它是一个非常强大的东西使用(如果正确使用),它对保持应用程序(和应用模型)分离。与其他有办法滥用它。