FOSJsRoutingBundle to paczka, która rozwiązuje problem odwoływania się do aplikacji Symfony z poziomu skryptów JavaScript, np. przy definiowaniu akcji AJAX-owych. Problem może nie jest wielki, bo oczywiście można URL-e zapisać na sztywno, ale w takim wypadku nie można korzystać z dobrodziejstw środowiska dev.
Dzięki wspomnianej paczce URL do akcji w Symfony można wygenerować podobnie jak w PHP:
var url = Routing.generate('my_route_to_expose', { id: 10, foo: "bar" });
FOSJsRoutingBundle umożliwia zarówno dynamiczne jak i statyczne generowanie tras. W tym pierwszym wypadku aplikacja Symfony jest dynamicznie odpytywana o trasy, dzięki czemu zmiany w aplikacji od razu są widoczne w JavaScriptcie. Ten tryb warto wybrać w czasie developmentu albo w zastosowaniach, gdzie nieco mniejsza wydajność nie będzie problemem. W trybie statycznym należy poleceniem z konsoli wygenerować plik zawierający definicję routingu dla JS.
Poniżej opiszę instalację paczki w Symfony i konfigurację w trybie statycznym.
Tradycyjnie zacząłem od instalacji paczki composerem:
composer require friendsofsymfony/jsrouting-bundle
Po zainstalowaniu paczki dodałem ją do app/AppKernel.php
:
public function registerBundles() { $bundles = array( // ... new FOS\JsRoutingBundle\FOSJsRoutingBundle() ); }
Kolejnym krokiem jest skopiowanie statycznych plików do katalogu web:
app/console assets:install
Połączenie pomiędzy Symfony i JavaScriptem stanowią dwa skrypty, które dodałem do podstawowego szablonu strony:
<script src="{{ asset('bundles/fosjsrouting/js/router.js') }}"></script> <script src="{{ asset('js/fos_js_routes.js') }}"></script>
Następnie należy w definicji routingu wskazać, które trasy mają być dostępne w JavaScriptcie. Dokumentacja pokazuje konfigurację YAML-ową, ja zaś używam annotacji:
/** * @Route("/sugeruj-produkt", name="suggest_product", options={"expose": true}) */
Ostatnim krokiem jest wygenerowanie pliku z routingiem:
app/console fos:js-routing:dump
Teraz wszystko będzie grać i buczeć.