Recenzja My CakePHP 3 – Wciąż świeża, wciąż gorąca
Opublikowany: 2022-03-11W zeszłym miesiącu zespół CakePHP ogłosił wydanie wersji alfa CakePHP 3. Zespół twórców Cake uważa wersję 3 za zmieniacz gier, więc wraz z wydaniem wersji alfa wersji 3, która jest teraz gorąca, ten artykuł ma świeże spojrzenie na CakePHP 3 jako efektywny nowoczesny framework do programowania PHP.
Krótka historia
W dzisiejszych czasach jest tak wiele opcji, jeśli chodzi o rozwój PHP. W miarę dojrzewania PHP coraz więcej frameworków PHP pojawia się na scenie, zapewniając programistom szeroki wachlarz możliwości. Ale nie zawsze tak było.
W 2005 roku, kiedy PHP 4 było nadal standardem, nie było frameworków PHP, a opracowanie zorientowanego obiektowo podejścia do kodowania w PHP było z pewnością wyzwaniem. Wtedy pojawił się CakePHP – pierwszy w historii framework PHP MVC. W ciągu prawie 10 lat, które minęły od pierwszego wydania, CakePHP nadal ewoluował, utrzymując zdrowy udział w rynku deweloperów PHP.
Jak popularny jest framework CakePHP? Znajduje się w czołówce 4 najpopularniejszych projektów PHP na GitHub, spośród około 130 000 projektów, z ponad 18 000 członkami w grupie CakePHP Google z 32 000 tematami. Z 270 współtwórcami kodu i 320 współtwórcami dokumentacji, nie można zaprzeczyć, że CakePHP ma wielu zwolenników. Obecną powszechną i rosnącą popularność CakePHP dobrze podsumowuje artykuł autorstwa Jamesa Wattsa, głównego członka i menedżera społeczności CakePHP dla Cake Software Foundation, z którym przeprowadziłem wywiad podczas pisania tego artykułu.
Po udostępnieniu wersji 3 frameworka, CakePHP z pewnością pozostanie wiodącą siłą w świecie PHP i głównym rywalem w dzisiejszym zróżnicowanym krajobrazie frameworków PHP.
Co nowego w wersji 3 CakePHP?
Ta recenzja jest oparta na wersji alfa CakePHP 3.0, która zawiera wiele nowych funkcji i ulepszeń, w tym:
Lepsza wydajność. Wersja 3 zawiera ulepszenia wydajności procesu ładowania początkowego, procesu routingu i kilku części procesu generowania szablonów pomocniczych.
Ulepszone komponenty i pomocnicy. Wersja 3 zapewnia ulepszoną obsługę „wiadomości flash” dzięki nowym FlashHelper i FlashComponent. Ponadto ulepszono CookieComponent, ułatwiając oddzielenie konfiguracji przestrzeni nazw plików cookie od obsługi danych plików cookie.
Ulepszone zarządzanie sesjami. Zarządzanie sesją zawsze było klasą statyczną w CakePHP, co okazało się problematyczne na wiele sposobów. W wersji 3 możesz teraz uzyskać dostęp do sesji z obiektu żądania
$this->request->session(). Ta zmiana ułatwia również testowanie sesji i umożliwia CakePHP korzystanie z PHPUnit 4.x.Poprawiona spójność konwencji. Szkielet aplikacji i szkielety wtyczek zostały zaktualizowane, aby używać tej samej struktury katalogów, aby były bardziej spójne ze sobą.
Połączono motywy i wtyczki. Kluczowym celem CakePHP 3 było uczynienie motywów potężniejszymi i solidniejszymi. Dążąc do tego celu, stało się jasne, że tak naprawdę potrzebne jest, aby motywy zapewniały te same możliwości, co wtyczki. W związku z tym każda wtyczka może być teraz używana jako motyw, co również upraszcza pakowanie i redystrybucję.
Ulepszenia ORM. W ORM (mapowanie obiektowo-relacyjne) wprowadzono kilka zmian API. Przede wszystkim łatwiej jest teraz określić głębokie skojarzenia dla operacji zapisywania, a kilka konwencji zostało zmienionych, aby zmniejszyć krzywą uczenia się i zamieszanie wśród nowych użytkowników.
Ponadto planuje się wprowadzenie kilku dodatkowych funkcji w wersji beta wersji 3.0. Najważniejsze:
- Ulepszenia funkcji internacjonalizacji i lokalizacji (i18n i L10n)
- Zamiennik CacheHelper oparty na Edge Side obejmuje
- Nowy interfejs API routingu zapewniający prostszą i szybszą deklarację tras
Rzeczywiście, wersja 3 reprezentuje znaczące ulepszenie w stosunku do poprzednich wersji CakePHP.
Dlaczego CakePHP?
Chociaż CakePHP ma wiele wspaniałych funkcji, ta recenzja skupia się na kilku w szczególności, które naprawdę pomagają go wyróżnić, a mianowicie:
- Konwencja nad konfiguracją
- ORM CakePHP (mapowanie obiektowo-relacyjne)
- Komponenty i pomocnicy
Konwencja nad konfiguracją
CakePHP zawsze koncentrowało się na szybkim i konsekwentnym rozwoju i pod tym względem CakePHP kładzie duży nacisk na konwencję. Dlatego, podobnie jak Ruby on Rails (z którego CakePHP czerpał wiele inspiracji), CakePHP mocno trzyma się zasady konwencji nad konfiguracją.
Konwencje oznaczają, że programista nie musi myśleć o tym, „gdzie się coś dzieje”, kiedy uczy się korzystania z frameworka CakePHP, ponieważ wartości domyślne dla tych reguł są już wprowadzone. Chociaż trzeba zaznajomić się z konwencjami CakePHP, po opanowaniu, programista może skoncentrować się na rozwoju rdzenia, zamiast martwić się o to, gdzie jest umieszczony kod i inne problemy z konfiguracją.
Konwencje CakePHP są w wyraźnym kontraście do samego PHP, który jest dość liberalnym językiem. W wyniku swoich konwencji CakePHP pomaga zapewnić większą spójność stylu i struktury kodowania u wielu programistów, a nawet w wielu zespołach. Przyjmując standardowy zestaw konwencji, Cake dąży do tego, aby programowanie było bardziej spójne.
Na przykład w przypadku schematu bazy danych CakePHP przyjmuje pewne domyślne założenia dotyczące tego, jak zostaną nazwane określone zmienne, nazwy tabel i pola. W szczególności Cake oczekuje, że:
- Nazwy tabel będą w liczbie mnogiej (np.
orders) - Nazwa pola klucza podstawowego będzie
id - Nazwy wszelkich pól kluczy obcych będą oparte na nazwie tabeli, do której odwołuje się odwołanie, po której następuje
_id(np. klucz obcy do tabelicustomersmiałby nazwęcustomer_id).
Aby to zilustrować, rozważmy prosty przegląd dwóch tabel ( articles i users ) z bazy danych postów na blogu. W naszym przykładzie powiemy, że Articles „BelongsTo” a Users , a Users „ Articles ” . Te relacje zostałyby określone w następujący sposób w CakePHP 3.0:
In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users'); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles'); } } CakePHP przyjmuje domyślne konwencje i dzięki temu automatycznie wie, jakich kluczy obcych szukać (np. user_id w tabeli articles ) podczas pobierania skojarzeń.
Należy jednak podkreślić, że CakePHP 3 pozwala na łatwe nadpisanie domyślnych konwencji. Załóżmy na przykład, że nasz klucz obcy w tabeli users został nazwany author_id zamiast user_id . Określenie tego wymagałoby tylko dwóch małych zmian w naszym kodzie, aby dać CakePHP znać, że nie używamy wartości domyślnej:
In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users' => ['foreignKey' => 'author_id']); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles' => ['foreignKey' => 'author_id']); } }Tak więc, chociaż konwencje są rzeczywiście integralną częścią CakePHP i zdecydowanie mają swoje zalety, ich zastępowanie w razie potrzeby jest naprawdę dość proste, jak pokazaliśmy tutaj.
Podczas gdy niektórzy programiści mogą preferować frameworki PHP (takie jak Yii i Laravel), które nie opierają się tak bardzo na konwencjach, konwencje CakePHP mogą w rzeczywistości być całkiem korzystne. Mogą one pomóc radykalnie skrócić czas rozruchu dla programisty CakePHP, gdy ma za zadanie ulepszać lub utrzymywać kod napisany przez innego programistę, ponieważ skutkują one spójną strukturą kodowania i konwencjami dla wielu programistów i projektów CakePHP.
Mapowanie obiektowo-relacyjne CakePHP (ORM)
Mapowanie obiektowo-relacyjne (ORM) w CakePHP czerpie wiele korzyści z ramowych konwencji CakePHP. Określając schemat bazy danych zgodnie ze standardami Cake, możesz szybko połączyć ze sobą tabele za pomocą potężnego ORM Cake. Rzadko będziesz musiał napisać instrukcję SQL, ponieważ CakePHP z łatwością obsługuje takie rzeczy jak łączenie tabel, hasMany , a nawet hasAndBelongsToMany .

Wykorzystując ContainableBehavior CakePHP , poprzez powiązania modelu możesz określić, które tabele bazy danych i pola wybrać z zapytania SQL. Może to zająć kilka tabel, a dzięki ORM można łatwo szybko konstruować bardzo złożone instrukcje SQL.
Nawiasem mówiąc, ContainableBehavior CakePHP jest doskonałym przykładem tego, jak CakePHP może uprościć i usprawnić rozwój PHP. Pomaga wyszukiwać i filtrować dane w czysty i spójny sposób, a także może pomóc w zwiększeniu szybkości i ogólnej wydajności aplikacji. (Działa, zmieniając tymczasowo lub na stałe skojarzenia modeli, używając dostarczonych ograniczeń do wygenerowania odpowiedniej serii bindModel i unbindModel .)
Wyzwanie związane z ORM polega na tym, że korzystanie z SQL jest tak proste, że jeśli programista nie jest ostrożny, może pisać nieefektywne zapytania SQL bez zastanowienia. Z pewnością wiele razy widziałem słabo napisane aplikacje Cake, które nie usprawniły swoich zapytań. Problemy te pojawiają się zwykle kilka lat po wdrożeniu systemu, gdy bazy danych stają się większe, a źle napisane zapytania stają się coraz wolniejsze.
Głównym problemem jest to, że przed najnowszą wersją CakePHP 3, ORM Cake domyślnie pobierał wszystkie powiązane tabele podczas wykonywania zapytania. W rezultacie proste zapytanie „znajdź wszystko” może potencjalnie stać się dość rozdęte, ponieważ bazowy kod SQL pobierałby wszystkie dane ze wszystkich powiązanych tabel. W wersji 3 to zachowanie nie jest już domyślne. (W poprzednich wersjach CakePHP to domyślne zachowanie można łatwo wyłączyć, po prostu dodając public $recursive = -1; do głównego pliku AppModel.php ).
Ogólnie rzecz biorąc, przegląd ORM Cake pokazuje, że naprawdę pomaga usprawnić rozwój i, jeśli jest używany poprawnie, jest niesamowitym narzędziem do szybkiego tworzenia złożonych zapytań. Niemniej jednak ważne jest, aby programiści poświęcili czas na pełne zrozumienie ORM i upewnienie się, że ich zapytania są odpowiednio zoptymalizowane (tak jak w każdym języku).
Komponenty i pomocniki: Biblioteki CakePHP
Jedną ze wspaniałych funkcji CakePHP są wbudowane biblioteki – Components i Helpers – które eliminują wiele nudnych, powtarzalnych i żmudnych zadań programistycznych. W kontekście MVC komponenty pomagają usprawnić rozwój kontrolerów, podczas gdy pomocnicy upraszczają kodowanie widoku i logikę (tj. warstwę prezentacji).
Na przykład PaginatorComponent automatycznie tworzy interfejs następnej/poprzedniej strony na podstawie zapytania wyszukiwania. Dodaj JsHelper i nagle masz AJAX Pagination, zasilany przez twój ulubiony framework JavaScript (domyślnie jQuery).
Szybki przykład innych przydatnych pomocników obejmuje:
-
TimeHelper: sprawia, że wyświetlanie dat i godzin jest proste, zapewniając zestaw funkcji do formatowania i oceny wartości czasu. -
NumberHelper: zapewnia wygodne metody wyświetlania liczb w różnych popularnych (lub dostosowanych) formatach i dokładnościach. -
TextHelper: pomaga w włączaniu linków, formatowaniu adresów URL, tworzeniu fragmentów tekstu wokół wybranych słów lub fraz, wyróżnianiu słów kluczowych w blokach tekstu i wdzięcznym skracaniu długich fragmentów tekstu.
A jest ich znacznie więcej.
Krytyka CakePHP 3
Oczywiście, każdy framework ma swoje wady i zalety, a CakePHP nie jest wyjątkiem. Oto niektóre z najczęstszych krytyki pod adresem CakePHP poza tą recenzją:
„Starsze ramy; wzdęty i powolny.” Ta krytyka jest zazwyczaj bardziej historyczna, z ograniczoną (jeśli w ogóle) prawdą dzisiaj. Obsługa wersji PHP już w PHP 4 historycznie wymagała, aby CakePHP radził sobie z wieloma problemami ze starszymi PHP. Wraz z dojrzewaniem PHP, aw szczególności wydaniem CakePHP w wersji 3, zarzut ten naprawdę stracił na aktualności.
“Zbyt surowe i ograniczające.” Chociaż istnieją wyraźne zalety konwencji CakePHP, są jednak tacy, którzy je krytykują. Krytycy często twierdzą, że konwencje są zbyt surowe, ale nie rozpoznają (ani nie przyznają), że te konwencje można łatwo ominąć. Przyjmując standardowy zestaw konwencji, Cake stara się zapewnić spójność programowania, co biorąc pod uwagę luźne praktyki kodowania PHP, powinno być postrzegane tylko jako pozytywna rzecz.
„Cykl powolnego uwalniania”. Powolny cykl wydawniczy niekoniecznie jest zły. Wręcz przeciwnie, zbyt agresywny cykl wydawniczy może w rzeczywistości być bardziej problematyczny. W rzeczywistości, jednym z powodów, dla których główne wydania CakePHP zabierają dużo czasu, jest zapewnienie wstecznej kompatybilności z wcześniejszymi wersjami PHP, które wciąż są szeroko wdrażane. Co więcej, ten konserwatywny cykl wydawniczy i nacisk na kompatybilność wsteczną eliminuje potrzebę poważnych (i częstych) zmian w kodzie, gdy zostaną wydane nowe wersje. Należy również zauważyć, że zespół CakePHP 3 nie jest powolny, jeśli chodzi o drobne wydania (poprawki błędów, łatki, drobne ulepszenia itp.), które są wydawane co miesiąc . Podobnie, odpowiedź na większość zgłoszeń błędów następuje w ciągu kilku godzin od ich opublikowania.
„Nie jest to rozwiązanie nieszablonowe”. W przeciwieństwie do wielu innych nowoczesnych frameworków PHP typu „aplikacja internetowa po wyjęciu z pudełka” (takich jak na przykład Yii), CakePHP celowo wspiera i umożliwia niestandardowe rozwiązania. Osobiście bardzo skorzystałem na tym, tworząc wiele dużych, niestandardowych witryn internetowych i aplikacji opartych na bazach danych.
„Używa tablic danych, a nie obiektów”. Nie jest to już prawdą, począwszy od wersji 3. W poprzednich wersjach wszelkie dane musiały być przechowywane i odwoływane jako tablice zagnieżdżone (np.
$user['User']['username']). CakePHP 3 w końcu rozwiązuje ten problem, zamiast tego przechowując dane jako obiekty (np.$user->username).„Słaba dokumentacja”. Istnieje pewna zasadność tej krytyki, ponieważ dokumentacja CakePHP nie zawsze wydaje się być napisana z myślą o początkującym (ważne informacje są czasami omawiane tylko w zdaniu lub dwóch, podczas gdy kilka akapitów dyskusji byłoby prawdopodobnie uzasadnionych ). Zespół programistów Cake jest tego świadomy i pracuje nad odpowiednim ulepszeniem dokumentacji. W rzeczywistości strona główna dokumentacji CakePHP 3 wyraźnie określa wysoki poziom zaangażowania w „jakość, ważność i dokładność” dokumentacji. Ponieważ CakePHP jest frameworkiem opartym na społeczności, przycisk „Ulepsz ten dokument” znajduje się na każdej stronie dokumentacji, umożliwiając i zachęcając użytkowników CakePHP do wnoszenia własnych dodatków, usunięć lub poprawek do dokumentacji.
Wniosek
Podsumowując, prawie 10 lat po pierwszym wydaniu, przegląd CakePHP ujawnia, że pozostaje on żywym i groźnym konkurentem dla wielu innych frameworków PHP, które od tego czasu się pojawiły.
CakePHP to kompletne i kompleksowe rozwiązanie programistyczne. Baza kodu jest dojrzała, a funkcjonalność wydaje się nieskończona. Ogólnie rzecz biorąc, Cake został stworzony, aby przyspieszyć rozwój, co jest ważne nie tylko dla twórców oprogramowania, ale także dla inwestorów. Największym kosztem rozwoju oprogramowania jest koszt czasu rozwoju, a CakePHP ma na celu znaczne skrócenie czasu rozwoju.
CakePHP to projekt prowadzony przez społeczność. Może się tylko polepszyć, gdy zaangażuje się coraz więcej osób. Będąc zaangażowanym przez 7 lat i obserwując, jak społeczność się rozwija, jestem podekscytowany kolejnym etapem CakePHP. Wprowadzenie CakePHP 3 oraz dojrzałość zarówno PHP, jak i CakePHP oznacza, że framework będzie się stawał coraz lepszy.
Jeśli szukasz rozwiązania opartego na PHP, które oferuje wiele korzyści podobnych do Ruby on Rails (pod względem łatwości użytkowania i konwencji w porównaniu z konfiguracją), daj się zawirować w CakePHP. Samouczek blogu CakePHP zajmuje tylko kilka minut, aby skonfigurować i uruchomić, lub alternatywnie, CakeCoded oferuje serię jasnych lekcji, które pomogą zaznajomić programistę PHP z CakePHP i zacząć z niego korzystać. Dzięki tym zasobom szybko zobaczysz, w jakim stopniu CakePHP może przyspieszyć i ulepszyć twoje wysiłki w zakresie rozwoju oprogramowania PHP. Cieszyć się!
Michael Houghton jest inżynierem Toptal z Irlandii z dużym doświadczeniem w CakePHP. Stworzył ponad 100 stron internetowych z frameworkiem, pracował z zespołem CakeDC (podmiot komercyjny odpowiedzialny za framework CakePHP), przesłał różne łatki i pomógł w dokumentacji CakePHP.
