| 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 MainControlleru (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: 6 let
|
|||
0