Symfony 6 to popularny framework PHP, który zapewnia narzędzia do tworzenia skalowalnych aplikacji webowych oraz API. Opiera się na wzorcu Model-Widok-Kontroler (MVC), umożliwiając łatwe zarządzanie logiką biznesową, widokami i interakcją z użytkownikami.
Pobieranie Parametrów z Adresu URL
Jedną z przydatnych funkcji Symfony jest możliwość pobierania parametrów z adresu URL. Dzięki temu mechanizmowi programista może przekazywać dane z widoku do kontrolera w sposób bezpieczny i wygodny dla użytkownika końcowego. Mechanizm ten opiera się na deklaracji ścieżki do kontrolera za pomocą adnotacji „@Route”, która definiuje wzorzec adresu URL i parametry do pobrania.
Deklaracja Parametrów w Ścieżce URL
Do pobierania parametrów z adresu URL w Symfony wykorzystuje się zmienne umieszczone w ścieżce URL, np. „/user/{id}”, gdzie „id” jest parametrem. W kontrolerze można następnie odwołać się do tego parametru za pomocą zmiennej o takiej samej nazwie, np. „$id”. Aby to działało, potrzebny jest obiekt Request, który jest dostarczany do kontrolera przez mechanizm wstrzykiwania zależności w Symfony.
Dzięki temu mechanizmowi pobierania parametrów z adresu URL programista może tworzyć aplikacje, które dostosowują swoje zachowanie w zależności od danych, które są przesyłane przez użytkownika w adresie URL. Jest to przydatne zarówno w przypadku tworzenia aplikacji webowych, jak i API.
Tworzenie Kontrolera w Symfony 6
W tym przykładzie stworzymy prosty kalkulator, gdzie dane wejściowe będziemy przekazywać do aplikacji za pomocą adresu URL.
Tworzymy nowy kontroler wydając polecenie:
php bin/console make:controller CalculatorController
Edytujemy plik src/Controller/CalculatorController.php
umieszczając poniższy kod:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class CalculatorController extends AbstractController
{
#[Route('/calculator/{a}/{b}', name: 'app_calculator')]
public function index(Request $request, $a, $b): Response
{
// odczytanie wartości z adresu URL
$aValue = $a;
$bValue = $b;
// wynik sumowania dwóch liczb
$sum = $aValue + $bValue;
return $this->render('calculator/index.html.twig', [
'a' => $a,
'b' => $b,
'sum' => $sum,
]);
}
}
Następnie zmieniamy zawartość pliku templates/calculator/index.html.twig
, umieszczając następujący kod:
{% extends 'base.html.twig' %}
{% block title %}Kalkulator{% endblock %}
{% block body %}
<div>
<h1>Kalkulator</h1>
<p>
{{ a }} + {{ b }} = {{ sum }}
</p>
</div>
{% endblock %}
Teraz po wejściu pod adres: http://helloworld.localhost/calculator/10/20 ujrzymy wynik dodawania licz 10 i 20:
Zwróć uwagę, że zawsze musimy podać dwie wartości w adresie URL po /calculator/. Gdy nie podamy której z liczb otrzymamy błąd:
Obsługa Braku Parametrów w URL
Aby umożliwić dostęp do adresu „/calculator” i „/calculator/” bez powodowania błędu, możemy dodać domyślne wartości dla parametrów $a i $b. Można to zrobić za pomocą znaku równości w deklaracji parametrów funkcji, tak jak poniżej:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class CalculatorController extends AbstractController
{
#[Route('/calculator/{a}/{b}',
name: 'app_calculator',
requirements: ['a' => '-?\d+', 'b' => '-?\d+'],
defaults: ['a' => 0, 'b' => 0])]
public function index(Request $request, $a = 0, $b = 0): Response
{
// odczytanie wartości z adresu URL
$aValue = $a;
$bValue = $b;
$sum = $aValue + $bValue;
return $this->render('calculator/index.html.twig', [
'a' => $a,
'b' => $b,
'sum' => $sum,
]);
}
}
Od tej chwili, gry nie podamy żadnych danych, nie otrzymamy żadnego błędu, a wartości zmiennych $a i $b będą ustawione na 0.
Możemy także przekazać do widoku tylko wartości zmiennych a oraz b i w samym widoku dokonać obliczeń:
{% extends 'base.html.twig' %}
{% block title %}Kalkulator{% endblock %}
{% block body %}
<div>
<h1>Kalkulator</h1>
<p>
{{ a }} + {{ b }} = {{ a + b }}
</p>
<p>
{{ a }} - {{ b }} = {{ a - b }}
</p>
<p>
{{ a }} * {{ b }} = {{ a * b }}
</p>
<p>
{{ a }} / {{ b }} = {{ a / b }}
</p>
</div>
{% endblock %}
Wynik działania aplikacji jest następujący:
Zwróć uwagę, że podając jako drugi parametr zero otrzymamy błąd:
Możemy w widoku użyć instrukcji warunkowej, która sprawdzi czy dzielnik jest równy zero i wyświetli odpowiedni komunikat. Kod widoku powinien wyglądać następująco:
{% extends 'base.html.twig' %}
{% block title %}Kalkulator{% endblock %}
{% block body %}
<div>
<h1>Kalkulator</h1>
<p>
{{ a }} + {{ b }} = {{ a + b }}
</p>
<p>
{{ a }} - {{ b }} = {{ a - b }}
</p>
<p>
{{ a }} * {{ b }} = {{ a * b }}
</p>
{% if b != 0 %}
<p>
{{ a }} / {{ b }} = {{ a / b }}
</p>
{% else %}
<p>
Nie można dzielić przez zero.
</p>
{% endif %}
</div>
{% endblock %}
Po tych zmianach otrzymamy następujący wynik działania naszej aplikacji:
Link do repozytorium: https://github.com/brylka/HelloWorldSymfony6