Přejít k navigační liště

Zdroják » PHP » Symfony po krůčkách – oblékáme MicroKernel

Symfony po krůčkách – oblékáme MicroKernel

Články PHP

V dnešním díle seriálu Symfony po krůčkách budeme pokračovat MicroKernelem. Oblékneme ho do Symfony struktury a zhotovíme si jednoduchý web o třech stránkách. Navíc si ukážeme i Twig – rychlý, jednoduchý a bezpečný šablonovací nástroj od tvůrců Symfony.

Tento text je pokračováním článku Symfony po krůčkách – MicroKernel.

Připrav se na plné Symfony

Symfony MicroKernel můžeš používat skoro v libovolné adresářové struktuře. Chceš-li ale být připravený na to, že tvůj projekt může narůst tak, že budeš chtít přejít na klasické Symfony, měl bys rovnou používat doporučenou adresářovou strukturu:

  • app/ – Konfigurace, šablony, překlady,
  • bin/ – Spustitelné soubory (např. konzole),
  • src/ – Kód naší aplikace (zejména “bundly”),
  • tests/ – Testy,
  • var/ – Dočasné soubory (cache, logy); pro účely dema používáme systémovou tmp složku (viz metody getCacheDir a getLogDir ve třídě MicroKernel),
  • vendor/ – Knihovny třetích stran,
  • web/ – Kořenová složka našeho webu (frontend).

Podívej se na zdrojáky na GitHubu.

Oproti minulému článku si do composer.json přidáme ještě FrameworExtraBundle.

composer require sensio/framework-extra-bundle

Konfigurace

Konfiguraci řešíme přes YAMLy, které máme dva – config_prod.yml pro produkci a config_dev.yml pro náš lokální vývoj. Co není v nich, to se načte z defaultního config.yml. Aby nám full stack fungoval, museli jsme do configu přidat secret, povolit assets a říct Symfony, že chceme používat Twig. To je minimum, abychom to celé rozhýbali.

framework:
    secret: ThisTokenIsNotSoSecretChangeIt
    assets: ~
    templating:
    engines: ['twig']

Mimochodem o YAMLu na Zdrojáku nedávno vyšel pěkný článek.

MicroKernel

Do našeho předešlého kernelu jsme přidali:

  • SensioFrameworkExtraBundle využijeme poporu anotací,
  • TwigBundle – aby nám fungovaly šablony,
  • AppBundle – náš výchozí bundle.

Frontend

Na frontendu máme klasicky dva endpointy, app.php pro produkci a app_dev.php, které funguje jen na localhostu (to lze samozřejmě upravit). Aby nám app.php fungovalo, přidali jsme .htaccess.

Pár tipů pro začátečníky v nesnázích

  • Nastav oprávnění pro zápis do složky s cachí a logy (pokud nepoužíváš systémovou tmp složku, která je v tomto článku demonstrována).
  • Nainstaluj balíčky composeru composer install
  • Nainstaluj assets (tohle není důležité, ale pokud je nenainstaluješ, uvidíš škaredé chybové hlášky, protože obrázky a styly z bundlů, které instalujeme přes Composer, nebudou ve složce web/bundles) php bin/console assets:install


Bez nainstalovaných assets.

Symfony chyba (s nainstalovanymi assets)
S nainstalovanými assets.

Udělejme si web

Teď už máme vše potřebné k tomu, abychom si udělali nějaký užitečný web, třeba s úvodní stránkou, kontaktem a informací o východu a zapádu Slunce.

Ve složce src/AppBundle/Controller si vytvoříme soubor DefaultController.php, ten bude obsahovat všechny tři zmíněné stránky (akce) včetně jejich URL adresy.

Homepage, Kontakt

Homepage obslouží metoda indexAction, ve které máme dvě anotace:

  • @Route(path="/", name="homepage")
    path – jakou cestu stránka má (můžeme vynechat a napsat jen “/” místo path=”/”)
    name – název dané cesty (parametr není povinný, ale pro vykreslování menu se nám bude hodit)
  • @Template("AppBundle:Default:index.html.twig")
    Anotace říká, jaká šablona se má použít, v našem případě tedy index.html.twig. Pokud je název souboru (index) shodný s názvem akce (index), pak můžeme anotovat jen jako @Template()

Metoda indexAction vrací prázdné pole, protože šabloně nechceme předat žádné proměnné. Kdybychom parametr return vynechali, Symfony by vyvolalo výjimku.

Kontakt funguje obdobně.

Východ a západ Slunce

@Route("/vychod-a-zapad-slunce/{when}", name="sunrise_and_sunset", defaults={"when"="0"}, requirements={"when"="\d+"})

V definici vidíme, že přibyl parametr “when”, který má výchozí hodnotu 0 a může to být číslo (regulární výraz “\d+”). Možné URL jsou pak tyto:

  • /vychod-a-zapad-slunce (when bude mít hodnotu 0),
  • /vychod-a-zapad-slunce/1 (when bude mít hodnotu 1),
  • /vychod-a-zapad-slunce/2 (when bude mít hodnotu 2) atd.

Cesta /vychod-a-zapad-slunce/mars by už neprošla, protože “mars” není číslo.

V akci počítáme, kdy v Praze vyjde a zapadne Slunce, což si zde vysvětlovat nebudeme. Nás bude ale zajímat return, ve kterém vidíme, že do šablony sunriseAndSunset.html.twig předáváme tři hodnoty, přičemž první dvě jsou textové a ta poslední je \DateTime objekt.

Twig

Když máme logiku kontrolerů hotovou, je čas podívat se na šablony. Layout jsme nadefinovali v souboru layout.html.twig, kde máme i menu. Odkazy jsme vygenerovali pomocí helperu “path”, který nám vrátí odkazy dle nastavených anotací.

Na stránce také používáme proměnnou “title”, ve které je název stránky a blok “content”, kde bude náš obsah.

{#src/AppBundle/Resources/views/Layout/layout.html.twig#}
<!DOCTYPE html>
<html lang="cs">
<head>
    <meta charset="utf-8">
    <title>{{ title }}</title>
</head>
<body>

<h1>MicroWeb</h1>

<p>Menu:</p>

<ul>
    <li><a href="{{ path('homepage') }}">Homepage</a></li>
    <li><a href="{{ path('sunrise_and_sunset') }}">Východ a západ Slunce</a></li>
    <li><a href="{{ path('contact') }}">Kontakt</a></li>
</ul>

<h2>{{ title }}</h2>

{% block content %}
{% endblock %}

</body>
</html>

Renderování jednotlivých stránek probíhá nějak takto:

{#src/AppBundle/Resources/views/Default/sunriseAndSunset.html.twig#}
{% extends "AppBundle:Layout:layout.html.twig" %}
{% set title = "Východ a západ Slunce" %}

{% block content %}
    <p>
        Dne {{ date|date("d.m.Y") }} v Praze Slunce vychází v {{ sunrise }} a zapadá v {{ sunset }}.
    </p>
    <ul>
        <li><a href="{{ path('sunrise_and_sunset', {'when': '0'}) }}">dnes</a></li>
        <li><a href="{{ path('sunrise_and_sunset', {'when': '1'}) }}">zítra</a></li>
        <li><a href="{{ path('sunrise_and_sunset', {'when': '2'}) }}">pozítří</a></li>
    </ul>
{% endblock content %}

Symfony MicroWeb

A jsi zase o krok dál

Teď už víš, jak jednoduše to může fungovat, a to je jen kousek toho, co Symfony nabízí. Navíc jsou ochutnal(a) i Twig, což je báječný pomocník.

Neboj se udělat git clone https://github.com/Symfonisti/micro-kernel.git a hrát si. Symfony tě bude bavit jako mě :)

Komentáře

Odebírat
Upozornit na
guest
0 Komentářů
Nejstarší
Nejnovější Most Voted
Inline Feedbacks
Zobrazit všechny komentáře

Přístupnost není jen o splnění norem: nový pohled na inkluzivní design

Přístupnost a inkluze možná nepatří mezi nejžhavější témata digitálního světa – dokud o nich nezačne mluvit Vitaly Friedman. Na WebExpo 2024 předvedl, že inkluzivní design není jen o splněných checkboxech, ale hlavně o lidech. S energií sobě vlastní obrátil zažité přístupy naruby a ukázal, že skutečně přístupný web je nejen možný, ale i nezbytný.

Efektivnější vývoj UI nebo API: Co si odnést z WebExpo 2025?

Různé
Komentáře: 0
Jak snadno implementovat moderní uživatelské rozhraní? Které funkce brzdí rychlost vašeho webu? A kdy raději sami přibrzdit, abychom využitím AI nepřekročili etické principy? Debatu aktuálních dev témat rozdmýchá sedmnáctý ročník technologické konference WebExpo, která proběhne v Praze od 28. do 30. května. Který talk či workshop si rozhodně nenechat ujít? Toto je náš redakční výběr z vývojářských hroznů.

Zapřáhněte AI jako nikdy předtím. Květnová konference WebExpo přivítá hvězdy technologického světa

Od 28. do 30. května 2025 promění pražský Palác Lucerna na tři dny technologická konference WebExpo. Na programu je více než 80 přednášek a workshopů od expertů z celého světa. WebExpo tradičně propojuje vývojáře, designéry, marketéry i byznysové lídry a nabízí praktické dovednosti, strategické myšlení a přináší nejnovější trendy nejen v oblasti AI.