Yii2 freymvorkida behaviorlar

f3mK9F0smjNFRnSgfqEt_29.jpg

Behavior(xulq-atvor, o’zini tutish) – biror funksiyani turli xildagi klasslarda ishlatish, shuningdek kerakli funksiyani biror hodisa yuz berganda ishga tushirishda ham qo’l keladi.

Behavior ichida yii\base\Behavior::$owner xususiyati bilan behaviorning o’zi biriktirilgan komponentga murojaat qilish mumkin:

$this->owner // PostController obyekti

Kerakli behaviorni klassga berish uchun quyidagi usullardan foydalanish mumkin:

  • Obyekt(controller, model, component, …) ichida turib bog’lash. Bunda component ichida behaviors() metodi e’lon qilinadi.
  • behaviors() metodini e’lon qilmasdan dinamik bog’lash.
  • Sozlamalar fayli ichida turib bog’lash.

Bu usullarni birma bir ko’rib chiqamiz.

  1. Obyekt ichida bog’lash

Misol:

class PostController extends Controller
{         
   public function behaviors()
   {
      return [
         'slug' => [
           'class' => 'common\behaviors\Slug',
           'initial' => 'post_', // klass uchun o'zgaruvchi
           ]
       ];
     }
}

Bu yerda, controller ichida, action ishga tushishidan oldin belgilangan vazifani bajarish uchun behavior() yarartilyapti.

‘slug’ – ma’lumotlar massivi nomi. Ixtiyoriy beriladi.

‘class’ – chaqirilayotgan klass nomini ko’rsatadi.

‘initial’ – klassga ma’lumot uzatuvchi o’zgaruvchi.

 

Agar klassga hech qanday ma’lumot uzatish kerak bo’lmasa behaviorni nomsiz, anonym qilib qisqa ko’rinishda yozish mumkin:

public function behaviors()
{
    return [
      \common\behaviors\Slug::className(),
…

 

Yuqoridagi misollar uchun, Behavior klassi quyidagicha bo’ladi:

<?php
namespace common\behaviors;
use Yii;
use yii\base\Behavior;
 
class Slug extends Behavior
{
    public $initial = null;
    public function events()
    {
       return [
           yii\web\Controller::EVENT_BEFORE_ACTION => 'getMyMethod';
        ];
    }

    public function getMyMethod()
    {
       Yii::$app->params['fio'] = $this->initial.'abc';
    }
}

 

Bu holatda behavior event(hodisa)ni controller actioniga bog’lash uchun ishlatilyapti. Ya’ni, kontrollerning har qanday actionini ishga tushirishdan oldin Slug behavior klassidagi getMyMethod() metodi ishga tushadi.

Ushbu Slug behavior klass proyekt(loyiha)ichida  ‘fio’ nomli global parametr yaratadi unga ‘post_abc’ qiymatini beradi.

Parametrni quyidagicha olish mumkin:

public function actionIndex()
{
  exit(Yii::$app->params['fio']);
}

 

Behavior klassda ko’rsatilgan metodlari hodisalar bilan ishlatilishidan tashqari o’zi e’lon qilingan obyekt(controller, model, …)ni kengaytirishi(qo’shimcha imkoniyat qo’shishi) mumkin.

Ya’ni, masalan, Slug klassida quyidagi metodni qo’shsak:

public function name()
{
    return "Alisher";
}

Bu metodni controller actioni ichida chiqarish mumkin:

$this->name();
  1. behaviors() metodini e’lon qilmasdan behaviorni dinamik bog’lash.

Behaviorni dinamik bog’lash uchun kerakli komponentning yii\base\Component::attachBehavior() metodini chaqirish kerak.

Bu metodning birinchi parametri sifatida behavior uchu ixtiyoriy nom beriladi:

use app\components\MyBehavior;
// behavior obyektini kiritamiz
$component->attachBehavior('myBehavior1', new MyBehavior);
// behaviorning klas nomi bo'yicha bog'lash
$component->attachBehavior('myBehavior2', MyBehavior::className()); 
// sozlamar massividan foydalanib bog'lash
$component->attachBehavior('myBehavior3', [
            'class' => MyBehavior::className(),
            'prop1' => 'value1',
            'prop2' => 'value2',
]);

 

Slug klasini Controllerga bog’lashga misol:

yii\web\Controller::attachBehavior('Slug', 'common\behaviors\Slug');
//yoki
yii\web\Controller::attachBehavior('Slug', common\behaviors\Slug::className());
// agar joriy obyekt uchun ko'rsatilsa
$this->attachBehavior('Slug', 'common\behaviors\Slug');
 
// parametr yuborish
$this->attachBehavior('Slug', [
            'myBehavior1' => new MyBehavior,
            MyBehavior::className()
]);

 

  1. Sozlamalar orqali bog’lash.

Agar siz komponentni config/main.php faylida qo’shmoqchi bo’lsangiz, u holda behaviorni shu yerning o’zida bog’lash mumkin.

Bunda “as” yozuvi bilan bog’lanadi. “as”dan keyin behavior nomi keladi.

'comp' => [
            'class' => 'common\components\Comp',
            'age' => 23,
            'as Slug' => [
                        'class' => 'common\behaviors\Slug',
                        'initial' => 'abc'
            ]
],

 

Behaviorni sozlamalar faylida bog’lash uchun behavior bog’lanayotgan component yii\base\Component klasidan, behavior esa yii\base\Behavior klasidan meros olgan bo’lishi kerak bo’ladi.

Yuqoridagi sozlashdan so’ng – Comp klas orqali behavior(Slug klasi) metodiga murojaat qilish mumkin. M:

Yii::$app->comp->name();

 

Behaviorni loyiha obyektiga($app) bog’lash mumkin. Buning uchun config/main.php faylidagi return ichida as bilan Slug behaviori beriladi:

return [
            'params' => $params,
            ...
            'as Slug' => [
                        'class' => 'common\behaviors\Slug',
                        'initial' => 'abc'
            ]
];

Shundan so’ng loyihaga berilgan klasdagi metod va xususiyatlar qo’shiladi. Masalan, name() metodini quyidagicha chaqirish mumkin:

Yii::$app->name();

Agar parametrlar uzatilishi kerak bo’lmasa, kodni qisqaroq yozish mumkin:

'as myBehavior' => 'common\behaviors\MyBehavior'

Yoki

'as myBehavior' => MyBehavior::className()

Manbaa: Klisl.com