Kohana – wprowadzenie
W swojej wieloletniej pracy przygotowałem już kilkanaście stron internetowych w oparciu o framework Kohana. Ten czas utwierdził mnie w przekonaniu, że to bardzo fajny szkielet programistyczny, z którym dobrze mi się pracuje. Kohana jest bardzo lekka, szybka, prosta w zrozumieniu oraz rozbudowie. Rozwiązuje dziesiątki problemów, przed którymi musiałby stanąć programista tworząc witrynę w oparciu o wyłącznie własny kod. W pewnej mierze narzuca sposób tworzenia aplikacji, ale w ten pozytywny, ustandaryzowany sposób.
Jak każde oprogramowanie Kohana również posiada swoje skazy: ciągłe zmiany w API pomiędzy wydaniami, drobne błędy, czy też miejscami uboga dokumentacja mogą utrudnić pracę. Jestem jednak przekonany, że jeśli dopiero zaczynasz swoją przygodę z tworzeniem stron www, czy też dotychczas nie korzystałeś z frameworków www, Kohana będzie dla Ciebie doskonałym wyborem.
Instalacja
To właściwie kilka kroków, które nie powinny sprawić najmniejszych problemów osobie, która już w przeszłości instalowała aplikacje www na własnym serwerze. Jeśli masz już wykupiony hosting i bezpośrednio na nim chcesz rozwijać aplikację nie musisz się właściwie niczym przejmować. Taki serwer posiada zapewne zainstalowane oraz włączone wszystkie moduły, które będą wykorzystywane przez Kohane.
Ja osobiście w codziennej pracy wolę korzystać z serwera lokalnego instalowanego za pośrednictwem kompleksowej paczki LAMPP (XAMPP for Linux). To wygodne. W skład jednego archiwum wchodzą wszystkie niezbędne usługi, serwery i to już wstępnie skonfigurowane. Zmiany w projekcie podglądam na bieżąco i nie muszę ich w żaden sposób udostępniać na zdalnym serwerze. Jeśli posiadasz już serwer etap 1 możesz pominąć.
Etap 1 – instalacja niezbędnych usług (przykład dotyczy Linuksa-Ubuntu; XAMPP jest również dostępny na Windowsa oraz Mac OS X):
- Pobierz paczkę zawierającą archiwum LAMPP.
- Uruchom terminal i przejdź do katalogu, do którego pobrano archiwum. (np. cd Pobrane/).
-
Rozpakuj archiwum poleceniem: sudo tar xvfz xampp-linux-1.8.1.tar.gz -C /opt/
Po ukończeniu polecenia LAMPP powinien być już dostępny oraz gotowy do użycia w Twoim systemie.
-
Serwerem możesz zarządzać z poziomu terminala. Po przejściu do jego katalogu (/opt/lampp):
sudo ./lampp start (uruchomia serwer);
sudo ./lampp restart (uruchomia ponownie serwer);
sudo ./lampp stop (wyłącza serwer);
sudo ./lampp security (umożliwia zarządzanie hasłami dostępu do serwera);
-
Kohana wymaga od naszego serwera dostępu do modułu rewrite. Za jego pomocą możliwe jest wprowadzenie w witrynie tak zwanych przyjaznych linków. Moduł ten jest standardowo wczytywany. Do jego pożądanej pracy dokonamy dodatkowej konfiguracji. Otwórz do edycji plik httpd.conf (/opt/lampp/etc) z prawami roota.
Zastąp frazę „AllowOverride none” na „AllowOverride All”. Uruchom ponownie serwer.
Etap 2 – instalacja Kohany
- Pobierz paczkę zawierającą Framework Kohana.
- Rozpakuj zawartość archiwum do katalogu www serwera apache (jeśli realizowałeś etap 1 będzie to /opt/lampp/htdocs – potrzebujesz tutaj uprawnień roota chyba, że zmienisz prawa dostępu do tego katalogu, np. sudo chmod 777 -R htdocs/).
- W przypadku serwera lokalnego zapewne będziesz chciał skojarzyć swoją aplikację z konkretnym adresem. Po prostu zmień nazwę katalogu ze skryptem, na pożądaną przez Ciebie. Przykładowo jeśli moja aplikacja zostanie zapisana w folderze „marcin” w katalogu www apache, będę miał do niej dostęp z adresu: http://localhost/marcin
- Na Linuksie (w obrębie aplikacji) zapewnij uprawnienia zapisu do katalogów application/logs oraz application/cache. Jeśli któryś z tych folderów nie jest dostępny, utwórz go. Możesz zmienić uprawnienia również dla całego katalogu aplikacji: sudo chmod 777 -R marcin/
- Zmień nazwę pliku „example.htaccess” na „.htaccess”.
- Jeśli instalujesz Kohane w podkatalogu powinieneś jego nazwę podać w pliku .htaccess (RewriteBase /nazwa_folderu) oraz application/bootstrap.php (zmienna base_url).
- Odwiedź w przeglądarce internetowej swoją aplikację. Jeśli Twoja konfiguracja serwera spełnia stawiane przed nim wymagania możesz usunąć plik install.php.
- Odśwież stronę. Twoim oczom powinno ukazać się hasło: hello, world!
HMVC
Nowe wersje Kohany opierają się o wzorzec projektowy HMVC. Moim zdaniem jest to jedna z korzystniejszych decyzji projektowych tego frameworka, która sprawia, że budowanie złożonych aplikacji jest jeszcze wygodniejsze oraz bardziej ustandaryzowane.
Dla przypomnienia: wzorzec MVC (Model-View-Controller) wprowadza podział aplikacji na trzy części:
- model – może ułatwiać zarządzanie danymi (np. model użytkownika umożliwiający ich wczytywanie, usuwanie, edycję, przygotowywanie zestawień informacji), ale i reprezentować dowolny problem logiczny aplikacji. W obrębie pojedynczej aplikacji często jest przygotowywanych wiele modeli.
- view – widok odpowiada za to co widzi użytkownik – prezentację określonych danych. W obrębie pojedynczej aplikacji często jest wykorzystywanych wiele widoków jednocześnie. Każdy z nich może reprezentować inny element. W przypadku aplikacji internetowej jeden widok może odpowiadać za ogólny szablon witryny z nagłówkiem, stopką oraz wydzieloną częścią pod właściwą treść. W obrębie tego widoku mogą być zagnieżdżane kolejne np. z prezentacją określonych podstron czy też elementów interfejsu.
- controller – kontroler odpowiada za zarządzanie aplikacją. Przyjmuje dane wejściowe od użytkownika i na ich podstawie obsługuje modele oraz widoki. W aplikacji może istnieć wiele kontrolerów, ale tylko jeden z nich w danym czasie steruje aplikacją. Istnieje możliwość aby aktualny kontroler przekazał sterowanie innemu.
W większości przypadków wzorzec MVC będzie dla Ciebie wystarczający. To na nim na początku powinieneś się skupić. Jeśli posiadasz już jednak doświadczenie z MVC, a realizowany przez Ciebie projekt wymaga wysoce modularnej budowy zainteresuj się dobrodziejstwami oferowanymi przez architekturę HMVC.
Architektura HMVC (Hierarchical model–view–controller) stanowi ewolucję wzorca projektowego MVC. To czy będziesz z niej korzystać zależy wyłącznie od Ciebie. Zaimplementowany w Kohanie router kieruje Twoje zapytanie, do określonego kontrolera, który zazwyczaj zwraca jakieś wyjście. Dzięki rozszerzeniu HMVC możliwe jest tworzenie kolejnych zapytań i tym samym realizowanie zadań, czy też przetwarzanie danych pochodzących z innych kontrolerów. Tego typu zapytanie możesz utworzyć za pomocą klasy Request. Przykładowe użycie:
-
wywołanie wewnętrznego zapytania do określonego kontrolera oraz akcji:
$internal_request = Request::factory(‚kontroler/akcja/argument’)->execute();
-
wywołanie zewnętrznego zapytania do określonej witryny:
$external_request = Request::factory(‚http://baszczewski.pl/’)->execute();
Korzystając z HMVC masz oczywiście dużo większe możliwości tworząc kolejne zapytania. Szczegóły znajdziesz w dokumentacji.
Struktura katalogów
Do efektywnej pracy z Kohaną koniecznie musisz zapoznać się ze strukturą katalogów frameworka. Zajmie to tylko chwilkę, a pozwoli Ci zrozumieć wiele kluczowych zagadnień:
- application – tutaj przechowywane są pliki związane z Twoją aplikacją. Najważniejszym plikiem w obrębie tego katalogu jest bootstrap.php odpowiadający za przygotowanie oraz inicjalizację Twojej aplikacji.
- modules – w tym folderze przechowywane są dostępne moduły, rozszerzające funkcjonalność frameworka. Moduły mogą być włączane oraz wyłączane poprzez modyfikację funkcji Kohana::modules dostępnej w pliku bootstrap.php. Kolejność inicjalizacji modułów ma znaczenie.
- system – w obrębie tego katalogu są przechowywane najważniejsze klasy frameworka stanowiące jego trzon-podstawę.
- vendor – często opcjonalny katalog, w obrębie którego przechowywane są dodatkowe biblioteki nie wchodzące w skład Kohany.
Jeśli Ci zależy na zmianie domyślnych ścieżek (application, system oraz modules) masz taką możliwość. Zainteresuj się modyfikacją pliku init.php.
Kohana wykorzystuje tak zwany auto loader. Aby skorzystać z jakiejś klasy w obrębie aplikacji nie musisz wcześniej wczytywać pliku, w którym ta jest zadeklarowana (nie dotyczy opcjonalnych bibliotek przechowywanych w katalogu vendor). Takie rozwiązanie ma wiele zalet. Możesz oczekiwać większej wydajności jako, że wczytywane są wyłącznie faktycznie używane klasy. Samo skorzystanie z jakiejś klasy jest natomiast uproszczone do granic możliwości.
Przykłady:
- Chcesz przygotować pomocniczą klasę o nazwie Helper? Powinieneś ją zapisać w katalogu application/classes/ jako Helper.php. Ważna uwaga: wielkość znaków przy nazwie pliku czy też klasy ma znaczenie i powinieneś się trzymać wspólnej konwencji. Instancję tej klasy możesz później utworzyć w dowolnym miejscu np. za pomocą kodu new Helper.
- Możesz przygotować również własną hierarchię katalogów w obrębie folderu application/classes. Przykładowo klasa zapisana jako application/classes/Helper/MyTools.php powinna mieć nazwę Helper_MyTools (zwróć uwagę na nazwę folderu oraz znak podkreślenia).
Najważniejsze o czym teraz powinieneś wiedzieć to, że auto loader korzysta z metody wyszukującej pliki (Kohana::find_file), w której hierarchia katalogów i kolejność przeszukiwania mają znaczenie. Przykładowo jeśli klasa w Twojej aplikacji dziedziczy po MyClass, ta jest w pierwszej kolejności poszukiwana w katalogu aplikacji, a kolejno modułów oraz systemu. To jest: jeśli plik z klasą MyClass jest dostępny zarówno w katalogu application jak i modules, zostanie użyta wersja znajdująca się w pierwszym z wyżej wymienionych katalogów. Ta zależność jest wykorzystana przez Kohanę w fenomenalny sposób. Większość klas (w system oraz modules), z których będziesz korzystać posiadają swoją pełną deklarację w obrębie innego podkatalogu oraz pliku. Przykład:
-
Deklaracja klasy Config (system/classes/Config.php) wygląda następująco:
class Config extends Kohana_Config {}
- Jak zapewne się domyślasz pełna deklaracja jest dostępna w klasie Kohana_Config (system/classes/Kohana/Config.php).
- Dzięki temu możesz łatwo rozszerzyć czy też zmodyfikować działanie omawianej klasy. Wystarczy, że w swojej aplikacji również zadeklarujesz klasę Config (application/classes/Config.php) dziedziczącą (czy też nie) po Kohana_Config.
- Od tej pory w jakimkolwiek miejscu zostanie użyta klasa Config, zostanie wykorzystana Twoja wersja.
- W ten sposób możesz rozbudować, czy też zmienić niemalże każdy aspekt działania frameworka bez edycji jego źródeł. Ta cecha sprawia, że Kohana jest naprawdę fantastycznym oraz elastycznym rozwiązaniem.
Podstawy
Na tym etapie możemy zająć się pierwszymi zmianami w naszej przykładowej aplikacji „witaj świecie”. Dodamy do niej przykładowy kontroler, model oraz widok. Naszym celem będzie przygotowanie prostej witryny z wydzielonym nagłówkiem, nawigacją oraz stopką. Treść zostanie podzielona na dwie różne podstrony. Jak się za chwilę przekonasz to bardzo proste.
Zacznijmy od edycji już istniejącego kontrolera (Welcome.php). Znajdziesz go w katalogu application/classes/Controller/. W obrębie tego właśnie folderu będziesz tworzył swoje kontrolery. Obowiązują w nim te same zasady, o których wspominałem już przy okazji omówienia struktury katalogów.
Otwórz plik klasy Controller_Welcome oraz upewnij się, że dziedziczy po Controller_Template.
class Controller_Welcome extends Controller_Template
Controller_Template jest naprawdę bardzo, bardzo prostą klasą, której zadaniem jest wczytanie widoku oraz pokazanie go (przekazanie jako odpowiedź serwera). Klasa korzysta jednak z dwóch ciekawych metod, które są wykonywane przed realizacją akcji (before) oraz po (after). Zapoznaj się samemu z implementacją (system/classes/Kohana/Controller/Template.php):
<?php defined('SYSPATH') OR die('No direct script access.');
/**
* Abstract controller class for automatic templating.
*
* @package Kohana
* @category Controller
* @author Kohana Team
* @copyright (c) 2008-2012 Kohana Team
* @license http://kohanaframework.org/license
*/
abstract class Kohana_Controller_Template extends Controller {
/**
* @var View page template
*/
public $template = 'template';
/**
* @var boolean auto render template
**/
public $auto_render = TRUE;
/**
* Loads the template [View] object.
*/
public function before()
{
parent::before();
if ($this->auto_render === TRUE)
{
// Load the template
$this->template = View::factory($this->template);
}
}
/**
* Assigns the template [View] as the request response.
*/
public function after()
{
if ($this->auto_render === TRUE)
{
$this->response->body($this->template->render());
}
parent::after();
}
} // End Controller_Template
Jak zauważyłeś zadeklarowane są tutaj dwie dwie zmienne publiczne: $template oraz $auto_render.
Dziedzicząc po tej klasie, możesz nadać im własne domyślne wartości. Pierwsza zmienna oznacza nazwę widoku, który ma być domyślnie wczytywany przez metodę View::Factory. Przypisana wartość „template” wskazuje na widok znajdujący się w pliku: application/views/template.php.
Metoda View::Factory również korzysta z funkcji Kohana::find_file. Dzięki temu nawet domyślne widoki oferowane przez Kohanę czy też jej moduły mogą być łatwo przez nas zastąpione w obrębie aplikacji własnymi egzemplarzami. Możliwe jest również przechowywanie widoków w podkatalogach. Zwróć jednak uwagę, że te powinny być tworzone w dedykowanym temu zadaniu folderze application/views.
Druga wspomniana w tej klasie zmienna ($auto_render) warunkuje czy widok ma być załadowany oraz kolejno przekazany jako odpowiedź aplikacji ($this->response->body). Zauważ, że po wczytaniu widoku, zmiennej wcześniej oznaczającej nazwę ($template) zostanie przypisany obiekt widoku (View).
Tworząc swoje przyszłe aplikacje samemu zadecydujesz czy przygotujesz własny kontroler odpowiadający za inicjalizację widoku, czy też rozbudujesz już dostarczony z Kohaną Controller_Template. Myślę, że przykładowy kod przekonał Cię, że to nic trudnego.
Wróćmy do naszej przykładowej strony. Edytowany już przez Ciebie Controller_Welcome posiada jedną domyślną akcję (action_index). Musisz wiedzieć, że w nowych wersjach Kohany wszystkie akcje posiadają prefiks „action_”. Oczywiście nadal możesz tworzyć w obrębie kontrolera dowolne metody (publiczne czy też nie), ale zaimplementowane w Kohanie trasowanie, ze względów bezpieczeństwa będzie działało tylko dla tych z prefiksiem.
Zmodyfikujmy naszą metodę action_index:
public function action_index()
{
$this->template->set(array(
'title' => 'my homepage',
'links' => array('welcome'=> 'Welcome', 'welcome/other/123'=> 'Other'),
));
$this->template->content = 'my content';
}
W powyższym kodzie przypisaliśmy do widoku zmienne na dwa różne sposoby. W pierwszym skorzystaliśmy z metody set, która przyjmuje za parametr tablicę. W drugim natomiast po widoku od razu podaliśmy nazwę oraz wartość.
Po odświeżeniu strony zostaniesz poinformowany, że nie znaleziono pliku widoku. Dodajmy go (application/views/template.php):
<!DOCTYPE html>
<html>
<head>
<title><?php echo $title ?></title>
<base href="<?php echo URL::base() ?>" />
</head>
<body>
<header>
<h1><?php echo $title ?></h1>
<nav>
<ul>
<?php foreach($links as $url=>$name): ?>
<li><a href="<?php echo $url ?>"><?php echo $name ?></a></li>
<?php endforeach; ?>
</ul>
</nav>
</header>
<section>
<article>
<?php echo $content ?>
</article>
</section>
<footer>
test page
</footer>
</body>
</html>
Jak widać w utworzonym widoku (template.php) mieliśmy dostęp do zmiennych uprzednio przekazanych przez kontroler. Powinieneś tutaj wychwycić jeszcze jedną rzecz. Naszym językiem szablonów jest po prostu… php. Myślę, że w podstawowym wariancie to bardzo rozsądny wybór zapewniający dużą wydajność w porównaniu do dodatkowych silników szablonów. Przygotowana przez nas strona powinna się już poprawnie wyświetlać. Przekonaj się samemu.
Kliknąłeś na link zatytułowany „Other”? Zwrócony komunikat (Kohana_HTTP_Exception [ 404 ]: The requested URL welcome/other/123 was not found on this server) oznacza, że nie znaleziono określonej podstrony. W naszym przypadku przyczyna jest prosta. Domyślne trasowanie (kontroler/akcja/opcjonalne id) odnosi się do kontrolera Welcome, który nie posiada jednak akcji other. Dokonajmy zatem w naszym kontrolerze kilku modyfikacji:
- teraz zmienne title, oraz links będą przypisywane przez osobną metodę, która poprzedza każdą z realizowanych akcji;
- dodamy akcję other, która będzie dodatkowo przyjmować i reagować na ostatni parametr linka;
Zaktualizowany kod kontrolera Welcome:
<?php defined('SYSPATH') or die('No direct script access.');
class Controller_Welcome extends Controller_Template {
public function before()
{
parent::before();
if ($this->template)
{
$this->template->set(array(
'title' => 'my homepage',
'links' => array('welcome'=> 'Welcome', 'welcome/other/123'=> 'Other'),
));
}
}
public function action_index()
{
$this->template->content = 'my content';
}
public function action_other()
{
$id = $this->request->param('id', -1);
$this->template->content = 'my content - '.$id;
}
} // End Welcome
Omówmy dodaną akcję (action_other). W pierwszej linii pobieramy jeden z parametrów linka (w tym przypadku ostatni) i przypisujemy go do zmiennej id. Ostatni parametr funkcji ($this->request->param) jest opcjonalny i oznacza wartość domyślną. Gdybyśmy nie podali żadnej było by to null. Tak pobierane parametry w przyszłych aplikacjach będziesz mógł wykorzystywać na wiele sposobów: np. do określenia jaki artykuł użytkownik przegląda (jego id), czy też którą stronę wyników.
Kolejny wiersz przypisuje wartość zmiennej z uwzględnieniem ostatniego parametru. Poeksperymentuj. Zmień w pasku adresu przeglądarki liczbę na inną wartość i załaduj stronę. Zauważ, że ta wartość będzie uwzględniona.
Trasowanie – Routes
Mechanizm trasowania determinuje jakie kontrolery oraz akcje (a nawet i ich parametry) są wyzwalane. To fundamentalny element, który musisz poznać do pracy z frameworkiem Kohana.
Zacznijmy od podstaw. Trasowaniem możesz zarządzać z poziomu pliku Bootstrap.php. Domyślnie widnieje w nim jeden wpis:
/**
* Set the routes. Each route must have a minimum of a name, a URI and a set of
* defaults for the URI.
*/
Route::set('default', '(<controller>(/<action>(/<id>)))')
->defaults(array(
'controller' => 'welcome',
'action' => 'index',
));
Pierwszy argument funkcji Route::set oznacza unikalną nazwę danego „trasowania”. Dodając poniżej kolejny element o tej samej nazwie, nadpisujesz stary. Kolejność dodawanych wpisów ma znaczenie, co oznacza że jeśli kilka trasowań spełnia kryteria danego linka, tylko pierwsze jest wyzwolone.
Drugim argumentem jest url, który jest weryfikowany pod kątem odwiedzanego przez użytkownika. W nawiasach „()” kryją się argumenty opcjonalne, natomiast pomiędzy „<>” zdefiniowane nazwy zmiennych. Jak w powyższym przykładzie zauważyłeś całe wyrażenie kryje się w nawisach „()” co oznacza, że nawet czysty url (nasza główna strona) zostanie zaakceptowana i przetworzona przez domyślne trasowanie. Zwróć jeszcze uwagę, że wszystkie zmienne również rozpoczynają się dodatkowymi nawiasami. To bardzo ważne. Dzięki temu każdy z argumentów jest opcjonalny. Wszystkie poniższe linki są spełnione przez zaprezentowane trasowanie:
- /nazwa_kontrolera/nazwa_akcji/jakiś_parametr
- /nazwa_kontrolera/nazwa_akcji
- /nazwa_kontrolera
- /
Co jeśli jednak w urlu nie przypisano kontrolera czy też akcji? Z pomocą idzie dodatkowa funkcja (defaults) użyta na obiekcie Route. W zaprezentowanym przykładzie skorzystano z niej, aby wybrać domyślny kontroler oraz akcję, ale może dotyczyć również dowolnych innych zmiennych. Tak, w obrębie url-a możesz definiować swoje parametry. Rozważmy trochę bardziej złożony kod:
Route::set('articles', 'articles/<id>/<title>', array('id'=>'[0-9]+','title'=>'[a-zA-Z0-9-]+'))
->defaults(array(
'controller' => 'article',
'action' => 'index',
));
W tym przykładzie wszystkie parametry są wymagane. Kontroler oraz akcja są stałe. Dodatkowo w funkcji Route::set pojawił się trzeci argument – tablica określająca wyrażenia regularne dla parametrów. Zastosowane wyrażenia regularne zapewniają, że parametr id musi być liczbą a podany tytuł (title) powinien nie zawierać spacji czy też znaków specjalnych. Jeśli url nie spełnia danych kryteriów użyte jest później zadeklarowane trasowanie.
To tylko zalążek tego mechanizmu. Powinien Ci jednak wystarczyć do zbudowania prostej aplikacji. Zachęcam Cię abyś zapoznał się również z oficjalną dokumentacją.
Moduły oraz pliki konfiguracyjne
Kohana jest bardzo elastycznym szkieletem programistycznym. Możliwe jest rozszerzanie jej możliwości za pomocą dodatkowych modułów. W paczce, w której pobrałeś Kohane powinno być dostępnych już kilka najważniejszych, najczęściej używanych modułów: auth, cache, database, orm, userguide. Jeśli chcesz je włączyć wystarczy, że je zadeklarujesz w funkcji Kohana::modules w pliku Bootstrap.php (możesz też usunąć symbol komentarza przy nazwie modułu). Przykład:
Kohana::modules(array(
// 'auth' => MODPATH.'auth', // Basic authentication
// 'cache' => MODPATH.'cache', // Caching with multiple backends
// 'codebench' => MODPATH.'codebench', // Benchmarking tool
'database' => MODPATH.'database', // Database access
// 'image' => MODPATH.'image', // Image manipulation
// 'minion' => MODPATH.'minion', // CLI Tasks
// 'orm' => MODPATH.'orm', // Object Relationship Mapping
// 'unittest' => MODPATH.'unittest', // Unit testing
// 'userguide' => MODPATH.'userguide', // User guide and API documentation
));
Samo włączenie modułu, może być jednak niewystarczające. Często przed jego użyciem niezbędna jest dodatkowa konfiguracja i ten aspekt chciałbym właśnie przedstawić na przykładzie modułu bazodanowego (database). Pliki konfiguracyjne dla Twojej aplikacji Kohana powinieneś przechowywać w katalogu: application/config. Ich treść zwraca zazwyczaj tablicę. Jaki powinien być jej szablon? Niemalże zawsze możesz go podejrzeć. Wystarczy przejść do katalogu, w którym jest przechowywany (dla modułów jest to modules/nazwa_modulu/config/) domyślny plik tego typu i skopiować go do Twojej aplikacji. W naszym przypadku kopiujemy modules/database/config/database.php do application/config/database.php i aktualizujemy jego treść, przykładowo (dla bazy danych MySQL zainstalowanej lokalnie):
<?php defined('SYSPATH') OR die('No direct access allowed.');
return array
(
'default' => array
(
'type' => 'MySQL',
'connection' => array(
/**
* The following options are available for MySQL:
*
* string hostname server hostname, or socket
* string database database name
* string username database username
* string password database password
* boolean persistent use persistent connections?
* array variables system variables as "key => value" pairs
*
* Ports and sockets may be appended to the hostname.
*/
'hostname' => 'localhost',
'database' => 'kohana',
'username' => 'root',
'password' => '',
'persistent' => FALSE,
),
'table_prefix' => '',
'charset' => 'utf8',
'caching' => FALSE,
),
);
Bazy danych
Po poprawnym włączeniu oraz skonfigurowaniu modułu bazodanowego powinieneś mieć możliwość wykonywania swoich pierwszych zapytań. Nie będę tutaj odnosił się do żadnej konkretnej bazy danych. Jeśli chcesz możesz przygotować własną.
Najprostsze zapytanie wyświetlające nazwy użytkowników z tabeli users:
$query = DB::query(Database::SELECT, 'SELECT * FROM users')->execute();
foreach($query as $user)
{
echo $user['username'].'<br/>';
}
Co jeśli chciałbyś dodać dodatkowy parametr do zapytania?
$query = DB::query(Database::SELECT, 'SELECT * FROM users WHERE username = :user');
$query->param(':user', 'admin');
foreach($query->execute() as $user)
{
echo $user['username'].'<br/>';
}
Możesz też dodać wiele parametrów jednocześnie:
$query = DB::query(Database::SELECT, 'SELECT * FROM users WHERE username = :user AND id=:id');
$query->parameters(array(':user'=>'admin', ':id'=>1));
$query = $query->execute();
foreach($query as $user)
{
echo $user['username'].'<br/>';
}
Dodawanie danych do SZBD to również nie problem. Poniżej zamieszczam przykład, w którym dodawanych jest wiele rekordów, w oparciu o zawartość tablicy:
$new_users = array();
$new_users[0] = 'pierwszy';
$new_users[1] = 'kolejny';
$query = DB::query(Database::INSERT, 'INSERT INTO users (id, username) VALUES (:id, :user)')
->bind(':user', $username)
->bind(':id', $id);
foreach ($new_users as $id => $username)
{
$query->execute();
}
Uwagi
W pracy z Kohaną czasami będziesz potrzebował dodatkowej pomocy. Czytaj dokumentacje, przeglądaj kod źródłowy frameworka oraz gotowych aplikacji. W chwili kiedy nabierzesz doświadczenia, większość problemów będziesz w stanie rozwiązać samodzielnie. Tymczasem chciałem zaprezentować kilka błędów, z którymi możesz się spotkać stosunkowo wcześnie i opisy jak je rozwiązać:
-
Kohana_Exception [ 0 ]: A valid cookie salt is required. Please set Cookie::$salt. – zwrócony wyjątek oznacza, że klasa Cookie nie ma zadeklarowanego ziarna (kodu używanego przy pseudolosowości). Możesz je przypisać dodając w pliku Bootrap.php (np. na jego końcu, albo nie wcześniej niż przed funkcją spl_autoload_register) linię: Cookie::$salt = ‚b700eef24776166ec8a6c0d6df1ca9c5801fc44f’;
Uwaga: przypisana wartość powinna być tajna oraz unikalna względem aplikacji. Najlepiej wygeneruj losowy ciąg znaków.
Masz dodatkowe pomysły o czym jeszcze można napisać bądź jakieś zagadnienie sprawia Ci problemy? Daj znać w komentarzach.
Komentarze
Chcę dodać komentarzZenek N25-08-2013
Bardzo fajnie opisana instalacja, czekamy na więcej ;)
Marcin Baszczewski03-09-2013
Dziękuję za pozytywny komentarz. W najbliższym czasie opublikuję mały artykuł na temat Twig-a i jego integracji z Kohana. W ostatnich projektach intensywnie korzystam z tego duetu.
pawel n06-10-2013
nie powinnobyc tak?’
$new_users = array();
$new_users[0] = ‚pierwszy’;
$new_users[1] = ‚kolejny’;
foreach ($new_users as $id => $username)
{
DB::query(Database::INSERT, ‚INSERT INTO users (id, username) VALUES (:id, :user)’)
->bind(‚:user’, $username)
->bind(‚:id’, $id)->execute();
}
1.po co tworzyc zmiennaktora nie wykorzystasz
2.w Twoim foreach wynik nieprzewidywalny-niezgodny z zalozeniem.
Marcin Baszczewski09-10-2013
Dziękuję Paweł za czujność, ale przykład, który podałem jest jak najbardziej poprawny. Celowo skorzystałem z takiej zwięzłej oraz (moim zdaniem) obrazowej formy.
Dodaj w pętli wyświetlanie zapytania, aby samemu się przekonać:
$query->execute();
echo Database::instance()->last_query;
Skąd te czary? Wystarczy podejrzeć jak została ta klasa zaimplementowana w Kohanie (http://kohanaframework.org/3.3/guide-api/Database_Query#bind). Otóż parametry są tak naprawdę wskaźnikami do zmiennych, które później aktualizujemy.