Ostatnimi czasy widzę rosnący trend rozdzielania części frontowej i backendowej aplikacji internetowej. Takie rozdzielenie warstw pozwala na dużą elastyczność w projektowaniu aplikacji. Część backendowa jest aktualnie sprowadzona do serwera REST na który wysyła się zapytania z części frontowej. Dziś chciałbym krótko pokazać jak stworzyć w Symofny taki prosty serwer REST. Będę go potem wykorzystywał w cyklach dotyczących framework’ów frontendowych.

Symfony REST

Symfony jest doskonale przystosowany do pełnienia roli serwera REST. Do takiego serwera wysyłane są tylko 4 główne  metody:

Aby stworzyć taki serwer w Symofny musimy zainstalować dwa nowe pakiety:

Aby je zainstalować to najlepiej wejść do kontenera php i wpisać następujące komendy

composer require friendsofsymfony/rest-bundle

 

oraz

composer require jms/serializer-bundle

Pierwsza biblioteka pozwala definiować teraz kontrolery w sposób REST’owy tzn w nazwie funkcji musimy teraz pisać nazwę metody jaką będziemy się do funkcji odwoływać np. getUsers. Automatycznie też jest tworzona ścieżka pod którą będzie można się odwołać.  Jednak aby to wszystko działało musimy wykonać minimum wysiłku w postaci konfiguracji.

Ja osobiście korzystam z takiej minimalnej konfiguracji w której wskazuję, że formatem którego będę używać będzie json

fos_rest:
    routing_loader:
        default_format: json
        include_format: false
    body_listener: true
    format_listener:
        rules:
            - { path: '^/api', priorities: ['json'], fallback_format: json, prefer_extension: false }
            - { path: '^/', stop: true }
    param_fetcher_listener: true
    view:
        view_response_listener: 'force'
        formats:
            json: true

 

Jednak to nie wszystko. Musimy jeszcze zmienić konfiguracje routingu. Aby to zrobić musimy wejść w app/config/routing.yml i usunąć to co tam jest. Od teraz będziemy definiować sami z jakich kontrolerów będą tworzone ścieżki URL. Innymi słowy jeśli jakiegoś kontrolerra nie umieścimy w tym pliku to nie będzie dostępne w postaci endpointu dla części frontendowej. Nowe kontrolery definiujemy w następujący sposób:

Nazwa (ja osobiście tam daję nazwę kontrolera):

resource: Scieżka do controllera

type:rest

prefix:/api

Opcja prefix powoduje , że każda wygenreowna ścieżka będzie poprzedzona wpisaną tam wartością.  Resource jest to ścieżka do kontroleraTeraz jak jest już wszystko zrobione możemy stworzyć nasz pierwszy REST’owy kontroler. Ja stworze kontroler o nazwie TestController i stworzę go w ścieżce Controller/API/. Wtedy mój nowy kontroler w pliku routing będzie wyglądał następująco:

test:

resource:AppBundle\Controller\API\TestController

type:rest

prefix:/api

No to teraz zajmijmy się właściwym kontrolerem. Najwazniejsze jest żeby nasza nowa klasa dziedziczyła po  FOSRestController . Teraz wystarczy tworzyć nowe funkcje w naszej klasie i będą się one tworzyły jako nowe endpointy. Przykładowy plik przedstawiam poniżej.

<?php

namespace AppBundle\Controller\API;

use FOS\RestBundle\Controller\FOSRestController;

class TestController extends FOSRestController
{
    public function getTestsAction()
    {
        return array(
            'typ' => 'blog',
            'nazwa' => array(
                "FSGeek",
                "Full Stack Geek",
            ),
        );
    }

}

 

Czy to działa?

Jednak jak teraz sprawdzić czy wszystko działa? Ja korzystam z narzędzia Postman, które pozwala wysyłać zapytania pod dostępne adresy naszego sewrwera i sprawdzać co otrzymamy z nich. Żeby zobaczyć jakimy endpointami dysponujemy należy wpisać w kontenerze php następujące polecenie:

bin/console debug:router

Wyświetla ono wszystkie dostępne  adresy w naszej aplikacji. W moim przypadku na dole listy pojawił się taki wpis.

I ten adres wpiszę do Postmana , wybiorę metodę GET i wyślę zapytanie.  Na poniższym zrzucie widać efekt tego zapytania jeśli wszytsko działa.

Zapraszam do samodzielnego eksperymentowania i tworzenia własnych kontrolerów.

W następnym wpisie zajmę się jeszcze jak stworzyć własną tabelę w bazie danych oraz jak pobierać i zapisywać w niej informacje.