Symfony 6 + pobieranie parametrów z adresu URL

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
Tworzymy nowy kontroler CalculatorController w Symfony.

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:

Wynik dodawania dwóch liczb podanych w URL.

Zwróć uwagę, że zawsze musimy podać dwie wartości w adresie URL po /calculator/. Gdy nie podamy której z liczb otrzymamy błąd:

Błąd pojawiający się gdy nie podamy wymaganych liczb w adresie URL.

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.

Defaultowe wartości zmiennych $a i $b.

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:

Wynik działania kalkulatora.

Zwróć uwagę, że podając jako drugi parametr zero otrzymamy błąd:

Dzielenie przez zero - błędy w Symfony.

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:

Zabezpieczenie aplikacji przed dzieleniem przez zero w widokach Symfony.

Link do repozytorium: https://github.com/brylka/HelloWorldSymfony6

Leave a Comment

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *


Scroll to Top