Yii-모델
모델은 비즈니스 논리 및 규칙을 나타내는 개체입니다. 모델을 생성하려면yii\base\Model 클래스 또는 하위 클래스.
속성
속성은 비즈니스 데이터를 나타냅니다. 배열 요소 또는 개체 속성처럼 액세스 할 수 있습니다. 각 속성은 공개적으로 액세스 가능한 모델 속성입니다. 모델이 소유하는 속성을 지정하려면yii\base\Model::attributes() 방법.
살펴 보겠습니다. ContactForm 기본 애플리케이션 템플릿의 모델입니다.
<?php
namespace app\models;
use Yii;
use yii\base\Model;
/**
* ContactForm is the model behind the contact form.
*/
class ContactForm extends Model {
public $name; public $email;
public $subject; public $body;
public $verifyCode; /** * @return array the validation rules. */ public function rules() { return [ // name, email, subject and body are required [['name', 'email', 'subject', 'body'], 'required'], // email has to be a valid email address ['email', 'email'], // verifyCode needs to be entered correctly ['verifyCode', 'captcha'], ]; } /** * @return array customized attribute labels */ public function attributeLabels() { return [ 'verifyCode' => 'Verification Code', ]; } /** * Sends an email to the specified email address using the information collected by this model. * @param string $email the target email address
* @return boolean whether the model passes validation
*/
public function contact($email) { if ($this->validate()) {
Yii::$app->mailer->compose() ->setTo($email)
->setFrom([$this->email => $this->name])
->setSubject($this->subject) ->setTextBody($this->body)
->send();
return true;
}
return false;
}
}
?>
Step 1 −라는 함수 생성 actionShowContactModel 에 SiteController 다음 코드로.
public function actionShowContactModel() {
$mContactForm = new \app\models\ContactForm(); $mContactForm->name = "contactForm";
$mContactForm->email = "[email protected]"; $mContactForm->subject = "subject";
$mContactForm->body = "body"; var_dump($mContactForm);
}
위의 코드에서 우리는 ContactForm 모델을 만들고 속성을 설정하고 화면에 모델을 표시합니다.
Step 2 − 이제 입력하면 http://localhost:8080/index.php?r=site/show-contact-model 웹 브라우저의 주소 표시 줄에 다음이 표시됩니다.
모델이 다음에서 확장되는 경우 yii\base\Model이면 모든 멤버 변수 (공용 및 비 정적)가 속성입니다. 5 가지 속성이 있습니다.ContactForm 모델-이름, 이메일, 제목, 본문, verifyCode 새로운 것을 쉽게 추가 할 수 있습니다.
속성 레이블
속성과 관련된 레이블을 표시해야하는 경우가 많습니다. 기본적으로 속성 레이블은yii\base\Model::generateAttributeLabel()방법. 속성 레이블을 수동으로 선언하려면yii\base\Model::attributeLabels() 방법.
Step 1 − 열면 http://localhost:8080/index.php?r=site/contact, 다음 페이지가 표시됩니다.
속성 레이블은 이름과 동일합니다.
Step 2 − 이제 attributeLabels 기능 ContactForm 다음과 같은 방식으로 모델.
public function attributeLabels() {
return [
'name' => 'name overridden',
'email' => 'email overridden',
'subject' => 'subject overridden',
'body' => 'body overridden',
'verifyCode' => 'verifyCode overridden',
];
}
Step 3 − 열면 http://localhost:8080/index.php?r=site/contact 다시 한 번 다음 이미지와 같이 레이블이 변경되었음을 알 수 있습니다.
시나리오
다른 시나리오에서 모델을 사용할 수 있습니다. 예를 들어, 게스트가 연락처 양식을 보내려면 모든 모델 속성이 필요합니다. 사용자가 똑같은 일을하고 싶을 때는 이미 로그인되어 있으므로 DB에서 쉽게 가져올 수 있으므로 이름이 필요하지 않습니다.
시나리오를 선언하려면 scenarios()함수. 키가 시나리오 이름이고 값이 다음 인 배열을 반환합니다.active attributes. 활성 속성은 유효성을 검사 할 속성입니다. 그들은 또한 될 수 있습니다massively assigned.
Step 1 − 수정 ContactForm 다음과 같은 방식으로 모델.
<?php
namespace app\models;
use Yii;
use yii\base\Model;
/**
* ContactForm is the model behind the contact form.
*/
class ContactForm extends Model {
public $name; public $email;
public $subject; public $body;
public $verifyCode; const SCENARIO_EMAIL_FROM_GUEST = 'EMAIL_FROM_GUEST'; const SCENARIO_EMAIL_FROM_USER = 'EMAIL_FROM_USER'; public function scenarios() { return [ self::SCENARIO_EMAIL_FROM_GUEST => ['name', 'email', 'subject', 'body', 'verifyCode'], self::SCENARIO_EMAIL_FROM_USER => ['email' ,'subject', 'body', 'verifyCode'], ]; } /** * @return array the validation rules. */ public function rules() { return [ // name, email, subject and body are required [['name', 'email', 'subject', 'body'], 'required'], // email has to be a valid email address ['email', 'email'], // verifyCode needs to be entered correctly ['verifyCode', 'captcha'], ]; } /** * @return array customized attribute labels */ public function attributeLabels() { return [ 'name' => 'name overridden', 'email' => 'email overridden', 'subject' => 'subject overridden', 'body' => 'body overridden', 'verifyCode' => 'verifyCode overridden', ]; } /** * Sends an email to the specified email address using the information collected by this model. * @param string $email the target email address
* @return boolean whether the model passes validation
*/
public function contact($email) { if ($this -> validate()) {
Yii::$app->mailer->compose() ->setTo($email)
->setFrom([$this->email => $this->name])
->setSubject($this->subject) ->setTextBody($this->body)
->send();
return true;
}
return false;
}
}
?>
두 가지 시나리오를 추가했습니다. 게스트 용과 인증 된 사용자 용입니다. 사용자가 인증되면 이름이 필요하지 않습니다.
Step 2 − 이제 actionContact 의 기능 SiteController.
public function actionContact() {
$model = new ContactForm(); $model->scenario = ContactForm::SCENARIO_EMAIL_FROM_GUEST;
if ($model->load(Yii::$app->request->post()) && $model-> contact(Yii::$app->params ['adminEmail'])) {
Yii::$app->session->setFlash('contactFormSubmitted'); return $this->refresh();
}
return $this->render('contact', [ 'model' => $model,
]);
}
Step 3 − 유형 http://localhost:8080/index.php?r=site/contact웹 브라우저에서. 현재 모든 모델 속성이 필요하다는 것을 알 수 있습니다.
Step 4 −에서 모델의 시나리오를 변경하는 경우 actionContact, 다음 코드와 같이 name 속성이 더 이상 필요하지 않음을 알 수 있습니다.
$model->scenario = ContactForm::SCENARIO_EMAIL_FROM_USER;
대규모 할당
대량 할당은 한 줄의 코드를 통해 여러 입력 속성에서 모델을 만드는 편리한 방법입니다.
코드 줄은-
$mContactForm = new \app\models\ContactForm;
$mContactForm->attributes = \Yii::$app->request->post('ContactForm');
위의 주어진 코드 줄은-
$mContactForm = new \app\models\ContactForm; $postData = \Yii::$app->request->post('ContactForm', []); $mContactForm->name = isset($postData['name']) ? $postData['name'] : null;
$mContactForm->email = isset($postData['email']) ? $postData['email'] : null; $mContactForm->subject = isset($postData['subject']) ? $postData['subject'] : null;
$mContactForm->body = isset($postData['body']) ? $postData['body'] : null;
전자는 훨씬 깨끗합니다. 그것을주의해라massive assignment 에만 적용됩니다 safe attributes. 이들은 목록에 나열된 현재 시나리오 속성 일뿐입니다.scenario() 함수.
데이터 내보내기
모델은 종종 다른 형식으로 내 보내야합니다. 모델을 배열로 변환하려면actionShowContactModel 의 기능 SiteController −
public function actionShowContactModel() {
$mContactForm = new \app\models\ContactForm();
$mContactForm->name = "contactForm"; $mContactForm->email = "[email protected]";
$mContactForm->subject = "subject"; $mContactForm->body = "body";
var_dump($mContactForm->attributes);
}
유형 http://localhost:8080/index.php?r=site/show-contact-model 주소 표시 줄에 다음이 표시됩니다.
모델을 JSON 형식, 수정 actionShowContactModel 다음과 같은 방식으로 기능-
public function actionShowContactModel() {
$mContactForm = new \app\models\ContactForm();
$mContactForm->name = "contactForm"; $mContactForm->email = "[email protected]";
$mContactForm->subject = "subject"; $mContactForm->body = "body";
return \yii\helpers\Json::encode($mContactForm);
}
Browser output −
{
"name":"contactForm",
"email":"[email protected]",
"subject":"subject",
"body":"body ",
"verifyCode":null
}
중요 사항
모델은 일반적으로 잘 설계된 애플리케이션의 컨트롤러보다 훨씬 빠릅니다. 모델은-
- 비즈니스 로직을 포함합니다.
- 유효성 검사 규칙을 포함합니다.
- 속성을 포함합니다.
- HTML을 포함하지 마십시오.
- 요청에 직접 액세스하지 않습니다.
- 시나리오가 너무 많지 않습니다.