【问题标题】:Symfony filter to run before and possibly skip the controllerSymfony 过滤器在控制器之前运行并可能跳过控制器
【发布时间】:2010-12-22 16:49:29
【问题描述】:

所需过滤器的想法是检查 memcached 中以 url 作为键的页面内容,如果找到,则直接从缓存中将其返回给客户端并完全跳过控制器。存储将在单独的过滤器中完成,这是容易的部分。我知道我可以将它写入操作的 preExecute() 但过滤器会提供更优雅的解决方案(可以为开发环境关闭它们)。

换句话说 - 过滤器是否有一种聪明的方法可以将响应推送到客户端并跳过执行操作?

【问题讨论】:

  • FWIW,我还没有深入研究 symfony 2,但这就是它的设计目的。

标签: caching symfony1 filter symfony-1.4


【解决方案1】:

实现这样的过滤器非常容易。实际上类似的解决方案存在于 symfony 中。

查看默认缓存过滤器(sfCacheFilter 类)。它正在做与您正在寻找的类似的事情。

替代路径

已经可以通过将默认文件缓存更改为 memcache 来直接使用 memcache。

在您的工厂文件中,您可以切换缓存驱动程序(apps/yourapp/config/factories.yml 或 config/factories.yml):

all:
  view_cache:
    class: sfMemcacheCache

你可以对 memcached 做同样的事情,但由于 symfony 不提供 sfMemcachedCache 类,你必须自己实现它。

这样您可以重用现有的缓存框架并利用 cache.yml 文件。

【讨论】:

  • 我需要对我的应用程序中的缓存进行更多控制(配对的 url/代理分组等),因此我将写入设置为 memcached 部分以进行过滤并将读取移至 preExecute()。尽管如此,仍在努力..一旦完成,将接受您的回答。谢谢!
【解决方案2】:

我建议你看看覆盖 sfExecutionFilter。

它是默认filters.yml中的最后一个过滤器,这意味着它是第一个执行的。 它负责调用你的 action 的 executeXXX 方法并加载相关的视图和其他一些东西。

大概您可以编写自己的过滤器扩展 sfExecutionFilter 并覆盖它的功能以跳过执行输出被缓存的控制器。

你可以找到默认的 filters.yml @ %SYMFONY_DIR%/config/config/filters.yml

【讨论】:

  • 我认为这是正确的答案。我对自己的做法有些不同,但考虑使用您的建议重构我的逻辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多