Ankündigung

Einklappen
Keine Ankündigung bisher.

Verständnisfrage zu dynamische URLs, Router, Matcher, Generator

Einklappen

Neue Werbung 2019

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

  • Verständnisfrage zu dynamische URLs, Router, Matcher, Generator

    Hallo zusammen,

    meine erste Frage zielt gleich auf Symfony ab.
    Dabei hab ich es noch nicht hinbekommen dynamische Routes abzufangen.
    Wie Routes angelegt werden ist schon klar und funktioniert auch wunderbar.

    HIER NUR EIN DEMO WIE ES IN SYMFONY NORMAL GEHT.
    DIE ROUTES SOLLEN ABER PER EIGENEM MATCHER ERMITTELT WERDEN:

    Code:
    /**
     * @Route("/", name="page.index")
     * @return Response
     */
    public function index(): Response
    {
        return $this->render('index/index.html.twig', [
            'controller_name' => 'PagesController'
        ]);
    }
    
    /**
     * @Route("/pages", name="page.listing")
     * @return Response
     */
    public function pages(): Response
    {
        return $this->render('listing/index.html.twig', [
            'controller_name' => 'PagesController'
        ]);
    }
    
    /**
     * @Route("/page/{id}", name="page.detail")
     * @return Response
     */
    public function detail(): Response
    {
        return $this->render('detail/index.html.twig', [
            'controller_name' => 'PagesController'
        ]);
    }
    Was mich aber brennend interessiert ist, wie ich sprechende URLs abfangen kann.
    Also z.B.
    Code:
    /startseite.html -> @Route("/", name="page.index")
    /meine-seiten.html -> @Route("/pages", name="page.listing")
    /sysmfony.html -> @Route("/page/{id}", name="page.detail")
    /php.html -> @Route("/page/{id}", name="page.detail")
    /anderer-controller.html -> @Route("/others/{id}", name="others.detail")
    ...
    Wäre dankbar für Tipps über Service/Events die ich erstellen muss für:
    - Matcher
    - Generator

  • #2
    ich sehe erstmal wenig unterschied zwischen /page und /startseite.html soweit es den router angeht,
    steht irgendwo in der docu, dass eine route kein . und nicht html haben darf ?
    #
    hab ich was falsch verstaden ?

    Kommentar


    • #3
      Mein Konzept wird in etwa so aussehen.
      • Es werden Module (oder auch Plugins, Bundles genannt) entwickelt z.B. Gallery, News, Kalender was auch immer
      • Einer Seite z.B. meine-gallery.html wird dem Modul Gallery zugewiesen. Es kann aber auch meine-andere-gallery.html geben.
        Je nach Modul-Einstellung, Text Beschreibung usw. soll der Kontent generiert werden.
      Also, ich benötige einen Controller (Modul -> Gallery) der mitbekommt (Matcher) das die Seiten meine-gallery.html, meine-andere-gallery.html zu verarbeiten sind. Und das dynamisch ohne im Controller die Routes zu definieren.
      Oder anders, einen Matcher, der die URL auswertet und auf den passenden Controller (z.B. Gallery) verweist.
      Genauso muss es einen Generator geben, der anhand von Controller, ID, Params die URL generiert.
      Die Module, Einträge, Einstellung usw. werden natürlich in der DB zu finden sein.

      Aber zum Start, wäre es toll, wenn ich es hin bekomme, dass ich einen Matcher habe der erstmal dazwischen grätscht und
      einen Controller (statisch zum testen) zurück gibt egal welcher URL ich eingebe.

      Ist das etwas verständlicher?

      Kommentar


      • #4
        Ich verstehe nichts mehr, möglicherweise jemand anders..
        Das fängt aber schon damit an, dass Du in #1 immer den selben Controller und immer das selbe tempalte nutzt -
        schon da sehe ich keine zwingende notwendigkeit für.

        Kommentar


        • #5
          vergiss was ich da oben als demo script habe. das ist doch nur ein beispiel, wie es normal in symfony funktioniert.
          genau so will ich das eben nicht

          // edit
          so hab das mal oben angepasst, besser so?

          Kommentar


          • #6
            wie würdet ihr die URLs abfangen?

            /de/meine-seite.html
            /en/my-site.html
            /de/aktuelle-news.html
            /en/current-news.html
            /de/alte-news.html
            /en/news-archiv.html
            /de/news-von-letzter-woche.html
            /de/news-von-letzter-woche/dyn-urls.html
            /en/news-last-week.html
            /en/news-last-week/dyn-urls.html
            ...

            und das ggf. mit mehreren 100 urls.
            tragt ihr das alles in den jeweiligen controller ein?
            das denke ich nicht.

            Kommentar


            • #7
              Wie Du schon in #1 gespostet hast:
              Wie Routes angelegt werden ist schon klar und funktioniert auch wunderbar.
              insofern dürfte dir bdas ganze de/en/es/it keine probleme machen:
              https://symfony.com/blog/new-in-symf...alized-routing
              nach wie vor ich verstehe Dein Problem nicht.

              Kommentar


              • #8
                tomBuilder
                erstmal danke für deine unterstützung

                ich muss noch etwas weiter ausholen.
                ich möchte mein CM-System auf symfony umzubauen.
                im system (bisher) wird ein navipunkt (z.b. Aktuelle News) angelegt. diesem navipunkt weißt man ein Modul (z.b News, Gallery was auch immer) zu.
                somit hab ich mein verhalten, einstellung, news-items und sonstiges was nur das Module "News" hat.
                die URLs werden wie folgt generiert
                Code:
                [sprache]/[navipunkt].html -> z.b. de/aktuelle-news.html
                [sprache]/[navipunkt]/[item].html -> z.b. de/aktuelle-news/dyn-routes.html
                [sprache]/[navipunkt]/[subnavipunkt]/[item].html -> z.b. de/aktuelles/news/dyn-routes.html
                per matcher ermittle ich den passenden controller aus der URL und verarbeite die daten usw.
                natürlich können mehrere navipunkt das module "News" haben. es wird halt anders gepflegt.

                ggf. denke ich einfach nur schief und in symfony läuft das anders,
                daher "Verständnisfrage zu dynamische URLs, Router, Matcher, Generator".

                Kommentar


                • #9
                  Zitat von onip Beitrag anzeigen
                  tomBuilder
                  erstmal danke für deine unterstützung

                  ich muss noch etwas weiter ausholen.
                  ich möchte mein CM-System auf symfony umzubauen.
                  im system (bisher) wird ein navipunkt (z.b. Aktuelle News) angelegt. diesem navipunkt weißt man ein Modul (z.b News, Gallery was auch immer) zu.
                  somit hab ich mein verhalten, einstellung, news-items und sonstiges was nur das Module "News" hat.
                  die URLs werden wie folgt generiert
                  Code:
                  [sprache]/[navipunkt].html -> z.b. de/aktuelle-news.html
                  [sprache]/[navipunkt]/[item].html -> z.b. de/aktuelle-news/dyn-routes.html
                  [sprache]/[navipunkt]/[subnavipunkt]/[item].html -> z.b. de/aktuelles/news/dyn-routes.html
                  per matcher ermittle ich den passenden controller aus der URL und verarbeite die daten usw.
                  natürlich können mehrere navipunkt das module "News" haben. es wird halt anders gepflegt.

                  ggf. denke ich einfach nur schief und in symfony läuft das anders,
                  daher "Verständnisfrage zu dynamische URLs, Router, Matcher, Generator".
                  Du kannst auch mit einer Action alle Requests catchen, falls du danach suchst:

                  PHP-Code:
                  /**
                   * @Route("/{_locale}/{slug}", name="default", requirements={"slug"=".*"})
                   */  
                  public function default(Request $request) {  
                    
                  $node $this->cms->findBySlug($request->get('slug'));

                  Kommentar


                  • #10
                    hi,

                    danke, das wäre doch schon mal ein ansatz, das ich testen werde.

                    gibt es ein event oder service im symfony um weitere matcher und generator zu übergeben?

                    um:
                    - alle matcher zusammen zu tragen
                    - in einer schleife die matcher durchgehen bis ein controller zurückgegeben wird

                    Kommentar


                    • #11
                      Zitat von onip Beitrag anzeigen
                      hi,

                      danke, das wäre doch schon mal ein ansatz, das ich testen werde.

                      gibt es ein event oder service im symfony um weitere matcher und generator zu übergeben?

                      um:
                      - alle matcher zusammen zu tragen
                      - in einer schleife die matcher durchgehen bis ein controller zurückgegeben wird
                      Da ist wohl das hier hilfreich:
                      https://symfony.com/doc/current/rout...te_loader.html

                      Oder, unschön aber auch möglich, das in der Catch-All Action handeln:
                      PHP-Code:
                      public function default(Request $request) {  
                        
                      $node $this->cms->findBySlug($request->get('slug'));    

                        
                      // return $this->forward($node->getAction(), [
                        
                      return $this->forward('App\Controller\NewsController::default', [    
                          
                      'request' => $request,  
                        ]);

                      Kommentar


                      • #12
                        sauber, danke.
                        das hat mich etwas näher gebracht mit den custom loader.
                        https://symfony.com/doc/current/rout...-custom-loader

                        hier mal ein ansatz

                        config/routes.yaml
                        Code:
                        app_custom_routing_loader:
                          resource: .
                          type: custom_routing
                        service.xml
                        Code:
                        <service id="app.routing.custom_routing_loader" class="App\Routing\CustomRoutingLoader" public="true">
                            <tag name="routing.loader"/>
                        </service>
                        src/Routing/CustomRoutingLoader.php
                        Code:
                        <?php
                        
                        namespace App\Routing;
                        
                        use Symfony\Component\Config\Loader\Loader;
                        use Symfony\Component\Routing\Route;
                        use Symfony\Component\Routing\RouteCollection;
                        
                        class CustomRoutingLoader extends Loader
                        {
                            private $isLoaded = false;
                            private $routeName = 'custom_[module]_[locale]_[id]';
                        
                            public function load($resource, $type = null)
                            {
                                if (true === $this->isLoaded) {
                                    throw new \RuntimeException('Do not add the "extra" loader twice');
                                }
                        
                                $routes = new RouteCollection();
                                // $rewriteUrls kommt von der Datenbank!
                                // hier nur mal ein demo zum testen
                                $rewriteUrls = [
                                    [
                                        'id' => 1,
                                        'locale' => 'en',
                                        'module' => 'home',
                                        'controller' => 'App\Controller\StartseiteController',
                                        'path' => '/en/home.html'
                                    ],
                                    [
                                        'id' => 2,
                                        'locale' => 'de',
                                        'module' => 'home',
                                        'controller' => 'App\Controller\StartseiteController',
                                        'path' => '/de/startseite.html'
                                    ]
                                ];
                                foreach ($rewriteUrls as $index => $rewriteUrl) {
                                    $route = new Route(
                                        $rewriteUrl['path'],
                                        ['_controller' => $rewriteUrl['controller'] . '::index'],
                                        ['parameter' => '\d+']
                                    );
                                    $routes->add(
                                        str_replace([
                                            '[module]',
                                            '[locale]',
                                            '[id]'
                                        ], [
                                            $rewriteUrl['module'],
                                            $rewriteUrl['locale'],
                                            $rewriteUrl['id']
                                        ], $this->routeName),
                                        $route
                                    );
                                }
                                $this->isLoaded = true;
                        
                                return $routes;
                            }
                        
                            public function supports($resource, $type = null)
                            {
                                return 'custom_routing' === $type;
                            }
                        }
                        src/Controller/StartseiteController.php
                        Code:
                        <?php
                        
                        namespace App\Controller;
                        
                        use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
                        use Symfony\Component\HttpFoundation\Response;
                        
                        class StartseiteController extends AbstractController
                        {
                            /**
                             * @return Response
                             */
                            public function index()
                            {
                                die('<h1>' . __FILE__ . '</h1><h2>[' . __LINE__ . ']</h2><pre>' . print_r(['StartseiteController'], true) . '</pre>');
                            }
                        }
                        und da sind die routes
                        Code:
                        $ bin/console debug:router
                         -------------------------- -------- -------- ------ -----------------------------------
                          Name                       Method   Scheme   Host   Path
                         -------------------------- -------- -------- ------ -----------------------------------
                        ...
                          custom_home_en_1           ANY      ANY      ANY    /en/home.html
                          custom_home_de_2           ANY      ANY      ANY    /de/startseite.html
                         -------------------------- -------- -------- ------ -----------------------------------
                        ich bin für kritik/beserungsvorschläge offfen.

                        Kommentar

                        Lädt...
                        X