Autor | Zpráva | ||
---|---|---|---|
quatzael Profil |
#1 · Zasláno: 24. 8. 2020, 15:15:27
Ahoj, začínám se Symfony a nikde jsem moc nenašel jak organizovat logickou strukturu vlastního kódu.
Mám soubor MainController.php , který zajišťuje veškeré routování. V tutoriálech a návodech je všude ukázáno, jak se od začátku až do konce (od requestu až po response) všechno píše do jedné odpovídající metody MainControlleru jako zde:
/** * @Route("/", name="homepage") * Method({"GET", "POST"}) */ public function homepage(Request $request) { // vlastní kód (od requestu až po response) } Protože tam potřebuju napsat větší množství kódu, je nějaká zažitá praxe (fungující) jak některé části napsat v samostatných skriptech? Chtěl jsem použít klasické include , ale z nějakého důvodu v něm nefungují proměnné z metody homepage (v tomto případě)..
Existuje nějaká běžná praxe? Je možné v symfony mít části scriptu psané i procedurálně nebo musí být vše striktně objektově? Děkuji za odpověď. |
||
Firibix Profil |
#2 · Zasláno: 24. 8. 2020, 20:32:22
Reakce na quatzaela:
„Mám soubor MainController.php , který zajišťuje veškeré routování.“
Pokud máš opravdu všechny routy naskládané v MainController u (a tvůj web má více jak tři stránky), doporučuji ho rozdělit na několik controllerů podle jejich funkce, například:
• HomepageController – hlavní stránka
• ArticleController – seznam článků a detail článku
• SearchController – vyhledávání
A tak dále. „je nějaká zažitá praxe (fungující) jak některé části napsat v samostatných skriptech?“ Ano, požadovanou funkcionalitu zabalíš do objektu a s ním teprve budeš pracovat v controlleru. Například pokud bys měl ArticleController a chtěl bys v něm převádět BB kódy na HTML, vytvoříš třídu BbToHtmlTransformer a do ní umístíš požadovanou funkcionalitu:
namespace App\BbCode; class BbToHtmlTransformer { public function __construct() { } public function toHtml(string $bbText) : string { $html = preg_replace('/\[(\/?)([a-z]+)\]/', '<${1}${2}>', $bbText); // … return $html; } } Kód třídy uložíš do src/BbCode/BbToHtmlTransformer.php a pak ji můžeš použít v controlleru (a jako bonus i kdekoliv jinde):
namespace App\Controller; use Symfony\Component\HttpFoundation\Response; use App\BbCode\BbToHtmlTransformer; class ArticleController { /** … */ public function article(int $id, BbToHtmlTransformer $bb) : Response { $text = // … $html = $bb->toHtml($text); return $this->render('article.html.twig', ['html' => $html]); } } Díky tomu, že třída je uložená ve složce src/BbCode a má nastavený namespace App\BbCode , ji Symfony (za použití Composer autoloadingu) automaticky najde a metodě article předá v proměnné $bb její instanci (tomu se v Symfony říká autowiring nebo obecněji pak dependency injection).
V Symfony dokumentaci tomuto principu říkají services a mají to také popsané. |
||
quatzael Profil |
#3 · Zasláno: 24. 8. 2020, 23:42:24
Firibix:
Supr, díky moc. Perfektně vysvětleno! Přesně tohle jsem potřeboval vědět. |
||
Kcko Profil |
#4 · Zasláno: 25. 8. 2020, 12:09:16
quatzael:
Proč nezkusíš Nette? |
||
quatzael Profil |
#5 · Zasláno: 25. 8. 2020, 12:33:08
Kcko:
Když už jít do nějakého PHP frameworku, tak ideálně do nějakého kvalitního, rozšířeného, a u kterého je pravděpodobnost, že bude relevantní i za 10 let.. |
||
breeta Profil |
Kcko:
V Nette by tohle ale taky řešil :-) quatzael: Nemyslím si že Nette je nějak méně kvalitní, já jsem ho používal spoustu let ale nakonec přešel k Symfony, které je pro mě jednodušší na používání a hlavně rychlejší psaní. Záleží co tobě vyhovuje ... |
||
Časová prodleva: 4 roky
|
0