0 follower

Aplikacja

Aplikacja reprezentuje kontekst wykonywania podczas przetwarzania żądania. Jej głównym zadaniem jest rozszyfrowywanie żądań użytkownika oraz rozprowadzanie ich do odpowiednich kontrolerów w celu ich późniejszego przetworzenia. Służy ona również jako główne miejsce do przechowywania konfiguracji na poziomie aplikacji. Z tego powodu, aplikacja jest również nazywana front-controller'em.

Aplikacja jest tworzona jako singleton przez skrypt wejściowy. Singletor reprezentujący aplikację jest dostępny w każdym miejscu poprzez wywołanie Yii::app().

1. Konfiguracja aplikacji

Domyślnie, aplikacja jest instancją klasy CWebApplication. Aby dostosować ją do własnych potrzeb, zazwyczaj dostarczamy jej plik konfiguracyjny (lub tablicę) w celu zainicjalizowania wartości właściwości aplikacji podczas tworzenia jej instancji. Alternatywnym sposobem dostosowywania aplikacji do własnych potrzeb jest rozszerzenie klasy CWebApplication.

Konfiguracja jest tablicą par klucz-wartość. Każdy klucz reprezentuje nazwę właściwości instancji aplikacji a każda wartość odpowiadającą jej wartość początkową. Na przykład, następująca konfiguracja, konfiguruje właściwości name oraz defaultController aplikacji.

array(
    'name'=>'Yii Framework',
    'defaultController'=>'site',
)

Zazwyczaj przechowujemy konfigurację w osobnym skrypcie PHP (np. protected/config/main.php). Wewnątrz skryptu zwracamy tablicę konfiguracyjną w następujący sposób:

return array(...);

Aby skorzystać z konfiguracji, przekazujemy nazwę pliku konfiguracyjnego jako parametr do konstruktora aplikacji lub do metody Yii::createWebApplication() w następujący sposób, dokładnie tak, jak zostało to zrobione w skrypcie wejściowym:

$app=Yii::createWebApplication($configFile);

Wskazówka: Jeśli konfiguracja aplikacji jest bardzo złożona, możemy podzielić ją na kilka plików, każdy będzie zwracał wtedy część tablicy konfiguracyjnej. Następnie w głównym pliku konfiguracyjnym, wołamy funkcję PHP include() w celu załadowania pozostałych plików konfiguracyjnych oraz złączamy je w jedną, kompletną tablicę konfiguracyjną.

2. Folder główny aplikacji (ang. Application Base Directory)

Folder główny aplikacji wskazuje na katalog główny, który zawiera wszystkie wrażliwe na bezpieczeństwo skrypty PHP oraz dane. Domyślnie, jest to podkatalog nazwany protected, który znajduje się w katalogu zawierającym skrypt wejściowy. Można go dostosować do własnych potrzeb poprzez ustawienie właściwości
basePath w konfiguracji aplikacji.

Dostęp do zawartości w folderze głównym aplikacji powinien być chroniony, tak by żaden użytkownik webowy nie miał do niego dostępu. Dla serwera HTTP Apache można to uczynić prosto poprzez umieszczenie pliku .htaccess w katalogu głównym. Zawartość pliku .htaccess powinna być następująca:

deny from all

3. Komponent aplikacji

Funkcjonalności oferowane przez aplikację mogą być łatwo dostosowane do potrzeb oraz wzbogacone dzięki elastycznej komponentowej architekturze. Aplikacja zarządza zestawem komponentów aplikacji, każdy z nich implementuje określoną funkcjonalność. Na przykład, aplikacja rozszyfrowuje żądanie użytkownika przy pomocy komponentów CUrlManager oraz CHttpRequest.

Poprzez skonfigurowanie właściwości komponentów aplikacji, możemy dostosować do swoich potrzeb klasy oraz wartości właściwości każdego komponentu aplikacji używanego w aplikacji. Na przykład, możemy skonfigurować komponent CMemCache w taki sposób, że będzie używał wielu serwerów memcache do buforowania (ang. caching).

array(
    ......
    'components'=>array(
        ......
        'cache'=>array(
            'class'=>'CMemCache',
            'servers'=>array(
                array('host'=>'server1', 'port'=>11211, 'weight'=>60),
                array('host'=>'server2', 'port'=>11211, 'weight'=>40),
            ),
        ),
    ),
)

W powyższym przykładzie, dodaliśmy element cachedo tablicy komponentówcomponents. Elementcachemówi, iż klasą komponentu jestCMemCachea jej właściwośćservers` powinna być w taki i taki sposób zainicjalizowana.

Aby dostać się do komponentu aplikacji używamy Yii::app()->ComponentID, gdzie ComponentID odnosi się do ID komponentu (np. Yii::app()->cache).

Komponent aplikacji może zostać dezaktywowany poprzez ustawienie enabled na false w jego konfiguracji. Wartość null jest zwracana, jeśli chcemy uzyskać dostęp do dezaktywowanego komponentu.

Wskazówka: Domyślnie, komponenty aplikacji tworzone są na żądanie. Oznacza to, że komponent aplikacji nie zostanie tak długo utworzony, dopóki nie będzie żądania dostępu do niego ze strony użytkownika. W rezultacie, ogólna wydajność nie będzie zmniejszona nawet jeśli aplikacja posiada skonfigurowanych wiele komponentów. Część komponentów aplikacji (np. CLogRouter) musi być utworzona bez względu na to czy żądanie dostępu do nich wystąpiło, czy też nie. Aby to umożliwić, należy wypisać ich numery ID we właściwości preload aplikacji.

4. Rdzenne komponenty aplikacji (ang. Core Application Components)

Yii predefiniuje zestaw podstawowych komponentów aplikacji aby dostarczyć funkcjonalność wspólną dla prawie wszystkich aplikacji webowych. Na przykład, komponent request jest używany do rozszyfrowywania żądań użytkownika oraz dostarczania informacji takich jak adres URL, ciasteczka. Poprzez konfigurowanie właściwości tych podstawowych komponentów, możemy zmienić domyślne zachowanie Yii prawie w każdym jego aspekcie.

Poniżej znajduje się lista tych rdzennych komponentów, które są predeklarowane przez CWebApplication.

5. Cykl życia aplikacji

Podczas przetwarzania żądania użytkownika aplikacja podlega następującemu cyklowi życia:

  1. Inicjalizacja początkowa aplikacji za pomocą CApplication::preinit();

  2. Utworzenie klasy autoloader oraz klasy zarządzania błędami;

  3. Zarejestronwanie rdzennych komponentów aplikacji;

  4. Wczytanie konfiguracji aplikacji;

  5. Zainicjalizowanie aplikacji przy użyciu metody CApplication::init()

    • rejestruje zachowania aplikacji;
      • załadowanie statycznych komponentów aplikacji;
  6. Zgłoszenie zdarzenia onBeginRequest;

  7. Przetwarzanie żądania użytkownika:

    • Rozszyfrowanie żądania użytkownika;
    • utworzenie kontrolera;
    • uruchomienie kontrolera;

    7.Zgłoszenie zdarzenia onEndRequest;