Ankündigung

Einklappen
Keine Ankündigung bisher.

Symfony Routen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Symfony Routen

    Moin Zusammen,

    irgendwie blicke ich bei den Routen in Symfony nicht ganz durch.

    ich habe

    PHP-Code:
      /**  * @Route("/notice", name="notice")  */ /**  * @Route("/notice/user", name="noticeUser")  */  /** * @Route("/notice/customer", name="noticeCustomer") */ 
    nun versuche ich anhand dieser Verlinkung hier, dass die jeweiligen Routen angesprochen werden:

    PHP-Code:
      href="{{ url('notice') }}"href="{{ url('notice/user') }}"href="{{ url('notice/customer') }}"
    der findet aber die Routen notice/user und customer nicht, nur notice.
    Allerdings, wenn ich das so mache:

    PHP-Code:
      href="{{ url('notice') }}"href="{{ url('notice') }}/user"href="{{ url('notice') }}/customer"
    dann funktioniert das, dass möchte ich aber nicht so haben, es muss doch auch anders gehen.

  • #2
    Führen alle drei auf den gleichen Endpunkt? Verwende einen Parameter. Dann kannst du den Parameter auch Optional machen.
    [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

    Kommentar


    • #3
      Also alle 3 laufen über den selben Controller, so sieht es aus:

      PHP-Code:
      class NoticeController extends AbstractController {
      /**
      * @Route("/notice", name="notice")
      */
      public function indexRenderer()
      {
      return 
      $this->render('notice/index.html.twig', [             'currentFilter' => ''         ]);
      }

      /**
      * @Route("/notice/user", name="noticeUser")
      */
      public function indexUserRenderer(EntityManagerInterface $entityManager)     {
      xxxx
      }

      /**
      * @Route("/notice/customer", name="noticeCustomer")
      */
      public function indexCustomer() {
      xxxxx
      }

      Ich hatte es auch mit den Parameter versucht, allerdings ist er immer nur in der "notice" bereich gesprungen und nie in den anderen


      Also vorher hatte ich es so versucht:

      PHP-Code:
      class NoticeController extends AbstractController {
      /**
      * @Route("/notice/{filterOption}", name="notice", defaults={'filterOption' = ''})
      */     
      public function indexRenderer()
      {
      return 
      $this->render('notice/index.html.twig', [             'currentFilter' => ''         ]);
      }

      /**
      * @Route("/notice/{filterOption}", name="noticeUser", defaults={'filterOption' = 'user'})
      */
      public function indexUserRenderer(EntityManagerInterface $entityManager)     {
      xxxx
      }

      /**
      * @Route("/notice/{filterOption}", name="noticeCustomer", defaults={'filterOption' = 'customer'})
      */
      public function indexCustomer() {
      xxxxx
      }
      }


      TWIG:

      href="{{ url('notice', {'filterOption' : ''}) }}"href="{{ url('notice/user', {'filterOption' : 'user'}) }}"href="{{ url('notice/customer', {'filterOption' : 'customer'}) }}"
      zwar wurde ich dann immer auf das jeweilige geleitet, also notice/user oder notice/customer, allerdings ist er nicht in die entsprechenden Funktionen gegangen, sondern immer nur in die Funktion indexRenderer, egal welche der drei Routen gerade aktiv war.


      Also ohne Parameter bekomme ich halt nun diese Fehlermeldung: An exception has been thrown during the rendering of a template ("Unable to generate a URL for the named route "notice/user" as such route does not exist.").

      Kommentar


      • #4
        Ich habe es gelöst...

        Kommentar


        • #5
          Als Lösung, da yugox sie nicht gepostet hat. Man muss natürlich den Namen der Route beim Rendern angeben, nicht den Pfad der Route.

          Code:
           
          /**
          * @Route("/notice/{filterOption}", name="noticeCustomer", defaults={'filterOption' = 'customer'})
          */
          Code:
           
          href="{{ url('noticeUser')) }}">
          https://symfony.com/doc/current/temp...nking-to-pages

          Kommentar


          • #6
            Vielleicht noch als Zusatz: Man kann auch (bei Bedarf) den SecurityContext und den "Base-Namen" für alle Methoden eines Controllers auf einmal in einer Annotation der Controller-Klasse definieren, um sich Code zu sparen.

            Beispiel:

            PHP-Code:
            /**
             * @Route("/admin", name="admin_")
             *
             * @Security("has_role('ROLE_ADMIN')")
             */
            class AdminController extends BaseController {
                ...

            Damit wären dann alle Methoden im AdminController nur noch für User mit der Rolle Admin zugänglich, sonst setzt es (bei entsprechender Konfiguration der security.yml) den Redirect aufs Login-Formular.

            PHP-Code:
            /**
             * @Route("/create", name="create")
             *
             * @param Request $request
             *
             * @return Response|RedirectResponse
             */
            public function createAction(Request $request) {
                ...

            Damit verkürzt man wie gesagt das @Route("/admin/create", name="admin_create") auf den Code im Beispiel. Ich glaube gerade bei langen bzw. komplexen Pfaden in URLs aus ebenso komplexen "Datenmonstern" kann das ganz hilfreich sein.

            Kommentar


            • #7
              Zeichen32
              Danke Dir das Du das nochmal richtig erläutert hast, ich hatte es gestern leider nicht mehr geschafft meine Lösung zu posten.

              wario
              Dein Zusatz ist auch sehr hilfreich, dass ist auch eine Sache die man gut gebrauchen kann Danke dafür!

              Kommentar

              Lädt...
              X