Yii 학습노트: ThinkPHP와 유사한 모델 필드 매핑, 필드 별명 구현

4183 단어
TP에서 우리는 모델 클래스에서 하나만 정의하면
protected $_map = array(
        'name' =>'username', //  name username 
        'mail'  =>'email', //  mail email 
    );

이렇게 하면 프런트엔드 템플릿에서
모델이 폼 데이터를 수집할 때 사용자 이름 필드에 값을 자동으로 비칩니다.
좋은 점은 데이터베이스 필드가 직접 노출되는 것을 피하는 것이다.
그러나 유감스럽게도 저는 Yii를 공부하는 과정에서 유사한 메커니즘을 찾지 못했습니다. Yii의 라이브러리가 많아서 저는 경솔하게 확장할 수 없습니다. 어딘가에 어떤 클래스가 해결 방안을 제공했을 수도 있고 무의미한 행동을 반복할까 봐 걱정됩니다.
일련의 사상 투쟁을 거쳐 건물주는 그래도 스스로 손을 쓰기로 결정했다.
방법은 간단합니다. 먼저 코드를 보십시오.
<?php
class CustomModel extends CActiveRecord {
    // 
    public $username;
    public $email;
    public $passwd;
    public $password;
    public $password1;
    
    public static function model($className=__CLASS__)
    {
        return parent::model($className);
    }
 
    public function tableName()
    {
        return '{{custom}}';
    }
    
    public function rules(){
        return array(
            array("username,password,email,password1","safe")
        );
    }
    // 
    protected $_alias_ = array(
        "passwd" => "password"
    );
    // 
    protected function afterConstruct(){
        parent::afterConstruct();
        // 
        if(!empty($this->_alias_)){
            foreach($this->_alias_ as $a => $b){
                if(property_exists($this,$a) && property_exists($this,$b)){
                    $this->$a = &$this->$b;
                }
            }
        }
    }
}

템플릿:
<?php defined("APP_NAME") or exit;?>
<form action="" method="post">
    <table>
        <tr>
            <th> :</th>
            <td><input type="text" name="username" placeholder=" " value=""/></td>
        </tr>
        <tr>
            <th> :</th>
            <td><input type="email" name="email" placeholder="example@website" value=""/></td>
        </tr>
        <tr>
            <th> :</th>
            <td><input type="password" name="password" value=""/></td>
        </tr>
        <tr>
            <th> :</th>
            <td><input type="password" name="password1" value=""/></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" value=" "/></td>
        </tr>
    </table>
</form>

폼에서password 필드 이름을 암호로 사용했지만 데이터베이스에 있는 필드는passwd입니다. 만약 직접 폼을 수집하면 암호 데이터를 창고에 넣을 수 없습니다.
그래서 나는 모델 클래스에서 하나의 방법을 정의했다.
afterConstruct()
하나의 속성
protected $_alias_
우리는 $_alias_이 속성에서 맵을 정의합니다. 예를 들어 제가'passwd'=>'password'의 맵을 정의했습니다.
afterConstruct () 이 방법은 모델 클래스를 실례화한 후에 실행됩니다. $model = new Custom Model () 에서 촉발된다고 볼 수 있습니다. 이 방법은 주로 $_ 검출 작업을 했습니다.alias_맵이 정의되어 있습니까? 만약 있다면, 우리는 php의 인용 전달 특성을 사용하여 두 필드가 같은 값을 가리키도록 합니다.
마지막으로 전역적으로 사용할 수 있도록components/디렉터리에 CommonModel 클래스를 만들고 afterConstruct() 방법을 이 클래스에 넣고 다른 모델은 이 클래스를 계승하면 됩니다. 이렇게 하면 각자의 모델에서 정의_alias_속성이면 됩니다.
/////////이벤트 기반 처리 방법
<?php
class CommonAR extends CActiveRecord{
    function init(){
        $this->onAfterConstruct = array($this,"autoMap");
    }
    // 
    protected $_alias_ = array(
    );
    
    function autoMap($event){
        // 
        if(!empty($this->_alias_)){
            foreach($this->_alias_ as $a => $b){
                if(property_exists($this,$a) && property_exists($this,$b)){
                    $this->$a = &$this->$b;
                }
            }
        }
    }
}

components/다음에CommonAR 클래스를 만들면 init () 방법에 이벤트를 등록합니다
$this->onAfterConstruct = array($this,"autoMap");
대응하는 이벤트 방법은 클래스 안의 autoMap()
그리고 구체적인 모델을 만들 때 CommonAR 클래스를 계승하여 $_ 정의하기alias_됐어.

좋은 웹페이지 즐겨찾기