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 −라는 함수 생성 actionShowContactModelSiteController 다음 코드로.

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을 포함하지 마십시오.
  • 요청에 직접 액세스하지 않습니다.
  • 시나리오가 너무 많지 않습니다.