CakePHP – konwencje nazw

cakephpWedług słownika PWN, konwencja oznacza ogólnie przyjęte w jakimś środowisku normy postępowania, myślenia lub też zespół charakterystycznych cech przyjętych przez twórcę1. Twórcy frameworka CakePHP określili się jako wielcy fani stosowania konwencji, dlatego warto poświęcić kilka chwil na zrozumienie konwencji nazw przyjętych w tym narzędziu, co pozwoli uniknięcie wielu pułapek i problemów podczas tworzenia aplikacji w przyszłości. Twórcy CakePHP są określają się jako „wielcy fani konwencji, która w przypadku tego frameworka jest ważniejsza niż konfiguracja. Co daje takie podejście? Choć nauczenie się zasad nazewnictwa może zająć trochę czasu, to w praktyce umożliwia pisanie aplikacji nawet bez napisania jednej linii kodu PHP! Poprzez zachowanie konwencji, można uzyskać funkcjonalność  technicznego śledzenia plików konfiguracyjnych.

Język angielski

Projektanci narzędzia CakePHP założyli, że podczas programowania aplikacji programista będzie wykorzystywał w język angielski. Angielskie nazwy dotyczą tabel w bazach danych, modeli,  kontrolerów oraz widoków. Co więcej – w zależności od elementu, wykorzystuje się nazwę w liczbie pojedynczej, jak i mnogiej. W kolejnych podrozdziałach zostaną opisane zasady konwencji nazw i warto przyswoić sobie te zasady. Framework rozróżnia także liczbę pojedynczą oraz mnogą nazw, zaś w języku angielskim liczbę mnogą tworzy się dodając końcówkę -s lub -es, a dzięki temu, CakePHP poprawnie interpretuje takie nazewnictwo. Choć niektórzy upierają się, że stosowanie polskich nazw jest możliwe, przy większych projektach może to powodować kłopoty i należy się tego wystrzegać.

Przykład konwencji nazw plików i klas

  • Klasa kontrolera KissesAndHugsController tworzona jest z nazwy pliku KissesAndHugsController.php
  • Klasa komponentu MyHandyComponent tworzona jest z nazwy pliku MyHandyComponent.php
  • Klasa tabeli OptionValuesTable tworzona jest z nazwy pliku OptionValuesTable.php.
  • Klasa encji OptionValue tworzona jest z nazwy pliku OptionValue.php.
  • Klasa Behavior EspeciallyFunkableBehavior tworzona jest z nazwy pliku EspeciallyFunkableBehavior.php
  • Klasa widoku SuperSimpleView tworzona jest z nazwy pliku SuperSimpleView.php
  • Klasa helpera BestEverHelper tworzona jest z nazwy pliku BestEverHelper.php

Kontrolery

Nazwa każdej klasy kontrolera zaczyna się od wielkiej litery, jest liczbą mnogą i kończy się słowem Controller – również zaczynającego się od wielkiej litery.

Na przykład, aby utworzyć kontroler dotyczący użytkowników, może on przyjąć nazwę UsersController, jeśli  tworzony będzie kontroler dotyczący wpisów na stronie, można użyć nazwy PostsController, zaś w przypadku, gdy tworzymy grupy użytkowników, należy nazwać je GroupsController.

Nazwy plików kontrolerów muszą mieć taką samą nazwę jak kontroler z rozszerzeniem .php. Na przykład, wspomniany wcześniej kontroler UsersController, będzie zapisany jako UsersController.php, PostsConttrollerPostsController.php, natomiast GroupsControllerGroupsController.php.

Modele i tabele w bazie danych

Kolejną konwencję nazewniczą posiadają modele i tabele w bazach danych. Warto zapamiętać, by w nazewnictwie tabel również stosować język angielski, ponieważ na podstawie nazwy tabeli, przy automatycznym generowaniu kodu, generator tworzy kod na podstawie konwencji nazw.

Nazwa modelu zaczyna się od wielkiej litery i jest pisana w liczbie mnogiej.
Nazwę modelu tworzy się na podstawie nazwy tabeli (pisanej w liczbie mnogiej, z małej litery).

Na przykład, w przypadku tabeli użytkowników, tabela może nazywać się users, zaś tabela przechowująca wpisy – posts. Należy pamiętać o liczbie mnogiej! Jeśli w nazwa tabeli składa się z dwóch lub większej ilości słów (często przy tabelach łącznikowych),  można stosować podkreślenie dolne, które również będzie poprawnie rozpoznawane przez framework, np. vip_users.

Nazwy pól w tabelach pisze się w języku angielskim w liczbie pojedynczej,
np. name, first_name, username, itp.

Każda tabela musi zawierać pole identyfikacyjne (klucz główny) o nazwie id, by CakePHP poprawnie rozpoznał tego typu pole. Jest to niezwykle ważne ze względu na automatyczne tworzenie relacji pomiędzy tabelami. Prawidłowe rozpoznanie pól w tabeli gwarantuje, że framework poprawnie utworzy złączenia tabel wyręczając w tym programistę, a jest to naprawdę przydatna funkcja.

Klucze obce w relacji hasMany, belongsTo lub hasOne interpretowane są jako (liczba pojedyncza) i odbywa się po kolumnach (polach w tabeli), które zawierają nazwę tabeli głównej, np. user, z końcówką _id.

Więc w przypadku, jeśli Users hasMany (użytkownik posiada wiele wpisów) Posts, tabela posts będzie odnosić się do użytkowników tabeli użytkowników poprzez klucz obcy user_id (tabela user, pole id).

W przypadku tabeli grupy, stosowanej do użytkowników, gdzie użytkownik może być częścią wielu grup (BelongsToMany), połączenie modelu odbywa się poprzez tabelę łącznikową groups_users, gdzie nazwy ułożone są w porządku alfabetycznym, zaś polami w tabeli łączącej będą user_id oraz group_id.

Klasa modelu

W tym przypadku zawsze stosujemy liczbę pojedynczą. Na przykład, dla modelu użytkowników, należy zastosować nazwę User. Przypominam, że tabela użytkowników nazywa się users, stąd model będzie nosić taką nazwę, w liczbie mnogiej i zaczynającą się od wielkiej litery:

<?php 
class User extends AppModel { } 
?>

Ciekawostka: reguły językowe frameworka zapisane są w pliku Vendor\cakephp\cakephp\sqc\Utility\Inflector.php, który oprócz definiowania zasad niestandardowych, pozwala sprawdzić, czy framework „rozumie” składnię dla określonej nazwy w liczbie mnogiej oraz pojedynczej.

Widoki

Nazwy widoków odpowiadają akcjom w kontrolerze. Na przykład, akcja dodawania nowego użytkownika Add() w kontrolerze UsersController, musi mieć swój odpowiednik pliku .ctp w katalogu src/Template/Users/add.ctp natomiast wyświetlenie wszystkich użytkowników z bazy, czyli wywołanie akcji index() korzysta z szablonu  src/Template/Users/index.ctp.

W przypadku funkcji kontrolera zawierają podkreślenie dolne. Na przykład funkcja getRead() w kontrolerze PeopleController będzie poszukiwać pliku widoku src/Template/People/get_ready.ctp.

Podstawowy wzór to: src/Template/Controller/underscored_function_name.ctp.

Używając konwencji nazw w CakePHP, zyskujesz funkcjonalność oraz szybkość tworzenia aplikacji. Oto ostatni przykład, która ilustruje konwencje:

  • Tabela w bazie danych: “people”
  • Klasa tabeli: “PeopleTable”, w pliku src/Model/Table/PeopleTable.php
  • Klasa encji: “Person”, w pliku src/Model/Entity/Person.php
  • Klasa kontrolera: “PeopleController”, w pliku src/Controller/PeopleController.php
  • Szablon widoku w pliku src/Template/People/index.ctp

Podsumowanie

Używając konwencji nazewniczej podczas tworzenia oprogramowania za pomocą frameworka CakePHP, można uzyskać szybkość tworzenia kodu nawet bez konieczności późniejszych modyfikacji dla uzyskania szybkiego efektu. Na koniec podsumowanie, które przedstawia przykład, z zastosowaniem konwencji nazw dla użytkowników:

Tabela: users

baza danych

Klasa (model): UserTable

src/model/Table/UserTable.php

Widok: index.ctp

Src/Template/User/index.ctp

Kontroler: UsersController

Src/controller/UserController.php

 

542total visits,1visits today

Tagi , , .Dodaj do zakładek Link.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

65 + = 66

This site uses Akismet to reduce spam. Learn how your comment data is processed.