Komentáře k článku

Symfony po krůčkách – Twig

V dnešním díle si představíme výchozí symfoňácký šablonovací systém – Twig, který nám umožňuje krásně oddělit aplikační vrstvu od prezentační. Díky šablonám nemusíte (a ve Twigu ani nemůžete) míchat PHP a HTML kód. Další výhodou Twigu je bezesporu zvýšení bezpečnosti vaší aplikace za pomocí automatického escapování obsahu proměnných.

Zpět na článek

33 komentářů k článku Symfony po krůčkách – Twig:

  1. Jarda

    Díky šablonám nemusíte (a ve Twigu ani nemůžete) míchat PHP a HTML kód.

    Proč je to výhoda? Přijde mi, že jste jenom nahradili jeden programovací jazyk jiným. Místo abyste míchali PHP a HTML mícháte HTML a Twig.

    1. hatto

      Re:
      zopar vyhod:

      1. templaty su ovela prehladnejsie nakolko syntax je adaptovana pre html
      2. vela veci co treba riesit v php na par riadkov su v twigu nativne
      3. spominana dedicnost je asi najvacsia vyhoda
      4. include inych templatov
      5. nativne filtre a funkcie
        atd atd

      twig pouzivame nie len v symfony projektoch, ale takisto pre staticke webstranky ci newslettre (pomocou php compilacie alebo gulp-twig). v podstate okrem drupal7 php na front-ent nepouzivame.

      wordpress projekty bez twig (plugin timber) uz nerobim, oddeli sa ‚fuknkcna‘ cast kodu od templatu a do twig templatu uz posielam pripravene premenne a tak mam nieco v zmysle ‚VC‘

      aj drupal 8 uz konecne podporuje twig.

      odporucam vyskusat a urobit si vlastny nazor, ale zatial nepoznam nikoho, kto by radsej miesal ‚php a html‘ :)

    2. Lukáš Brzák

      Re: Jarda
      Výhoda je, že všichni krom programátora se v šabloně krásně vyznají a ví, že cokoli v blocích {% %}, {{ }} nemají upravovat ;-)

  2. rapemer

    Re:
    Jednoduše proto, že míchání kódu do šablon smrdí několika problémy. Nejdůležitější je čitelnost šablon pro kodéry, kteří cokoli v {% %}, {{ }} a {# #} jednoduše ignorují.

  3. Lukáš Brzák

    Rozšiřování Twigu
    Chápu, že je článek zaměřen pro začátečníky. Nicméně je třeba dodat, že si můžeme Twig opravdu jednoduše rozšiřovat o jakékoli vlastní funkce. Vím, že spousta lidí toto potřebuje, je zvyklá na vlastní funkce (např. ve Smarty apod.) Viz dokumentace.

    Výhodou Twigu zabudovaného uvnitř Symfony je, že nemusíte nic nastavovat a z Controlleru rovnou voláte metodu render() takto:

    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    
    class MyController extends Controller
    {
        public function helloWorldAction()
        {
            return $this->render('layout.html.twig', [
                'cosi' => 'hodnota',
            ]);
        }
    }
    

    Případně můžeme metodu Controlleru nastavovat pomocí anotací:

    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    
    class MyController extends Controller
    {
        /**
         * @Template("AppBundle:Frontend:layout.html.twig")
         */
        public function showAction($id)
        {
            return [
                'cosi' => 'hodnota'
            ];
        }
    }
    

    Pro více informací o anotacích v Symfony najdete v dokumentaci…

    1. Rostislav VítekAutor příspěvku

      Re: Rozšiřování Twigu
      Trošku spoiler do příštího dílu, viz poslední odstavec v článku :) Tady šlo o to představit Twig jako samostatnou komponentu. Ale každopádně díky za komentáře.

    1. Taco

      Re:
      Jmenuje se to latte. A zajímalo by mě v čem vidíte, že je zápis twigu lepší? Zatím vidím zásadnější výhodu twigu v tom, že neumožňuje eval. Jinak umí cca to samé co latte. A zdá se, že i kontextové escapování (což byla až do nedávna unikátní feature pouze latte).

      1. Rostislav VítekAutor příspěvku

        Re:
        No Twig nemá automatické kontextové escapování, ale upřímně, jak často to člověk využije? Mi nechybělo za rok a půl práce s Twigem ani jednou :) Syntax Twigu se mi dostala pod kůži prakticky okamžitě a přijde mi přehlednější než syntax Latte, ale to je čistě můj subjektivní názor.

        1. Taco

          Re:

          No Twig nemá automatické kontextové escapování, ale upřímně, jak často to člověk využije?

          Ehm, vždycky?! Zvláště pokud děláte v html, a čtete Špačka?

          1. Rostislav VítekAutor příspěvku

            Re:
            Jasné, já měl na mysli, že v drtivé většině případů si vystačím s výchozím HTML escapováním. Pokud potřebuji escapovat jiným způsobem, musím to prostě Twigu říct :)

          2. Miroslav Šustek

            Re:
            Twig podporuje nastavení 'autoescape' => 'filename' (namísto standardního 'html') – viz http://twig.sensiolabs.org/doc/api.html#environment-options.

            Pak autoescapuje v každém souboru podle jeho přípony. Takže template.html.twig escapuje jako HTML, template.css.twig jako CSS atd.

            Pokud nepotřebujete míchat více jazyků v jedné šabloně, tak se bez kontextového escapování, jako je v Latte, obejdete.

            1. Taco

              Re:
              Ach jo, to jsou pořád argumenty…

              Ve výsledku se obejdu bez spousty věcí, vždycky to můžu psá v čistém php.

        2. takyhonza

          Re:
          :D :D :D :D tohle pobavilo :D :D :D :D

          Ne, teď vážně. Pokud šablonovací systém neumí automatické kontextové escapování a kontexty tudíž musím escapovat ručně, tak je mi takový šablonovací systém popravdě řečeno úplně k ničemu. To můžu psát šablony rovnou v čistém PHP (a naučit kodéry, že na kód mezi <?php a ?> se nesahá ;)) a nepotřebuji k tomu instalovat a nastavovat zbytečně další knihovnu :)

          Sleduju tuhle sérii článků pravidelně a přestože si nemyslím, že by Symfony balíčky byly špatné, z toho co jsem viděl mi příjde, že místo praktičnosti z těch knihoven čiší nějaká překomplikovaná akademická čistota, či co. V případě Twigu je to vidět už jen na tom, že existují 2 syntaxe maker – jedna „vypisovací“ a druhá „akční“. Beru tyhle články jako zajímavé okénko, ale používat něco z představených balíků denně, to bych fakt nechtěl :)

          1. petrsoukup

            Re:
            Za ty roky s Twigem jsem ještě nenarazil na situaci, kde bych potřeboval automatické escapování.
            V drtivé většině si vystačím s defaultním html režimem (tzn vůbec to neřeším) a když náhodou potřebuju něco speciálního jako třeba atribut, tak to prostě výslovně uvedu (<a href="{{url|e('html_attr')}}">). Na druhou stranu mě ale nenapadá kód, který bych do atributu nemohl escapovat defaulním html režimem a způsobil by nějaký zásadní problém.

            Samozřejmě by bylo super, kdyby twig kontextové escapování měl. Je to ale důsledek toho, jak vůbec funguje. Neparsuje šablonu, takže kontext nezná. Zároveň ale díky tomu jde snadno použít na cokoliv a nejen HTML.

            Nad Twigem nicméně existuje ještě nadstavba Twital (https://github.com/goetas/twital). Tam už se šablona parsuje (a musí tedy být HTML5 validní), takže tam by kontextové escapování fungovalo.

            1. takyhonza

              Re:
              Jasně, výchozí HTML escapování dozajista stačí v celé řadě případů, ale běžně přecházím z jednoho kontextu do druhého tak často, že nechci myslet na to, že musím ručně přepnout kontext, aby se data vyescapovala správně. Pokud používám šablonovací engine, potřebuji a chci se spolehnout na to, že escapování vyřeší v 99% případů bez mého zásahu.

              I Latte se dá použít na cokoli a nejen HTML :)

          2. Nette fanboy

            Re:
            Fascinuje mě vyzdvihování kontextového escapování v latte a přitom nikdo nezmíní super featuru:

            {php echo $_SERVER['HTTP_HOST'];}
            <?php echo $_SERVER['HTTP_HOST']; ?>
            
            1. Taco

              Re:
              Zmínil. Jen je otázka, zda je to výhoda nebo nevýhoda latte – skutečnost, že toto nejde moc dobře zakázat (a nebo minimálně nevím jak).

    2. Pavel

      Re:
      Je to Latte a do html tagů nic spát nemusíš. Můžeš používat klasické makra místo n:makra. Někomu vyhovuje jedno a někomu to druhé.

  4. podhy

    sandbox
    Trochu mi tady chybí zmínka o velice silné vlastnosti, kterou je sandbox což např zde zmiňované Latte nemá (teda nemělo co jsem si o ně naposledy četl).

  5. Adam

    Zdravim,
    TWIG jsme pouzivali cca 2 roky na jednom vetsim projektu, ale po nejake dobe nas zacla brzdit doba kompilace sablon a hlavne nemoznost pouzivat sablony na strane klienta. Presli jsme tedy na React a jsme moc spokojeni. Produktivita je o nekolik levelu vyse a sablony muzeme pouzivat jak na strane serveru tak na strane klienta.

      1. Adam

        S twig.js mate pravdu, nicmene tato knihovna nepokryva veskerou funkcionalitu serverove verze, tudiz je temer nepouzitelna, to uz ani nezminuji tvorbu vlastnich rozsireni. Pokud bych chtel vytvorit TWIG rozsireni, musel bych jej vytvorit 2x, jednou pro PHP TWIG a jednou pro twig.js, coz mi neprijde zrovna efektivni. Pokud namisto TWIGu pouziji treba React.js, tak takovehle nesmyslnosti resit vubec nemusim, mam jednu knihovnu jak pro server side, tak pro client side.

        1. podhy

          Re:
          to je pravda. s tím musím souhlasit. nicméně twig.js už pokrývá značnou část twigu a je to aktuálně jen otázka času viz https://github.com/justjohn/twig.js/wiki/Implementation-Notes (navíc ten projekt je poměrně živej). Kolik reálně vlastních rozšíření do twigu potřebujete? Já v současné době mám jen dvě a i tak bych se bez nich obešel.
          U reactu člověk zase musí pořešit server rendering (teda já osobně bych ho určitě musel řešit) a to ve spojení s PHP taky není úplně nejtriviálnější.

    1. zvedavec

      Re:
      ako presne renderujes React na serveri?
      cez node.js alebo existuje dake napojenie na symfony? nieco ako nahrada napr twigu?

Napsat komentář

Tato diskuse je již příliš stará, pravděpodobně již vám nikdo neodpoví. Pokud se chcete na něco zeptat, použijte diskusní server Devel.cz

Zdroj: https://www.zdrojak.cz/?p=17870