Kohana 3 Cheat Sheet

Kohana3

Specjalnie dla czytelników bloga przygotowałem CheatSheet oparty o moduł CS z najczęściej używanymi funkcjami w Kohana 3. Są na nim wyróżnione metody statyczne i prywatne oraz przejrzysty podział na właściwości i metody klas.

Bonusem jest interaktywna wersja HTML. Klikając na odpowiednią metodę czy właściwość ujrzymy jej (domyślne) argumenty oraz opis zawarty w dokumentacji Kohana. Do pobrania są trzy wersje:

Wesołych mikołajek :-)

Nowe, polskie forum dla Kohana 3 i 2

Wyraź się :-)

Kohana to ciągle rozwijający się framework. Rodzi się dużo pytań z nim związanych, a czasami trudno szukać odpowiedzi. Wychodząc na przeciw nasz blog zyskał forum dostępne pod adresem http://kohana.sher.pl/forum/. Zapraszamy do rejestracji, dyskusji, dzielenia się swoimi modułami, poradnikami oraz zadawania pytań. Będziemy starali się na nie treściwie odpowiadać.

@edit Nie wiedziałem o istniejącym oficjalnym forum, więc od teraz odnośnik będzie prowadził właśnie tam.

Jak stworzyć i używać kontroler. Kohana 3.

Kontroler to podstawowa klasa, ważna w wykonywaniu zapytania na Kohanie. Najprostsza aplikacja w składa się właśnie z systemu i jednego kontrolera. Jego zadaniem jest wymiana informacji między bazą danych (z użyciem modeli) a użytkownikiem (z użyciem formularzy z widoków). To on wykonuje najważniejsze obliczenia i decyduje co pokazać oglądającym stronę.

Konwencje

Zasady nazywania i dziedziczenia kontrolerów zostały już opisane w poprzednim artykule. Poza tym musimy pamiętać, że:

  1. Dla użytkownika będą dostępne tylko metody publiczne, których nazwa zaczyna się na ‘action_’
  2. To co ma się ukazać użytkownikowi musi być przypisane do zmiennej $this->request->response

Wywoływanie

Kontroler może być wywoływany przez wpisanie w pasku adresu

http://sher.pl/index.php/<kontroler>/<akcja>

Przykładowo dla kontrolera home i akcji login adres URL będzie miał postać:

http://sher.pl/index.php/home/login

Ponadto przy zastosowaniu porady dotyczącej krótkich adresów adres może wyglądać tak:

http://sher.pl/home/login

Domyślnie wywoływany kontroler i akcja (czyli np. pod http://sher.pl) może być ustawiona w pliku bootstrap.php:

Route::set('default', '(<controller>(/<action>(/<id>)))')
	->defaults(array(
		'controller' => 'home',
		'action'     => 'login',
	));

Tworzenie prostego kontrolera

Kontrolery naszej aplikacji powinny być umieszczone w katalogu application/classes/controller, a jeśli tworzymy model w katalogu modules/nasz-modul/classes/controller. Jeśli będzie umieszczony w innym katalogu, nie będzie dostępny dla użytkownika.

Po zapoznaniu się z powyższymi zasadami zrozumienie najprostszego kontrolera welcome nie powinno przysparzać kłopotów:

<?php defined('SYSPATH') or die('No direct script access.');

class Controller_Welcome extends Controller {
	public function action_index()
	{
		$this->request->response = 'hello, world!';
	}
}

Zmiana domyślnego rutowania

Jeśli chcemy aby przypisywanie kontrolerów i akcji adresom URL odbywało się w sposób inny niż domyślny powinniśmy to określić w pliku application/bootstrap.php lub modules/nasz-modul/init.php przy użyciu metody Route::set(). Co ważne domyślny route powinien być definiowany na samym końcu. Dlaczego? Wszystkie routy ustawione za pomocą funkcji Rouse::set będą dopasowywane do adresu URL w kolejności definiowania. Jak wiadomo domyślny powinien być wywoływany na samym końcu. Poniżej przykład przekierowywania wszystkich zapytań do kontrolera main:

Route::set('products', '(<action>(/<id>)))')
  ->defaults(array(
	  'controller' => 'main',
	  'action' => 'index',
  ));

Od tej chwili po wpisaniu http://sher.pl/register będzie wywoływana metoda register kontrolera main. Więcej wpisów dotyczących routingu znajdziemy na niniejszym blogu pod tagiem rutowanie.

Funkcja Kohana::init oraz jej możliwe argumenty

Tytułowa funkcja jest bardzo ważna. Inicjalizuje ona wszystkie opcje, oczyszcza zmienne globalne jak $_GET i $_POST i konfiguruje całe środowisko. Jest ona umieszczona w pliku bootstrap.php. Jedynym jej argumentem jest tablica kluczy i wartości wypisanych poniżej:

  1. base_url – katalog w którym umieszczona jest aplikacja – domyślnie NULL
  2. index_file – plik indeksu lub FALSE dla krótkich adresów – domyślnie index.php
  3. charset - rodzaj kodowania z znaków – domyślnie utf-8
  4. cache_dir – katalog użyty do cachowania zapytań – domyślnie APPPATH/cache
  5. errors - czy ma zostać włączona obsługa błędów – domyślnie TRUE
  6. profile - czy ma zostać włączone profilowanie (monitorowanie wykonywania funkcji) – domyślnie TRUE
  7. caching - czy ma zostać włączone cachowanie – domyślnie FALSE

Dzięki pewnej sztuczce możemy utrzymywać odpowiednią konfigurację w środowisku deweloperskim (na lokalnym serwerze) i produkcyjnym (dostępnym dla wszystkich użytkowników). W tym celu zdefiniujmy na początku pliku bootstrap stałą IN_PRODUCTION

define('IN_PRODUCTION', $_SERVER['SERVER_NAME'] !== 'localhost');

Jak widzimy będzie ona ustawiona na TRUE, gdy aplikacja będzie aplikacji będzie wykonywana na serwerze innym niż localhost.

Teraz możemy skonfigurować Kohanę w pożądany przez nas sposób:

Kohana::init(array(
	'base_url'   => IN_PRODUCTION ? '/' : '/test/',
	'index_file' => FALSE,
	'profiling'  => ! IN_PRODUCTION,
	'caching'    => IN_PRODUCTION
));

W powyższym przypadku dla użytkowników zostanie włączone cachowanie, wyłączone profilowanie, a głównym katalogiem aplikacji na lokalnym serwerze będzie /test/

Usuwanie index.php w Kohanie 3

Celem jest stworzenie możliwości używania krótkich adresów URL w Kohanie. Przykładowo aby dostać się do kontolera home ma domyślnie musimy pisać http://sher.pl/index.php/home. Po wykonaniu poniższych dwóch kroków będzie to krótkie http://sher.pl/home

  1. Zmodyfikowanie pliku bootstrap.php, wyszukajmy linię z Kohana::init i dodanie opcji base_url index_file. Pierwsza oznacza katalog w którym jest aplikacja (ze slashami po bokach). Druga to plik indeksu lub w naszym przypadku pusty ciąg znaków:
    Kohana::init(array(
      'base_url' => '/app/',
      'index_file' => '',
    ));

  2. Zmiana nazwy pliku example.htaccess na .htaccess i podmiana w nim katalogu głównego z domyślnego
    RewriteBase /kohana/
    na faktyczny (w naszym przypadku to app):
    RewriteBase /app/

Problemy

Czasami zdarza się, że serwer odpowiada błędami  ”Interval Server Error”  czy “No input File Specified”. Można wtedy spróbować podmienić kilka linijek w pliku .htaccess:
RewriteRule ^(?:application|modules|system)\b - [F,L]
na
RewriteRule ^(application|modules|system)/ - [F,L]
oraz
RewriteRule .* index.php/$0 [PT]
na
RewriteRule .* index.php [L]

Hello world w Kohanie 3.0

Poniżej przedstawiony jest sposób stworzenia najprostszego projektu w Kohanie.

Stwórzmy najpierw kontroler, który będzie wyświetlał napis “Hello world”. Później dostosujemy go do zasad modelu MVC.

W folderze application/classes/controller stwórzmy plik hello.php i wypełnijmy go następującym tekstem:

Class Controller_Hello extends Controller
{
	function action_index()
	{
		echo 'hello, world! ';
	}

	function before()
	{
		echo 'Uruchamiam kontroler. '
	}

	function after()
	{
		echo 'Wyłączam kontroler. '
	}
}

Żeby sprawdzić czy powstały kontroler działa wejdźmy w adres http://nasza-strona.pl/index.php/hello

Wyjaśnijmy po kolei cały powyższy kod:

<?php defined('SYSPATH') OR die('No Direct Script Access');

Ta linijka zabezpiecza plik przed bezpośrednim otworzeniem. Jedynie Kohana będzie miała do niego dostęp.

Class Controller_Hello extends Controller

Tu tworzymy instancję klasy Controller_Hello. Jej nazwa jest uzależniona od lokalizacji w jakiej znajduje się plik z nią. Przypomnijmy, że jest to application/classes/controller/hello.php, a więc na nazwę klasy zamieniamy wszystko w górę od katalogu classes. Przyjrzyjmy się innym przykładom:

  1. controller/user.php  => Controller_User
  2. controller/user/login.php => Controller_User_Login
  3. model/options.php => Model_Options
  4. foo/bar/my/script.php => Foo_Bar_My_Script
function action_index()

Aby dana metoda była dostępna dla ludzi korzystających z naszego serwisu muszą być spełnione dwa warunki:

  1. Metoda musi być umieszczona w klasie, której nazwa zaczyna się od Controller. Implikuje to położenie pliku z klasą w folderze application/classes/controller
  2. Nazwa metody musi zaczynać się od ‘action_’. Wszelkie inne nazwy metod spowodują, że będą one traktowane jako prywatne i nie będą dostępne przez wpisanie odpowiedniego adresu URL.

Ponadto metoda o nazwie action_index wywoływana jest jako domyślna dla bieżącego kontrolera. A więc powyższa zostanie wywołana przez wpisanie w pasku URL http://nasza-strona.pl/hello/

Jeśli stworzylibyśmy metodę o nazwie powiedzmy action_user to wtedy wywołalibyśmy ją wpisując http://nasza-strona.pl/hello/user/

Można stworzyć też jak w powyższym przykładzie dwie metody o specjalnych nazwach before i after. Pierwsza z nich będzie wykonywana zaraz przed wywołaniem głównej akcji, a druga zaraz po niej.

Zastosujmy jednak model MVC

Kohana domyślnie dostarcza pomocniczy kontroler o nazwie Controller_Template – renderuje on naszą stronę korzystając z jednego z widoków. Pisząc poniższy przykład pominąłem już metody before i after:

<?php defined('SYSPATH') OR die('No Direct Script Access');

Class Controller_Hello extends Controller_Template
{
	public $template = 'site';

	function action_index()
	{
		$this->template->message = 'hello, world!';
	}
}

Dzięki extends Controller_Template sprawiliśmy, że nasz kontroler będzie dziedziczył z tej klasy. Natomiast pisząc public $template = ’site’; powiedzieliśmy, że strona ma być renderowana wykorzystując widok site.

Możemy edytować zmienne jakie użyjemy w widoku zmieniając właściwości klasy template. Przykładowo pisząc jak w powyższym przykładzie $this->template->message = ‘hello, world!’; Przypisaliśmy do zmiennej $message wartość hello world!. Możemy ją użyć w widoku, który stworzymy.

Widoki umieszczamy w folderze application/views/. Przykładowo potrzebny do powyższego przykładu widok site będzie umieszczony w pliku application/views/site.php i miał następującą treść:

<html>
	<head>
		<title>Mam dla Ciebie wiadomość!</title>
		<style type="text/css">
			body {font-family: Georgia;}
			h1 {font-style: italic;}
		</style>
	</head>
	<body>
		<h1><?php echo $message; ?></h1>
		<p>I to by było na tyle :)</p>
	</body>
</html>

Jak widzimy zawartość zmiennej message ustawionej w kontrolerze możemy wydrukować pisząc po prostu <?php echo $message; ?>

Konfiguracja bazy danych w Kohanie 3

Pierwszym krokiem do ustalenia połączenia z bazą danych jest odpowiednia konfiguracja. W tym celu tworzymy plik database.php w katalogu konfiguracji application/config. Jego zawartość powinna mieć następującą formę:

<?php defined('SYSPATH') OR die('No direct access allowed.');

return array
(
 'default' => array
 (
   'type'       => 'mysql',
   'connection' => array(
     'hostname'   => 'localhost',
     'username'   => FALSE,
     'password'   => FALSE,
     'persistent' => FALSE,
     'database'   => 'kohana',
   ),
   'table_prefix' => '',
   'charset'      => 'utf8',
   'caching'      => FALSE,
   'profiling'    => TRUE,
 ),
   'alternate' => array(
   'type'       => 'pdo',
   'connection' => array(
     'dsn'        => 'mysql:host=localhost;dbname=kohana',
     'username'   => 'root',
     'password'   => 'r00tdb',
     'persistent' => FALSE,
   ),
   'table_prefix' => '',
   'charset'      => 'utf8',
   'caching'      => FALSE,
   'profiling'    => TRUE,
 ),
);

Jak widzimy wszelkie wartości wpisujemy w odpowiednio skonstruowanej podtablicy ‘default’ – jest to domyślna nazwa dla połączenia z bazą danych w Kohanie. Oczywiście możemy dodać kolejne tablice, których nazwy będziemy później wykorzystywać do łączenia z różnymi bazami w ramach jednej aplikacji.

Pole type może mieć dwie wartości: mysql lub pdo w zależności z jakiego typu bazy danych korzystamy.

Jeśli wybierzemy mysql pole connection musimy uzupełnić odpowiednimi wartościami – hostname, username, password, database i persistent, z których wytłumaczenia potrzebuje tylko ostatnia – jeśli ustawiona jest na true połączenie z bazą danych nie będzie zrywane na całej długości działania aplikacji.

W przypadku wybrania pdo do uzupełnienia mamy głównie dsn, username, password i persistent. Pierwsza z nich określa szczegóły naszego połączenia. W ten sposób możemy się połączyć z dowolnym rodzajem bazy danych obsługiwanym przez PDO (MySQL, PostgreSQL, Oracle czy SQLite).

Przykładowo:

  • ‘dsn’ => ‘mysql:host=localhost;dbname=NAZWA_BAZY’,
  • ‘dsn’ => ’sqlite:/ścieżka/baza.db’,
  • ‘dsn’ => ‘pgsql:host=localhost port=5432 dbname=NAZWA_BAZY user=LOGIN password=HASŁO’,

Pola username password używane są w razie połączenia z bazą MySQL.

Pozostają jeszcze takie pola jak

  • table_prefix – znany wszystkim przedrostek do nazw tabeli,
  • charset – domyślne kodowane bazy danych – zalecane utf8,
  • caching - oczywiście, czy pobierane dane mają być cachowane
  • profiling - czy obliczane mają być czasy wykonywania zapytań, mierzona ich wydajność. Opcja przydatna dla deweloperów.