Yii2 framework backup
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

3.8 KiB

Komponenty

Komponenty są głównym budulcem aplikacji Yii. Komponenty to instancje klasy yii\base\Component lub jej potomnych. Trzy główne funkcjonalności, które zapewniają komponenty innym klasom to:

Wszystkie razem i każda z tych funkcjonalności osobno zapewnia klasom Yii o wiele większą elastyczność i łatwość użycia. Dla przykładu, dołączony yii\jui\DatePicker, komponent interfejsu użytkownika, może być użyty w widoku, aby wygenerować interaktywny kalendarz:

use yii\jui\DatePicker;

echo DatePicker::widget([
    'language' => 'pl',
    'name'  => 'country',
    'clientOptions' => [
        'dateFormat' => 'yy-mm-dd',
    ],
]);

Właściwości widżetu są w łatwy sposób konfigurowalne ponieważ jego klasa rozszerza yii\base\Component.

Komponenty zapewniają duże możliwości, ale przez to są też bardziej zasobożerne od standardowych obiektów, ponieważ wymagają dodatkowej pamięci i czasu CPU dla wsparcia eventów i behaviorów w szczególności. Jeśli komponent nie wymaga tych dwóch funkcjonalności, należy rozważyć rozszerzenie jego klasy z yii\base\BaseObject zamiast yii\base\Component. Dzięki temu komponent będzie tak samo wydajny jak standardowy obiekt PHP, ale z dodatkowym wsparciem właściwości.

Rozszerzając klasę yii\base\Component lub yii\base\BaseObject, zalecane jest aby przestrzegać następującej konwencji:

  • Przeciążając konstruktor, dodaj parametr $config jako ostatni na liście jego argumentów i przekaż go do konstruktora rodzica.
  • Zawsze wywoływuj konstruktor rodzica na końcu przeciążanego konstruktora.
  • Przeciążając metodę yii\base\BaseObject::init(), upewnij się, że wywołujesz metodę init() rodzica na początku własnej implementacji metody init().

Przykład:

<?php

namespace yii\components\MyClass;

use yii\base\BaseObject;

class MyClass extends BaseObject
{
    public $prop1;
    public $prop2;

    public function __construct($param1, $param2, $config = [])
    {
        // ... inicjalizacja przed zaaplikowaniem konfiguracji

        parent::__construct($config);
    }

    public function init()
    {
        parent::init();

        // ... inicjalizacja po zaaplikowaniu konfiguracji
    }
}

Postępowanie zgodnie z tymi zasadami zapewni konfigurowalność Twojego komponentu, kiedy już zostanie utworzony. Dla przykładu:

$component = new MyClass(1, 2, ['prop1' => 3, 'prop2' => 4]);
// lub alternatywnie
$component = \Yii::createObject([
    'class' => MyClass::class,
    'prop1' => 3,
    'prop2' => 4,
], [1, 2]);

Info: Wersja z wywołaniem Yii::createObject() wygląda na bardziej skomplikowaną, ale jest o wiele wydajniejsza, ponieważ jej implementację zapewnia kontener wstrzykiwania zależności.

Klasa yii\base\BaseObject wymusza następujący cykl życia obiektu:

  1. Preinicjalizacja w konstruktorze. W tym miejscu można ustawić domyślne wartości właściwości.
  2. Konfiguracja obiektu poprzez $config. Konfiguracja może nadpisać domyślne wartości ustawione w konstruktorze.
  3. Postinicjalizacja w metodzie yii\base\BaseObject::init(). Metoda może być przeciążona w celu normalizacji i sanityzacji właściwości.
  4. Wywołanie metody obiektu.

Pierwsze trzy kroki są w całości wykonywane w konstruktorze obiektu, co oznacza, że uzyskana instancja klasy jest już poprawnie zainicjowana i stabilna.