Yii 학습노트: ThinkPHP와 유사한 모델 필드 매핑, 필드 별명 구현
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_됐어.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.