Podręcznik użytkownika CodeIgniter wersja 2.2.1


Kontrolery

Kontroler to część aplikacji odpowiedzialna za obsługę żądania HTTP.

Czym jest kontroler?

Kontroler to plik z klasą PHP, która nazwana jest tak aby mogła być połączona z danym adresem URI.

Sprawdź ten przykład:

example.com/index.php/blog/

W tym przykładzie CodeIgniter spróbuje znaleźć kontroler o nazwie blog.php i załadować go.

Kiedy kontroler dopasuje nazwę z pierwszego segmentu zostanie ona załadowana.

Sprawdźmy jak działa:  Hello World!

Utworzymy prosty kontroler i sprawdzimy jak działa. Korzystając z edytora utwórz plik o nazwie blog.php, i dodaj do niego kod:

Zapisz plik w katalogu application/controllers/.

Teraz załaduj stronę korzystając z odnośnika w postaci:

example.com/index.php/blog/

Jeżeli zrobiłeś to poprawnie, powinieneś otrzymać stronę z Hello World!.

Uwaga: Nazwa klasy musi zaczynać się z wielkiej litery. Przykładowo to jest poprawne:

<?php
class Blog extends CI_Controller {

}
?>

A to nie jest poprawne:

<?php
class blog extends CI_Controller {

}
?>

Oraz - zawsze upewnij się, że kontroler rozszerza klasę nadrzędną i dziedziczy wszystkie funkcje z rodzica.

Funkcje

W powyższym przykładzie nazwa funkcji, to index(). Funkcja "index" jest zawsze ładowana domyślnie, jeśli drugi segment ciągu URI jest pusty. Innymi słowy, kolejnym sposobem aby zobaczyć wiadomość "Hello World", będzie wpisanie adresu:

example.com/index.php/blog/index/

Drugi segment URI decyduje o tym, która funkcja kontrolera zostanie wywołana.

Wypróbujmy to. Dodaj nową funkcję do kontrolera:

Teraz wywołaj poniższy adres URL, aby zobaczyć działanie funkcji comments:

example.com/index.php/blog/comments/

Powinieneś zobaczyć nową wiadomość.

Przekazywanie segmentów URI do funkcji

Jeśli ciąg URI posiada więcej niż dwa segmenty, zostaną one przekazane do funkcji, jako parametry.

Dla przykładu powiedzmy, że mamy taki URI:

example.com/index.php/products/shoes/sandals/123

Funkcja przekaże segment 3 i 4 ("sandals" i "123"):

<?php
class Products extends CI_Controller {

    public function shoes($sandals, $id)
    {
        echo $sandals;
        echo $id;
    }
}
?>

Ważne:  Jeśli korzystasz z funkcji Routingu, to segmentami przypisanymi do funkcji będą te, które otrzymamy w wyniku działania funkcji routingu.

Definiowanie domyślnego kontrolera

W CodeIgniterze można określić domyślny kontroler, który będzie wywołany kiedy ciąg URI będzie pusty - np. w przypadku wywołania głównego adresu strony. Aby zdefiniować domyślny kontroler, otwórz plik application/config/routes.php i ustaw zmienną:

$route['default_controller'] = 'Blog';

Gdzie Blog jest nazwą klasy kontrolera, którego chcesz użyć. Teraz, jeśli wywołasz główny plik index.php bez określania żadnego segmentu URI, domyślnie zobaczysz wiadomość Hello World.

Zmiana wywołań funkcji

Jak wspomniano wyżej, to drugi segment adresu URI zazwyczaj określa, która funkcja kontrolera zostanie wywołana. CodeIgniter pozwala na przesłonienie tego zachowania, poprzez użycie funkcji _remap():

public function _remap()
{
    // Jakiś kod...
}

Ważne:  Jeśli Twój kontroler posiada funkcję o nazwie _remap(), będzie ona wywoływana zawsze, niezależnie ciągu URI dla tego kontrolera. Funkcja ta przesłania normalne zachowanie, w którym to URI decyduje o tym, która funkcja zostanie wywołana. Dzięki temu można samodzielnie określić zasady routingu dla funkcji w kontrolerze.

Przesłonione wywołanie funcji (zazwyczaj drugi segment adresu URI), będzie przekazane jako parametr do funkcji _remap():

public function _remap($method)
{
    if ($method == 'some_method')
    {
        $this->$method();
    }
    else
    {
        $this->default_method();
    }
}

Każdy dodatkowy segment po nazwie metody, jest przekazywany do funkcji _remap(), jako dodatkowy drugi parametr. Ta tablica może być użyta w połączeniu z funkcją PHP call_user_func_array, aby emulować domyślne zachowanie CodeIgnitera.

public function _remap($method, $params = array())
{
    $method = 'process_'.$method;
    if (method_exists($this, $method))
    {
        return call_user_func_array(array($this, $method), $params);
    }
    show_404();
}

Kontrolowanie danych wyjściowych

CodeIgniter ma klasę wyjścia, która zajmuje się automatycznie wysyłaniem przetworzonych danych do przeglądarki. Więcej informacji na ten temat, można znaleźć na stronach o Widokach oraz klasie Output. W niektórych przypadkach, możesz jednak chcieć przetworzyć dane końcowe i samodzielnie wysłać je do przeglądarki. CodeIgniter pozwala na dodanie do kontrolera funkcji _output(), która będzie otrzymywać końcowe dane wyjściowe.

Ważne:  Jeśli Twój kontroler posiada funkcję o nazwie _output(), będzie ona zawsze wywoływana przez klasę wyjścia, zamiast zwracać bezpośrednio dane końcowe. Pierwszy parametr funkcji będzie zawierał końcowe dane wyjściowe.

Tutaj mamy przykład:

public function _output($output)
{
    echo $output;
}

Proszę zauważyć, że funkcja _output() będzie otrzymywać dane zawsze w ich finalnym stanie. Benchmarki i dane o zużyciu pamięci będą wyrenderowane, pliki cache zapisane (jeśli cacheowanie było włączone), a nagłówki zostaną wysłane (jeśli używasz tej funkcjonalności), zanim zostaną przekazane do funkcji _output().

Aby Twoje kontrolery wykonywały operacje cacheowania prawidłowo, metoda _output(), może użyć:
if ($this->output->cache_expiration > 0)
{
    $this->output->_write_cache($output);
}
Jeśli używasz tej metody, czas ładowania strony oraz zużycie pamięci, mogą nie do końca odpowiadać rzeczywistości, ponieważ nie zostają one uaktualnione podczas przetwarzania, które wykonujesz dodatkowo samodzielnie. Jako alternatywną drogę do kontrolowania wyjścia przed tym jak jakiekolwiek końcowe przetwarzanie ma miejsce, proszę zapoznać się z metodami dostępnymi w klasie Output.

Funkcje prywatne

W niektórych przypadkach możesz chcieć ukryć konkretne funkcje, przed dostępem z zewnątrz. Aby utworzyć funkcję prywatną, po prostu dodaj podkreślenie jako prefix nazwy, co sprawi, że funkcja ta nie będzie dostępna poprzez żądanie URL. Dla przykładu, spójrz na tę funkcję:

private function _utility()
{
  // jakiś kod
}

Próba jej wywołania za pomocą adresu URL jak ten poniżej, zakończy się niepowodzeniem:

example.com/index.php/blog/_utility/

Organizowanie kontrolerów w podkatalogach

Jeśli budujesz dużą aplikację, umieszczanie kontrolerów w podkatalogach, może zostać uznane za wygodne rozwiązanie. CodeIgniter pozwala na to.

Po prostu utwórz folder w katalogu application/controllers i umieść w nim kontrolery.

Uwaga:  Kiedy korzystamy z tej opcji, pierwszy segment adresu URI musi określać podkatalog. Dla przykładu załóżmy, że mamy kontroler zlokalizowany tutaj:

application/controllers/products/shoes.php

Żeby wywołać powyższy kontroler, Twój adres URI musi wyglądać w ten sposób:

example.com/index.php/products/shoes/show/123

Każdy podkatalog może zawierać domyślny kontroler, który zostanie wywołany, kiedy adres URL zawierać będzie jedynie nazwę podkatalogu. W tym celu wystarczy dodać regułę w pliku application/config/routes.php, która będzie kierowała do domyślnego kontrolera, kiedy wybrany będzie tylko podkatalog.

CodeIgniter pozwala również na zmianę adresów URI za pomocą Routingu.

Konstruktory klas

Jeśli mamy zamiar korzystać z konstruktorów w naszym kontrolerze, MUSIMY dodać do niego następującą linię kodu:

parent::__construct();

Powodem, dla którego ta linia jest niezbędna jest to, że Twój lokalny konstruktor będzie nadpisywał ten z klasy rodzica, dlatego musimy wywołać go ręcznie.

<?php
class Blog extends CI_Controller {

       public function __construct()
       {
            parent::__construct();
            // Twój własny kod konstruktora
       }
}
?>

Konstruktory są użyteczne, jeśli potrzebujemy ustawić jakieś domyślne wartości lub uruchomić jakąś domyślną funkcjonalność, kiedy tworzona jest instancja klasy. Konstruktory nie mogą zwracać wartości, ale mogą wykonywać domyślne operacje.

Zarezerowoane nazwy funkcji

Z racji tego, że nasze klasy rozszerzają główny kontroler aplikacji, należy być ostrożnym, aby nie nazywać własnych funkcji identycznie jak te, które już istnieją w głównym kontrolerze. W innym razie nasze lokalne funkcje będą je nadpisywać. Sprawdź pełną listę zarezerwowanych nazw.

To tyle!

To w sumie wszystko, co powinniśmy wiedzieć o kontrolerach.