制作代理类

时间:2011-06-28 01:33:48

标签: php symfony1

我正在尝试执行一个Proxy类,允许我将自定义值设置为不同的sfForm。我必须这样做,因为php没有多重继承(所有sfForm扩展了一些由doctrine制作的Base *)而且我总是将相同的代码复制粘贴到sfForm configure()方法。

到目前为止,我上课但却无法正常工作。我知道我必须通过引用传递对象,但我被困住了!

这是我做的

class FormProxy {
    private $_form;
    private $_formatter;

    public function __construct(sfForm &$form, $params = array()) {
        $this->_form = $form;

        if(count($params)>0)
            $this->set ($params);
    }

    public function set($array = array()){
        if (count($array) == 0){
            return;
        }

        if(isset ($array['formatter'])){
            $this->setFormatter($array['formatter']);
        }

        if(isset ($array['CSRFProtection'])){
            $this->disableCSRFProtection();
        }

        return $this;
    }

    public function setForm(sfForm &$form){
        $this->_form = $form;
        return $this;
    }

    public function & getForm(){
        $this->init();
        return $this->_form;
    }

    public function getFormatter(){
        return $this->_formatter;
    }

    public function setFormatter($formatter = null){
        $this->_formatter = $formatter;
        return $this;
    }

    private function init(){
        if($this->_formatter != null){
            $decorator = new sfWidgetFormSchemaFormatterLocal($form->getWidgetSchema(), $form->getValidatorSchema());
            $form->getWidgetSchema()->addFormFormatter($this->_formatter, $decorator);
            $form->getWidgetSchema()->setFormFormatterName($this->_formatter);
        }

    }

    public function disableCSRFProtection(){
        $this->_form->disableCSRFProtection();
    }
}

我知道代理类可能是静态的,但现在它是一样的。

编辑:

我的问题是,当我做

   $proxy = new FormProxy(new ClientForm(), array(
        'formatter' => 'custom',
        'CSRFProtection' => false,
    ));

    $form = $proxy->getForm();

对FormProxy所做的更改似乎没有在外部应用(在$ form变量中)。我认为这是因为我没有很好地处理$ form的引用,但是以不同的方式尝试了负面结果。

1 个答案:

答案 0 :(得分:0)

好吧,没有任何具体错误,我会打赌您的问题是函数$form中的变量init未定义。这是最明显的问题。您可以在$form = $this->_form;

之后放置if($this->_formatter != null){来解决此问题