Yii2 da model rules ya’ni tekshiruvchi qoidalar bilan ishlash 2-qism
Bundan oldingi maqolamda men sizlarga Yii2ni o’zida bor va ko’p ishlatilinadigan tekshiruvchi qoidalari haqida ma’lumot bergan edim. Endi bugun o’zingiz uchun kerakli tekshiruvchi qoidalar yasashni ko’rsataman.
Demak boshladik.
Birinchi bo’lib men sizlarga shaxsiy teshiruvchi qoidalarni bir nechta yo’l orqali yasash mumkin ekanligini ko’rsataman, so’ng ularni qaysilari qachon ishlatilgani yaxshi ekanligini ko’rsatib o’taman. Bunday tekshiruvchi qoidalar 3 turga bo’linadi.
- Inline (yani bitta satrda) rules;
- Method yani alohida metod yasaladi;
- Alohida obyekt orqali ham yasalishi mumkin.
Birinchi bo’lib inline yani bir satrli tekshiruvchi qoidalar yasashni ko’rib o’tamiz.
//1-usul public function rules() { return [ //username foydalanuvchi ismi. Massivni ikkinchi qismida anonim funksiya ['username', function ($attribute, $params, $validator) { //Bunday foydalanuvchi ismi bor yoki yo'qligini tekshiruvchi qoida. if (!Profile::find()->where(['username' => $this->$attribute])->andWhere(['status'=>1])->andWhere(['NOT !=','username','admin'])->exists()) { //Agar shart amalga oshsa unda addError() yordamida foydalanuvchi uchun xabar beriladi. $this->addError($attribute, 'Bu foydalanuvchi bazada bor boshqasini tanglang'); } }], ]; }
Ya’ni birchi bo’lib tekshiriluvchi o’zgaruvchi ikkinchisi esa tekshiruvchi anonim metod.
Lekin bu mthod iloji boricha ishlatilinmasligi kerak, chunki kodni juda chalkashib yuboradi. Shuning uchun anonim funksiyani alohida funksiyaga olish kerak. Ushanda kod bunday holatga keladi.
//2-usul public function rules() { return [ //birinchi bo'lib o'zgaruvchi kiritiladi, so'ng tekshiruchi funksiyani ismi kiritiladi ['username', 'validateUsername'], ]; } //Funksiya nomi tekshiruvchi nomi bilan bir xil bo'lishi kerak public function validateUsername($attribute, $params) { if(!$this->hasErrors()) { if (!Profile::find()->where(['username' => $this->$attribute])->andWhere(['status'=>1])->andWhere(['NOT !=','username','admin'])->exists()) { $this->addError($attribute, 'The token must contain letters or digits.'); } } }
Bu metod ancha mukammal va ancha oson. Lekin ba’zida berilgan tekshiriluvchi qoidalar bir nechta joylarda ishlatilishga to’g’ri keladi, shuning uchun uni universal qilib alohida klassga olish kerak. Yii2 da juda oson va oddiygina qilib yasalgan.
Buning uchun loyihani asosiy papkasida alohida qilib validators degan papka yasang. So’ng, ichiga UsernameValidator degan klass yasang va ichiga bu kodni yozing
!!! Diqqat namespace ni appvalidators deb qo’ying bo’lmasam Yii2 siz yasagan klassni ko’rmasligi mumkin
//3-usul namespace appvalidators; use yiivalidatorsValidator; class UsernameValidator extends Validator { //validateAttribute bu public function validateAttribute($model, $attribute) { if (!Profile::find()->where(['username' => $model->$attribute])->andWhere(['status'=>1])->andWhere(['NOT !=','username','admin'])->exists()) { $this->addError($attribute, 'The token must contain letters or digits.'); } } }
Endi buni siz osongina qilib bu yasalgan class ishlata olasiz faqat uni kerakli joyda chaqirsangiz bo’ldi.
//3-usul public function rules() { return [ ['username', UsernameValidator::className()] ]; }
Shunday qilib men maqolamda sizlarga 3 xil yo’l bilan shaxsiy tekshiruvchi qoida yasashni ko’rsatdim. Qoidalar 3 xil yo’l bilan yasaladi, lekin men o’zimni shaxsiy tajribamdan kelib chiqib aytmoqchimanki, 1-usul ya’ni bir satrda anonim funksiya bilan yasalgan qoidalarni iloji boricha ishlatmaslikka harakat qiling, va yana iloji boricha har bir yasalga qoidani 3-usulda ko’rsatganidek qilib alohida klass olib qo’yin ushanda bu tekshiruvchi qoidani bir nechta joyda ishlatsa bo’ladi.
Hozircha shu, agar chuqurroq bilmoqchi bo’lsangiz Yii2 asosiy saytiga yuzlaning Yii2 input Validation.
E’tiboringiz uchun rahmat, agar savol va takliflaringiz bo’lsa unda izohlarda qoldiring.
Web Dasturlash
Yii2 da model rules ya’ni tekshiruvchi qoidalar bilan ishlash 2-qism