Autor Zpráva
quatzael
Profil
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
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
Firibix:
Supr, díky moc. Perfektně vysvětleno! Přesně tohle jsem potřeboval vědět.
Kcko
Profil
quatzael:
Proč nezkusíš Nette?
quatzael
Profil
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 ...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0