Díky za další díl článku, a opět textový, paráda :-)
Přijde mi, že v první polovině v podstatě jen neortodoxně popisujete Loose Coupling (neboli "mikroservicy v jednom procesu") a MVC (controller zprostředkovává rozhraní s HTTP/CLI/okolním světem a model je ta, jak vy říkáte "business logika").
Mít jednotlivé části stránky mountovatelné na libovolný prefix, aniž by to musel řešit sám controller, je super věc, která mi třeba v Symfony docela chybí. V mém neexistujícím frameworku, který už mezitím trochu existuje ( https://github.com/kostislav/unicorn-todolist/ ), je tohle taky jedna ze základních vlastností.
Ale to routování a controllery mi v Jetu pořád přijdou jako spousta zbytečné práce navíc. Controller, který zobrazuje článek dle URL, by v mém ideálním světě prostě měl vypadat nějak takhle:
class ArticleController { public function __construct( private readonly ArticleRepository $articleRepository ) { } @GET("/{id}") public function showArticle(string $id): Response { $article = $this->articleRepository->getArticleByUrl($id); if ($article === null) { throw new NotFoundException(); } else { return Response::template('article', [ 'article' => $article ]); } } }
Nemá smysl se tvářit, že akce controlleru jsou vyvolané něčím jiným než HTTP požadavkem, controller je přesně rozhraní mezi HTTP a zbytkem aplikace, kde jinde než tady by se mělo řešit HTTP?
(A všechen ten mutable global state, který Jet vyžaduje, mě trochu děsí - http://misko.hevery.com/code-reviewers-guide/flaw-brittle-global-state-singletons/ )
P.S. Jaký je vlastně důvod pro velice svérázné použití namespaců ve stylu Jet\MVC_Controller_Router? Je to pouze z historických důvodů? Pokud byste někdy chtěl Jet distribuovat jako Composer balík, tak tohle možná bude trochu problém.
Rozdrobenost projektu na desítky nebo stovky namespaces, kdy potom existuje 15 tříd s generickými nejednoznačnými názvy ala "Client", "Request", "Response", "Adapter", "Manager", "Repository", "Factory" apod. v různých namespacech je do značné míry specifická pro PHP a často otravná - zejména když se smíchá mnoho composer balíků třetích stran dohromady (aka najít ten správný "Client" v seznamu mnoha namespace). Zvolená konvence je podle mě pragmatická - třídy nekolidují s cizími knihovnami (účel namespace), schizofrenie generických názvů tříd fakticky neumožňuje a zároveň jednoznačně určuje členění kódu do složek.
Můžete se zkusit nechat inspirovat zde: https://phpfashion.com/best-practices-pro-jmenne-prostory-v-php
Autor zvažoval podobná kritéria.
To je obecný problém - nejednoznačnost/nesrozumitelnost pojmenování čehokoli.
Ad článek - připadá mi, že bod 4 je tam částečně v rozporu s bodem 1 a hlavně jeho důsledek je ve větších projektech značný a zbytečný "voser".
"místo Nette\Http\HttpRequest raději Nette\Http\Request" - v praxi - chci vytvořit HTTP request. Pokud by se třída jmenovala "HttpRequest" (nebo "Http_Request"), vyskočí mi při psaní "new HttpR" buď okamžitě nebo budou vedle jasně odlišitelné položky (HttpResponse například) - potvrdím, IDE udělá import a mám hotovo. Pokud začnu psát "new Req", vyskočí mi všechny requesty ze všech NS (a všech composer balíků) a hledám, který je asi ten správný. Následně IDE udělá autoimport. Abych dostal kód do tvaru dle autora článku, musím se vrátit na začátek souboru, dohledat, kde se provádí import, ručně ho upravit (zkrátit), vrátit se zpátky na původní místo a ručně připsat poslední fragment namespace. A takto na to musím myslet já i každý člen týmu při každém pokusu o import. Pro tým je třeba samozřejmě nějak srozumitelně definovat pravidla, kdy dělat import a kdy řešit import z částečného namespace - každý člověk bude mít jiný cit pro to, co považuje za již srozumitelné a co ne.
Plus - u composer balíků třetích stran (a jejich composer dependencies a jejich composer dependecies ....) si jmenné konvence stejně vybírat nelze a generické "Request" třídy se začnou množit jak houby po dešti. :-)
Přečteno 20 820×
Přečteno 18 683×
Přečteno 17 863×
Přečteno 17 614×
Přečteno 16 351×