Komponenty
Komponenty są głównym budulcem aplikacji Yii. Komponenty to instancje klasy [[yii\base\Component|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|widżet wybierania daty]], 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|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|BaseObject]] zamiast [[yii\base\Component|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|Component]] lub [[yii\base\BaseObject|BaseObject]], zalecane jest aby przestrzegać następującej konwencji:
- Przeciążając konstruktor, dodaj parametr
$configjako 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()|init()]], upewnij się, że wywołujesz metodę
init()rodzica na początku własnej implementacji metodyinit().
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|BaseObject]] wymusza następujący cykl życia obiektu:
- Preinicjalizacja w konstruktorze. W tym miejscu można ustawić domyślne wartości właściwości.
- Konfiguracja obiektu poprzez
$config. Konfiguracja może nadpisać domyślne wartości ustawione w konstruktorze. - Postinicjalizacja w metodzie [[yii\base\BaseObject::init()|init()]]. Metoda może być przeciążona w celu normalizacji i sanityzacji właściwości.
- 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.