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

Stav SIMD v Rustu v roce 2025

Různé
Komentáře: 0
SIMD - neboli Single Instruction, Multiple Data - znamená, že procesor může jednou instrukcí zpracovat více datových prvků najednou. Typicky to znamená, že místo sčítání dvou čísel přičtete dvě sady čísel paralelně. To může přinést výrazné zrychlení například při zpracování obrazu, audia nebo numerických výpočtů. Pokud již SIMD znáte, tato tabulka je vše, co budete potřebovat. A pokud s SIMD teprve začínáte, tabulku pochopíte do konce tohoto článku

GPUI Component: moderní Rust GUI komponenty pro cross-platform desktop aplikace

Různé
Komentáře: 0
GPUI Component je open-source Rust knihovna rozšiřující framework GPUI o více než 60 moderních, nativních a multiplatformních UI komponent. Staví na deklarativním přístupu, stateless renderování a jednoduchém API inspirovaném Reactem či Yew. Díky optimalizovanému výkonu, podpoře témat a flexibilním layoutům umožňuje rychlý vývoj desktopových aplikací, jako je například trading nástroj Longbridge Pro. Knihovna je licencována pod Apache 2.0 a dostupná na GitHubu.