0

我希望在构造函数注入中设置MyFilter中的某些属性,但在Zend_View::addFilter(string $filter_class_name)中似乎不可行,因为它在使用时加载新实例。 MyFilter implements Zend_Filter_Interface将过滤器注入Zend_View

可以以某种方式将实例的过滤器注入到Zend_View的实例吗?

由于它(有希望)会被关闭到2.0,请参阅ticket on JIRA

+0

我正在考虑使用像'Zend_View :: getFilter()'的东西,但该方法的作用就像':: setFilter()'..没有运气那里。 – chelmertz 2010-04-20 07:43:12

+0

呃,似乎我找不到任何好的理由来投票结束。弃船。 – chelmertz 2010-04-20 18:23:26

回答

0

您可以传递对象:

$filter = new Your_Filter($params); // implements Zend_Filter_Interface 
$view->addFilter($filter); 

你可以从视图解析器,例如获得视图实例使用staticHelper。

编辑:

另一种方法可能是:

class MyFilterSetup extends MyFilter implements Zend_Filter_Interface 
{ 
    public function __construct($params) 
    { 
      $this->_params = $params; 
      parent::__construct(); 
    } 

    public function filter($string) 
    { 
     // .... $this->_params; 
    } 
} 
+0

您的代码无效。 'Zend_View :: addFilter()'接受一个字符串(或字符串数​​组)作为参数并在稍后动态加载这些类。如果您实际上可以让您的代码运行,请随时编写更多代码行来覆盖它:)谢谢。 – chelmertz 2010-04-19 20:18:03

+0

新代码示例的工作方式与第一种类似,在Zend_View中使用它之前,仍然没有机会真正获得值。 – chelmertz 2010-04-20 05:20:48

0

我不能肯定,但我不认为这是可能的。查看源代码setFilter()addFilter()只接受Filter Classname作为字符串。您无法设置任何选项,例如您可以在Zend_Form中进行设置。什么,你可以尽管做的是:

class MyFilter implements Zend_Filter_Interface 
{ 
    protected static $_config; 
    public static setConfig(array $options) 
    { 
     self::_config = $options; 
    } 
    // ... do something with the options 
} 

然后设置其中具有MyFilter::setOptions()所需的选项,所以当Zend_View实例的过滤器实例,它有什么保证其正常运行过滤器。

+0

这几乎是一种选择,但不是很优雅。如果我想要添加两次相同的过滤器,但使用不同的设置? – chelmertz 2010-04-20 07:53:18

+0

@chelmertz然后你可能不得不自定义'Zend_View'来做你想做的事情。或者将过滤器所经过的实例化的数目存储为另一个静态属性,并静态地为每个实例添加一个配置。这不太好,但会起作用。 – Gordon 2010-04-20 08:09:23

+0

我宁愿使用'Zend_View :: render()'的输出并在其上应用过滤器,但它会消除与视图关联的过滤器的能力。如果没有我们错过的东西,我们会进一步推动。 – chelmertz 2010-04-20 08:26:30

0

我们不能创建扩展Zend_View它覆盖addFilter()方法的自定义视图对象接受一个类或一个实例。然后覆盖_filter()方法来处理我们存储的两种类型的过滤器 - 字符串和实例。

+0

我认为这是一个设计错误,应该在框架本身内进行修改。但我认为这是一个有效的解决方案,所以......为什么不修补它? :) – chelmertz 2010-10-06 19:01:00

+0

哎呀,谢谢! – 2010-10-07 03:28:29

0

为什么不将过滤器属性分配给视图,然后在设置视图时设置属性,或者直接在过滤函数中访问视图?例如

$view->assign('MyFilterProperty', 'fubar'); 

,然后在过滤器类:

public function setView($aView) 
{ 
    $this->_property = $aView->MyFilterPropery; 
} 

这是缺憾,但它应该完成这项工作。

+0

我不认为这种方法可行,因为1)过滤器将取决于(或劫持)每个属性,并且; 2)它不会过滤所有的输出。想象一下,我想在两个连续的调用中使用不同的参数在视图的正常渲染上应用调用'str_replace()'--functionality的过滤器(对于愚蠢的示例,抱歉:) – chelmertz 2011-04-14 18:28:21