0

2つの異なる状況でプロセスを実装できるという要件があります。1つの状況は、開始日が過去になり得ない状況であり、もう1つの状況は、過去になり得る状況です。

現在、ZendValidateオブジェクトを使用して送信された各フィールドで一連の検証項目を実行するValueObjectsを利用しています。

検証は基本クラスを拡張します。

クラスValueObject_test1はfilter()を拡張します

フィルタは次のもので構成されています:-

class filter {
    protected $_filter;
    protected $_filterRules = array();
    protected $_validatorRules = array();
    protected $_data = array();
    protected $_objData = array();
    protected $_options = array(Zend_Filter_Input::ESCAPE_FILTER => 'StripTags');
    protected $_runValidation = true;
    protected function _setFilter()
    protected function _addFilter()
    protected function _addValidator()
    protected function _addData()
    protected function _addObject()
    protected function _addOption()
    public function getData()   
    public function hasErrors()
    public function getMessages()
    public function getValidationState()
    public function __get() 
    public function __isset()
    public function __set()
}

ValueObject_test1は次のもので構成されています。

class ValueObject_test1 extends filter {    
    public function __construct($testVar) {
        $this->_setData(testVar);       
        $this->_setFilters();
        $this->_setValidators();        
        if($this->_runValidation) {
            $this->_setFilter();
        }       
    }   
    protected function _setFilters(){
        $this->_addFilter("*", "StringTrim");
    }   
    protected function _setData($testVar) {     
        $this->_addData('testVar', $testVar);       
    }   
    protected function _setValidators() {       
        $this->_addValidator('testVar', array(new Zend_Validate(), 'presence'=>'required', 'messages'=>'Enter something'));
    }   
}

私が達成しようとしているのは、ValueObject_test1の拡張であり、2番目の状況では、ValueObject_test1()の項目だけでなく追加の検証項目も含まれるようになります。

私は私の2番目の状況のた​​めに以下を書きました:-

<?php

class ValueObject_test2 extends ValueObject_test1 { 
    public function __construct($testVar, $testVar2) {
        $this->_setData($testVar, $testVar2);       
        $this->_setFilters();
        $this->_setValidators();        
        if($this->_runValidation) {
            $this->_setFilter();
        }       
    }   
    protected function _setFilters(){
        $this->_addFilter("*", "StringTrim");
    }   
    protected function _setData($testVar, $testVar2) {  
        $this->_addData('testVar', $testVar);   
        $this->_addData('testVar2', $testVar2);     
    }
    protected function _setValidators() {       
        $this->_addValidator('testVar2', array(new Zend_Validate(), 'presence'=>'required', 'messages'=>'Enter something'));
    }
}

私が抱えている問題は、これからの出力が私の2番目の状況の検証を検証するだけで、2番目の状況の検証は何もしないように見えることです。_setData()で両方の変数を設定することにより、ValueObject_test1のアイテムとValueObject_test2のアイテムに対して検証が行われるべきだという印象を受けていますか?

4

1 に答える 1

2

class ValueObject_test2 extends ValueObject_test1 { 
    public function __construct($testVar, $testVar2) {
        $this->_setData($testVar, $testVar2);       
        parent::__construct($testVar);
    }   
    // _setFilters is identical to the parent implementation
    protected function _setData($testVar, $testVar2) {  
        $this->_addData('testVar2', $testVar2);
        parent::_setData($testVar);
    }
    protected function _setValidators() {       
        $this->_addValidator('testVar2', array(new Zend_Validate(), 'presence'=>'required', 'messages'=>'Enter something'));
        parent::_setValidators();
    }
}

私のコードは _setData を正しく呼び出しません。これは、parent:: _construct 内の $this-> setData(testVar) が関数の $this->_setData(testVar) バージョンを呼び出すためです。

関数をオーバーライドする場合、オーバーライドは親のロジックも実行する必要がある可能性があります。

<?php
class Foo {
    protected function _setFoobar() {       
        // Foo logic
    }
}

class Bar extends Foo {
    protected function _setFoobar() {       
        // custom Bar logic specific to the child class (Bar)
        parent::_setFoobar();
    }
}
于 2010-10-08T12:59:55.097 に答える