You are on page 1of 13

CakePHP

Anton Smoliński :: Wydział Informatyki ::


Zachodniopomorski Uniwersytet Technologiczny w
Szczecinie

Laboratorium opisujące pracę przy wykorzystaniu frameworka CakePHP do stworzenia


prostego serwisu umożliwiającego użytkownikom zmierzenie się z grą puzzle.
CakePHP


CakePHP
Anton Smoliński :: Wydział Informatyki ::
CakePHP
Zachodniopomorski Uniwersytet Technologiczny w 
Szczecinie Jest to darmowy
framework bazujący na
Przepływ sterowania architekturze MVC,
służący do szybkiego
tworzenia aplikacji
webowych. Udostępnia
elementy, które
pojawiają się w każdym
projekcie (np.
stronicowanie,
logowanie, role
użytkowników)
pozwalając
programiście skupić się
jedynie na unikalnych
elementach danego
serwisu.
Rysunek 1: Przepływ sterowania w CakePHP
Posiada rozbudowaną
Jak wynika z powyższego schematu żądanie wysłane przez
grupę użytkowników i
użytkownika najpierw jest rozbijane do uzyskania odpowiednich
wiele przykładów
parametrów takich jak nazwa kontrolera, jego parametry (krok 1).
ułatwiających tworzenie
Następnie w 2 kroku framework ładuje odpowiedni kontroler
aplikacji.
przekazując mu parametry. Następnie dane przetwarzane są w
kontrolerze (3), który jest tworzony przez programistę. W ramach Udostępniany na
kontrolera wywołujemy model danych (4), który przekształca nam darmowej licencji MIT
dane pozyskane z DB, bądź innego źródła do postaci tabeli z (X11) zezwalającej na
polami, które zawierają wartości poszczególnych atrybutów, przez wszystko, wymagając
co w kontrolerze można uzyskać w prosty sposób dostęp do jedynie podania
danych (5). Dodatkowo możliwe jest używanie komponentów (6), informacji o autorze.
czyli pewnych operacji logicznych, które wykorzystujemy więcej
niż w jednym kontrolerze. Kontroler następnie wywołuje Widok
(7), w ramach którego łączony jest Layout strony z przesłanymi

Przepływ sterowania  1
CakePHP


danymi, oraz można skorzystać z Helperów, czyli odpowiedników komponentów dla widoku (np.
helpery odnośnie tworzenia formularzy, AJAXa itp.). Złożona strona przesyłana jest następnie do
użytkownika (8).

Drzewo katalogów i konwencje nazw


 app – katalog zawierający wszystkie pliki tworzone przez programistę
o config – konfiguracja projektu
o controllers – zbiór kontrolerów
o libs – biblioteki
o locale – lokalizacje językowe projektu
o models – modele danych
o plugins – wewnętrzne komponenty
o tests – zawiera przypadki testowe dla danych komponentów systemu
o tmp – pliki tymczasowe (dane sesji itp.)
o vendors – używane biblioteki z zewnątrz
o views – widoki
o webroot – pliki używane i udostępniane w serwisie (oraz css, js)
 cake – jądro frameworka, nie zaleca się modyfikować
 vendors – dodatkowe zewnętrzne biblioteki
 (od wersji 1.3) plugins – dodatkowe zewnętrzne komponenty

Tworzone nazwy poszczególnych elementów muszą być w konwencji CamelCased oraz zawierać na
końcu słowo oznaczające przeznaczenie kodu (Controller, View, Component, Helper). Ścieżka URL
zawiera natomiast słowa oddzielone od siebie znakiem podkreślenia „_” (np.
example.com/nowy_kontroler/ odwołuje się do NowyKontrolerController znajdujący się w pliku
nowy_kontroler_controller.php w katalogu app/controllers).

Dbając o odpowiednią konwencję nazw oraz umieszczając pliki w przeznaczonych na nie folderach
zapewniamy poprawne funkcjonowanie frameworka i nie musimy się w zasadzie o nic martwić.

Instalacja frameworka CakePHP


Aby zainstalować framework CakePHP, należy pobrać ze strony http://cakephp.org/ ostatnią stabilną
wersję (na chwilę obecną 1.3.7), a następnie rozpakować paczkę w katalogu public_html naszego konta.
W rezultacie po odpaleniu przeglądarki i przejściu pod odpowiedni adres powinniśmy otrzymać
poniższą stronę:

Drzewo katalogów i konwencje nazw  2


CakePHP


Rysunek 2: CakePHP tuż po instalacji

Pierwsze linie (kolorowe) określają konfigurację środowiska w którym pracujemy. Zielony kolor
oznacza poprawność, żółty – konieczność zmiany. W tym momencie nie podłączyliśmy DB oraz nie
zmieniliśmy zabezpieczeń tworzonego serwisu.

Tworzymy aplikację
Aby utworzyć jakąkolwiek aplikację, musimy przejść przez kilka kroków:

 Utworzenie Bazy danych


 Utworzenie Modelu danych
 Utworzenie Kontrolera
 Utworzenie Widoku

Praktyczne zastosowanie CakePHP, zaprezentuję na przykładzie prostego bloga. Dzięki temu można
zauważyć różnicę pomiędzy CakePHP a innymi frameworkami (jak Zend).

Tworzymy aplikację  3
CakePHP


Baza danych
Za pomocą phpMyAdmin tworzymy prostą bazę danych składającą się z tabeli zawierającej posty, oraz
wrzucamy przykładowe posty.

CREATE TABLE posts (


id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(50),
body TEXT,
created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL
);

INSERT INTO posts (title,body,created)


VALUES ('tytul', 'tresc postu', NOW());
INSERT INTO posts (title,body,created)
VALUES ('Kolejny post', 'Tresc kolejnego postu.', NOW());
INSERT INTO posts (title,body,created)
VALUES ('Ostatni post', 'Lorem ipsum, Lorem ipsum', NOW());

Konfiguracja bazy danych


W katalogu: /app/config/ znajduje się plik: database.php.default Kopiujemy ten plik zmieniając
jego nazwę na: database.php

Następnie edytujemy dany plik, uzupełniając konfigurację połączenia z bazą danych (należy zmienić
pogrubione rekordy).

var $default = array(


'driver' => 'mysql',
'persistent' => 'false',
'host' => 'localhost',
'login' => 'user',
'password' => 'password',
'database' => 'database_name',
'prefix' => ''
);

Model
Mając utworzoną i podpiętą bazę danych do CakePHP należy utworzyć Model do obsługi danych
danych.

Baza danych  4
CakePHP


CakePHP jest potężnym narzędziem, które wiele rzeczy robi automatycznie bez konieczności jawnej
ich deklaracji. Trzymając się ścisłego nazewnictwa nazw bazy danych (tj. l.m w języku angielskim)
poprawnym modelem, który będzie satysfakcjonująco obsługiwał ową bazę wygląda następująco:

<?php

class Post extends AppModel {


var $name = 'Post';
}

?>

Jedyną rzeczą, jaką jawnie trzeba było zrobić, to określić nazwę dla modelu. Pozostałe czynności są
tworzone automatycznie przez silnik Frameworka.
Owy plik zapisujemy jako: /app/models/post.php

Kontroler
Kolejnym krokiem w tworzeniu aplikacji jest utworzenie kontrolera, czyli logiki danego wycinka.

Aby go utworzyć, w katalogu: /app/controllers tworzymy plik posts_controller.php

<?php
class PostsController extends AppController {
var $helpers = array ('Html','Form');
var $name = 'Posts';
}
?>

Z powyższego kodu widzimy, że podczas tworzenia kontrolera korzystamy z gotowych już elementów
systemu. Tzw. Pomocników (helpers). Dzięki nim dostajemy zbiór funkcji i klas ułatwiających i
przyspieszających w znacznym stopniu pracę nad tworzoną aplikacją. W tym przypadku korzystamy z
pomocników „HTTP”, oraz „FORM”.

Zgodnie z założeniami cake. Adres URL (jego pierwszy człon) odsyła do konkretnego kontrolera.
Kolejne parametry adresu, odpowiadają akcji, oraz parametrom wywołania. Czyli:
www.example.com/posts/index wywoła akcję Index znajdującą się w kontrolerze Post.

Tworzymy więc w naszym kontrolerze Post akcję Index (akcja o nazwie Index jest domyślną akcją
każdego kontrolera i musi być obecna przy jego tworzeniu). Akcja ta będzie pobierać z modelu
informacje o postach. Jako, iż daną informację nie musimy przetwarzać, wygląda ona:

Kontroler  5
CakePHP


function index() {
$this->set('posts', $this->Post->find('all'));
}

Akcja odwołuje się do modelu, i pobiera z bazy danych wszystkie rekordy. CakePHP automatycznie
udostępnia wszystkie wskazane pola w widoku.

Po odpaleniu przeglądarki naszym oczom ukaże się widok informujący o braku komponentu view:

Z drugiej strony wyświetli się tabelka zawierająca informacje które pobieramy z bazy danych. Edytując
plik widoku możemy zmienić sposób wyświetlania informacji na stronie.

Widok
Widok naszej aplikacji/strony można zmienić, Tworząc odpowiedni plik w folderze /app/views

Zgodnie z konwencją CakePHP każdy kontroler powinien posiadać własny folder dla widoku, a każda
akcja, własny plik. Dlatego też, tworzymy folder: posts/, oraz plik index.ctp, zawierający wygląd
aplikacji:

<!-- /app/views/posts/index.ctp -->

<h1>Blog</h1>
<table>
<tr>
<th>Id</th>
<th>Tytul</th>
<th>Utworzono</th>
</tr>

Widok  6
CakePHP


<!-- pętla do wyświetlania poszczególnych postów -->

<?php foreach ($posts as $post): ?>


<tr>
<td><?php echo $post['Post']['id']; ?></td>
<td>
<?php echo $this->Html->link($post['Post']['title'],
array('controller' => 'posts', 'action' => 'view', $post['Post']['id'])); ?>
</td>
<td><?php echo $post['Post']['created']; ?></td>
</tr>
<?php endforeach; ?>

</table>

W rezultacie otrzymujemy listę wszystkich postów w systemie.

Następnie warto umożliwić wyświetlenie każdego z postu. Wcześniej określiliśmy, że kliknięcie


przekierowuje do kontrolera posts, akcji view. Należy więc utworzyć ową akcję, oraz jej widok.

W pliku kontrolera (/app/controllers/posts_controller.php) dopisujemy:

function view($id = null) {


$this->Post->id = $id;
$this->set('post', $this->Post->read());
}

Funkcja pobiera tylko jeden wpis - z określonego ID, oraz wyświetla jego wynik.

Plik widoku akcji:

<!-- /app/views/posts/view.ctp -->

Widok  7
CakePHP


<h1><?php echo $post['Post']['title']?></h1>

<p><small>Utworzono: <?php echo $post['Post']['created']?></small></p>

<p><?php echo $post['Post']['body']?></p>

W podobny sposób można także określić layout strony tworząc plik: /app/views/layouts/default.ctp

Istnienie owego pliku spowoduje, że Cake załaduje layout właśnie z niego, a nie domyślny (na którym
do tej pory działaliśmy).

Dodawanie postów
Mamy już proste wyświetlanie, dalej zobaczmy w jaki sposób można dodawać nowe wpisy i
zapisywać je w bazie danych.

Tworzymy kolejną akcję w kontrolerze posts:

<?php
class PostsController extends AppController {
var $name = 'Posts';
var $components = array('Session');

function index() {
$this->set('posts', $this->Post->find('all'));
}

function view($id) {
$this->Post->id = $id;
$this->set('post', $this->Post->read());

function add() {
if (!empty($this->data)) {
if ($this->Post->save($this->data)) {
$this->Session->setFlash('Dodano nowego posta.');
$this->redirect(array('action' => 'index'));
}
}
}
}
?>

Nowa akcja definiuje zachowanie aplikacji po dodaniu nowego wpisu. Sprawdzamy, czy dane wysłane
przy pomocy metody POST (przechowywane w tablcy $this->data) poprawnie się zapisały. Jeśli tak,

Dodawanie postów  8
CakePHP


zapisuje wiadomość o powodzeniu do tzw. Pamięci flash – trzymanej w sesji użytkownika. Oraz
przekierowuje na kolejną stronę. Dzięki ustawieniu Flash-a po przekierowaniu można ustalić
komunikat o stanie akcji.

Należy także utworzyć formularz, za którego pośrednictwem będą dodawane wpisy:

<!-- /app/views/posts/add.ctp -->

<h1>Dodaj</h1>
<?php
echo $this->Form->create('Post');
echo $this->Form->input('title');
echo $this->Form->input('body', array('rows' => '3'));
echo $this->Form->end('Zapisz');
?>

W tym przypadku korzystamy z wbudowanych funkcji w Helperze „FORM” do tworzenia


formularzy. Jako parametry funkcji podajemy nazwy pól w bazie danych. W rezultacie cakePHP sam
wygeneruje odpowiedni kod html opisujący dany formularz.

Możemy dodatkowo dodać przycisk „dodaj” w widoku listy by bez problemu móc dostać się do nowej
akcji. W tym celu dopisujemy linijkę:

<?php echo $this->Html->link('Dodaj Post', array('controller' => 'posts',


'action' => 'add')); ?>

W pliku: /app/views/posts/index.ctp

Walidację formularza określamy w modelu. W pliku: /app/models/posts.php

<?php
class Post extends AppModel
{
var $name = 'Post';

var $validate = array(


'title' => array(
'rule' => 'notEmpty'
),
'body' => array(
'rule' => 'notEmpty'
)
);
}

Dodawanie postów  9
CakePHP


?>
Określamy dzięki temu jak powinny wyglądać poszczególne pola formularza. Zapis do bazy danych
przebiega niejawnie – nie musimy go definiować.

Usuwanie postów
Podobnie przebiega proces usuwania postów. Najpierw tworzymy odpowiednią akcję w kontrolerze:

function delete($id) {

if ($this->Post->delete($id)) {

$this->Session->setFlash('Post o id: ' . $id . ' Został


usunięty.');

$this->redirect(array('action' => 'index'));

Następnie edytujemy listę postów dodając przycisk „Usuń”.

<!-- /app/views/posts/index.ctp -->

<h1>Blog</h1>
<p><?php echo $this->Html->link('Dodaj Post', array('action' => 'add'));
?></p>
<table>
<tr>
<th>Id</th>
<th>Tytul</th>
<th>Akcja</th>
<th>Utworzono</th>
</tr>

<!-- pętla wyświetlająca wszystkie posty w bazie -->

<?php foreach ($posts as $post): ?>


<tr>
<td><?php echo $post['Post']['id']; ?></td>
<td>
<?php echo $this->Html->link($post['Post']['title'],
array('action' => 'view', $post['Post']['id']));?>
</td>
<td>

Usuwanie postów  10
CakePHP


<?php echo $this->Html->link('Usun', array('action' => 'delete',


$post['Post']['id']), null, 'Jestes pewien?')?>
</td>
<td><?php echo $post['Post']['created']; ?></td>
</tr>
<?php endforeach; ?>

</table>

Edycja wpisów
Jak mogliśmy zauważyć CakePHP upraszcza wiele czynności, tak iż programista nie musi ich za
każdym razem implementować. Jedyną rolą, jest trzymanie się konwencji nazw.

Na koniec zobaczmy jak przebiega edycja wpisów bloga.

W widoku głównym kontrolera post dodajemy linijkę:

<?php echo $this->Html->link('Edit', array('action' => 'edit',


$post['Post']['id']));?>

Dzięki niemu mamy z listy postów możliwość ich edycji. Następnie dodajemy w kontrolerze akcję edit:

function edit($id = null) {


$this->Post->id = $id;
if (empty($this->data)) {
$this->data = $this->Post->read();
} else {
if ($this->Post->save($this->data)) {
$this->Session->setFlash('Zmieniles swoj wpis.');
$this->redirect(array('action' => 'index'));
}
}
}

I na koniec widok akcji:

<!-- /app/views/posts/edit.ctp -->

<h1>Edytuj</h1>
<?php
echo $this->Form->create('Post', array('action' => 'edit'));

Edycja wpisów  11
CakePHP


echo $this->Form->input('title');
echo $this->Form->input('body', array('rows' => '3'));
echo $this->Form->input('id', array('type' => 'hidden'));
echo $this->Form->end('Edytuj');
?>

W powyższym formularzu prócz opcji które były wcześniej dodaliśmy także ukryte pole ID, dzięki
któremu CakePHP wie, jaki wpis edytować.

Dalsze działania
CakePHP wspomaga szybkie wytwarzania oprogramowania. Chcąc dalej rozwijać swoją aplikację
warto zapoznać się z tzw. Książką kucharską (Cookbook): http://book.cakephp.org/, czyli
dokumentacją CakePHP. Przedstawiono tam sposoby używania różnych funkcji czy pomocników.

Dodatkowe zadanie
Korzystając z tutoriala: http://book.cakephp.org/#!/view/1543/Simple-Acl-controlled-Application dodać
prostą kontrolę ACL do stworzonej aplikacji – Bloga.

Dalsze działania  12

You might also like