Tutorial do frameworka Cake PHP
CakePHP, to ciekawy framework dla jęyka PHP, wzorujący się na systemie Ruby on Rails (RoR) i modelu MVC. Działa narazie pod php4 jak i 5, ale przyszłości kompatybilność z php4 może zostać porzucona. Pozwala na bardzo szybkie uruchomienie projektu i przyjemne jego ukończenie.
Konwencje nazw i projekty tabeli
Pisząc dla CakePHP potrzeba jak w przypadku RoR przyjąć pewne konwencje nazw. Wszystko nazywamy po angielsku. Nazwy tabel zaczynają się małą literą i są w liczbie mnogiej. Klasy modeli mają liczbę pojedynczą i zaczynają się dużą literą. Kontroler nazywamy z dużej litery i liczbą mnogą. Przykład:
- tabela - posts
- model - Post
- kontroler - PostsController
Każda tabela, której używamy w projekcie musi zawierać 3 pola:
- id auto_increment
- added datetime default null
- modified datetime default null
Jeśli występuje w tabeli indeks z innej tabeli, to dodajemy do jej nazwy '_id', np. w pole w tabeli comments - 'post_id'.
Zaczynamy - instalacja
Żeby zainstalować CakePHP wystarczy ściągnąć odpowiednie pliki z http://cakephp.org -> dział Downloads / Release. Rozpakowujemy go tak, żeby katalog, gdzie user zaczyna przeglądanie strony zawierał główne katalogi - cake, app, ...
Własne pliki wkładamy właściwie tylko do podkatalogów app.
Konfiguracja bazy i serwera.
Co do serwera - cake używa mod_rewrite'a, więc powinien on działać na serwerze, gdzie piszemy kod. Można użyć też innego mechanizmu wpisanego w Cake, ale zwykle powoduje to dużo dodatkowej pracy i nie zawsze chce działać jak trzeba.
Co do bazy - zwykle wystarczy skopiować plik app/config/database.php.default jako app/config/database.php i zmienić tylko nazwe bazy (database), użytkownika (login) i hasło (password). Możemy też zmienić rodzaj bazy danych i sposób połączenia.
Robimy prostego bloga, czyli standardowy tutorial CakePHP.
Najpierw potrzebujemy tabel - dla postów i dla komentarzy. Załatwiamy to przez:
CREATE TABLE posts (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(50), body TEXT, created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL);
CREATE TABLE comments (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
post_id INT UNSIGNED, author VARCHAR(50), body TEXT,
created DATETIME DEFAULT NULL, modified DATETIME DEFAULT NULL);
i wkładamy troche przykładowych danych:
INSERT INTO posts VALUES (0, 'Pierwszy wpis blogowy',
'Jakastam tresc dziwna', NOW(), NULL);
INSERT INTO posts VALUES (0, 'Drugi wpis blogowy',
'Jeszcze troche tekstu', NOW(), NULL);
INSERT INTO comments VALUES (0, 1, 'ktos',
'komentarz do pierwszego', NOW(), NULL);
INSERT INTO comments VALUES (0, 1, 'ktos inny',
'nastepny komentarz', NOW(), NULL);
Reprezentacja tabel w PHP
Musimy poinformować CakePHP, że te tablice istnieją, więc dodajemy pliki z klasami modeli danych (``M'' w MVC). Po kolei tworzymy app/models/post.php:
![]()
class Post extends AppModel {
var $displayField = 'title';
var $hasMany = 'Comment';
var $name = 'Post';
}
![]()
i app/models/comment.php:
![]()
class Comment extends AppModel {
var $displayField = 'id';
var $belongsTo = 'Post';
var $name = 'Comment';
}
![]()
Zmienna displayField oznacza pole, którego używamy przy ``wyświetlaniu'' danego modelu.
Zmienne hasMany i belongsTo oznaczają relacje między tabelami. Można je tłumaczyć dosłownie i taki mają właśnie sens. Klasa Post ``ma wiele'' klas Comment, a klasa Comment ``należy do jednej'' klasy Post. To wystarczy, żeby CakePHP wiedział, że istnieją te tabele, klasy i jakie są między nimi zależności.
Szybko zobaczyć efekt
Teraz wykorzystamy ``scaffold'', czyli po naszemu rusztowanie, żeby szybko zobaczyć efekt funkcji, które później sami dostosujemy do własnych potrzeb. Chodzi o funkcje CRUD, czyli operacje na rekordach tabel - dodawanie (Create), oglądanie (Read), edycje (Update), kasowanie (Delete).
Tworzymy kontrolery do modeli (``C'' w MVC). Będą one automatycznie przez scaffolding tworzyć widoki (``V'' w MVC). Wpisujemy do
app/controllers/posts_controller.php:
![]()
class PostsController extends AppController {
var $scaffold;
}
![]()
i do app/controllers/comments_controller.php:
![]()
class CommentsController extends AppController {
var $scaffold;
}
![]()
Teraz można zaglądnąć pod http://gdziestam/katalog/posts/ zakładając, że pod http://gdziestam/katalog leżyą katalogi app, cake i inne. Widać, że po kliknięciu na View przy pierwszym poście widać powiązane z nim komentarze. Inne funkcje też działają, więc można zmieniać już bazę wedle uznania.
Pisanie własnych kontrolerów i widoków
Teraz, kiedy już ludzie nie znający wcześniej możliwości scaffoldingu i automatycznych frameworków MVC pozbierali szczęki z ziemi, możemy napisać własną obsługę danych z bazy. Musimy obsłużyć akcje 'view', 'add', 'delete', 'edit', ... Jeśli będziemy obsługiwać jakąś akcje, którą może też wziąść scaffolding, to zawsze obsługa zostanie przekazana do akcji użytkownika.
Template i akcje 'index', 'view'
Żeby samemu oskryptować te akcje wystarczy dodać funkcje PostsController->index i ->view. Do app/controller/posts_controller.php dodajemy wewnątrz klasy:
var $name='Posts';
function index() {
$this->set('data',$this->Post->findAll());
}
function view($id) {
$this->Post->id = $id;
$this->set('data', $this->Post->read());
}
Te dane które wstawiliśmy (findAll - wyszukanie wszystkich rekordów, read - przeczytanie informacji z danego rekordu) wystarczą do stworzenia widoku tych akcji. Następny krok to sam kod html. Dla każdej akcji tworzymy plik app/views/<model>/<akcja>.thtml, więc teraz wpisujemy po kolei do app/views/posts/index.thtml:
foreach ($data as $post):
<div>
<b>Tytuł</b>: echo $post['Post']['title'];
if(isset($post['Comment']))
echo ' ('.sizeof($post['Comment']).')';
else echo ' (0)'; <br>
<b>Treść</b>: echo $post['Post']['body']; <br>
![]()
echo $html->link('Zobacz',
'/posts/view/'.$post['Post']['id']);
<hr>
</div>
endforeach;
i do app/views/posts/view.thtml:
<div>
<h1> echo $data['Post']['title']</h1>
<p><small>Utworzony: echo $data['Post']['created']</small></p>
<p> echo $data['Post']['body']</p>
![]()
</div>
echo $html->link('Edytuj post',
'/posts/edit/'.$data['Post']['id']);
<hr>
<h1>Komentarze</h1>
foreach ($data['Comment'] as $comm):
<div>
<b>Autor</b>: echo $comm['author']; <br>
![]()
<b>Treść</b>: echo $comm['body']; <br>
</div>
<hr>
endforeach;
Funkcje użyte wyżej są praktycznie samokomentujące i wystarczy kilka chwil przy CakePHP, żeby załapać ``co i jak''. Żeby wstawić na resztę strony własny layout trzeba stworzyć plik app/views/layouts/default.thtml zawierający w treści np.:
<html>
<body>
echo $content_for_layout;
</body>
</html>
Treść wygenerowana przez kontrolery znajdzie się we wiadomym miejscu.
Co dalej?
Widać już, że dalej też będzie szybko i przyjemnie. Wystarczy kilka chwil, żeby dodać edycję i dodawanie rekordów. Więcej informacji, dużo tutoriali i pełny opis CakePHP znajduje się na www.cakephp.org. Projekt jest narazie we wczesnej fazie rozwoju i układ funkcji / zmienne mogą się drastycznie zmieniać, ale już kilka porządnych werji CakePHP powstało i jak narazie jest tylko lepiej. Niedługo można spodziewać się wielu udogodnień (m.in. podział wyników na strony), a za jakiś czas v1.0.
A więc dalej -> bawić się i używać sobie cake'a, bo korzyści z tego sę duże.










