Contao-Camp 2024
Ergebnis 1 bis 10 von 10

Thema: Einfaches Routing-App-Bundle

  1. #1
    Contao-Fan
    Registriert seit
    29.06.2016.
    Beiträge
    500

    Standard Einfaches Routing-App-Bundle

    Hallo,

    ich habe versucht ein einfaches App-Bundle zu erstellen, welches eine eigene Symfony-Route verwendet.

    So siehts aus:


    app/ContaoManagerPlugin.php
    Code:
    <?php 
    
    
    use Contao\ManagerPlugin\Bundle\Config\BundleConfig;
    use Contao\ManagerPlugin\Bundle\BundlePluginInterface;
    use Contao\ManagerPlugin\Bundle\Parser\ParserInterface;
    use Contao\ManagerPlugin\Routing\RoutingPluginInterface;
    use Symfony\Component\Config\Loader\LoaderResolverInterface;
    use Symfony\Component\HttpKernel\KernelInterface;
    
    
    
    class ContaoManagerPlugin implements BundlePluginInterface, RoutingPluginInterface
    { 
        /** 
         * {@inheritdoc} 
         */ 
        public function getBundles(ParserInterface $parser) 
        { 
            return [ 
                BundleConfig::create(AppBundle\AppBundle::class) 
                    ->setLoadAfter([ContaoCoreBundle::class]) 
            ]; 
        } 
    
    
        /**
         * Returns a collection of routes for this bundle.
         *
         * @param LoaderResolverInterface $resolver
         * @param KernelInterface         $kernel
         *
         * @return RouteCollection|null
         *
         * @throws \Exception
         */
        public function getRouteCollection(LoaderResolverInterface $resolver, KernelInterface $kernel)
        {
            return $resolver
                ->resolve(__DIR__.'/../src/AppBundle/Resources/config/routing.yml')
                ->load(__DIR__.'/../src/AppBundle/Resources/config/routing.yml');
    
        }
    
    
    }


    src/AppBundle/AppBundle.php
    Code:
    <?php 
    
    namespace AppBundle; 
    
    use Symfony\Component\HttpKernel\Bundle\Bundle; 
    
    class AppBundle extends Bundle 
    { 
    }



    src/AppBundle/Controller/TestX.php
    Code:
    <?php
    
    namespace AppBundle\Controller; 
    
    
    use Contao\CoreBundle\Exception\PageNotFoundException;
    use Contao\CoreBundle\Framework\ContaoFramework;
    use Contao\FilesModel;
    use Contao\StringUtil;
    use Contao\Validator;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\BinaryFileResponse;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\HttpFoundation\Session\Session;
    
    class TestX extends Controller
    {
        protected $rootDir;
        protected $session;
        protected $framework;
    
        public function __construct(string $rootDir, Session $session, ContaoFramework $framework)
        {
            $this->rootDir      = $rootDir;
            $this->session      = $session;
            $this->framework    = $framework;
        }
    
        public function loadAction($uuid): Response
        {
            $this->framework->initialize();
    
            if (!Validator::isBinaryUuid($uuid)) {
                $uuid = StringUtil::uuidToBin($uuid);
            }
    
            $filesModel = FilesModel::findByUuid($uuid);
    
            if (null === $filesModel || !\is_file($this->rootDir . '/' . $filesModel->path)) {
                throw new PageNotFoundException('File not found [' . $filesModel->path . ']');
            }
    
            $this->session->save();
    
            return $this->json(['path' => $filesModel->path]);
        }
    }




    src/AppBundle/Resources/config/routing.yml
    Code:
    testx:
        path: /testx/{uuid}
        defaults:
            _controller: 'AppBundle\Controller\TestX'
            _scope: frontend
            _token_check: true
        requirements:
            uuid: '[a-fA-F0-9]{32}'



    composer.json
    Code:
        "autoload": {
            "psr-4": { "AppBundle\\": "src/AppBundle/" },
            "classmap": ["app/ContaoManagerPlugin.php"]
        }




    Wenn ich das ganze mit einem Aufruf wie zb.:
    http://myinstallation/testx/051878bc...2-40663e0458b1
    ... teste, bekomme ich nur einen "404 Not Found".
    Eigentlich sollte der Pfad der Bild-Datei zurückgegeben werden.

    Wisst ihr vielleicht was ich da falsch mache?

    Danke!

  2. #2
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Ort
    Magdeburg
    Beiträge
    2.020
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    Dein Requirement für die Uuid stimmt schon mal nicht. Die Uuid hat 36 Zeichen und beinhaltet Bindestriche.

  3. #3
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.500
    User beschenken
    Wunschliste

    Standard

    Code:
    _token_check: true
    sagt doch, du musst im FE angemeldet sein, oder?
    Mach mal:
    Code:
    _token_check: false
    Außerdem schaue mal ob deine Route ankommt.
    Auf Kommandozeile im Installationsverzeichnis: vendor/bin/contao-console debug:router
    Wird deine Route dort aufgelistet?
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.901
    Partner-ID
    10107

    Standard

    _token_check: true ist für die Request Token Überprüfung bei POST Requests.

  5. #5
    Contao-Fan
    Registriert seit
    29.06.2016.
    Beiträge
    500

    Standard

    @webstar:
    Die Uuid wir hier im Forum durch die Link-Formatierung falsch angezeigt.
    Es handelt sich schon um eine gültige Uuid.

    @BugBuster:
    Wenn ich „vendor/bin/contao-console debug:router“ ausführe, wird die Route aufgelistet.
    (Mit den ganzen anderen Contao-Routen.)

    Ich hab jetzt den Code nochmal vereinfacht (zb. den Parameter weggelassen):
    https://github.com/georgpreissl/cont...bundle-routing

    Jetzt erscheint eine „Es ist ein Fehler aufgetreten“ Contao-Fehlermeldung beim Testen der Route.

    Im Log steht dann folgendes:
    Code:
    [2019-06-21 12:33:06] request.INFO: Matched route "test". {"route":"test","route_parameters":{"_controller":"AppBundle\\Controller\\Test:loadAction","_scope":"frontend","_token_check":true,"_route":"test"},"request_uri":"http://demo24/test/","method":"GET"} []
    [2019-06-21 12:33:06] security.INFO: Attempting SimplePreAuthentication. {"key":"frontend","authenticator":"Contao\\CoreBundle\\Security\\ContaoAuthenticator"} []
    [2019-06-21 12:33:06] app.CRITICAL: An exception occurred. {"exception":"[object] (LogicException(code: 0): Controller not found: service \"AppBundle\\Controller\\Test\" does not exist. at /Applications/MAMP/htdocs/demo24/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Controller/ContainerControllerResolver.php:75)"} []
    ... d.h. die Controller-Klasse wird offenbar nicht gefunden, oder?


    Könnt ihr bitte einen Blick auf den Code werfen?
    Es sind ja nur vier Dateien – irgendwo muss da noch ein Fehler sein.

    Bitte um eure Hilfe, weiß nicht mehr weiter
    Geändert von thesweetg (21.06.2019 um 14:41 Uhr)

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.901
    Partner-ID
    10107

    Standard

    Wie webstar schon erwähnt hat, ist das Requirement für die UUID falsch. Du erlaubst nur genau 32 Zeichen und keine Bindestriche.
    Deine UUID hat aber 36 Zeichen und enthält Bindestriche.

  7. #7
    Contao-Fan
    Registriert seit
    29.06.2016.
    Beiträge
    500

    Standard

    @Spooky:
    Ah, danke. Jetzt check ich was webstar damit gemeint hat.


    Ich hab nun die vereinfachte Version des AppBundles (die ohne die UUID-Abfrage) nach einigem herumprobieren zum Laufen gebracht.
    Hier ist es: https://github.com/georgpreissl/cont...bundle-routing

    Vielleicht hilft es ja mal jemandem
    Geändert von thesweetg (21.06.2019 um 18:29 Uhr)

  8. #8
    Contao-Nutzer
    Registriert seit
    20.01.2022.
    Beiträge
    205

    Standard

    Zitat Zitat von thesweetg Beitrag anzeigen
    @Spooky:


    Ich hab nun die vereinfachte Version des AppBundles (die ohne die UUID-Abfrage) nach einigem herumprobieren zum Laufen gebracht.
    Hier ist es: https://github.com/georgpreissl/cont...bundle-routing

    Vielleicht hilft es ja mal jemandem

    Als Test habe ich das hinbekommen, wie wäre nun aber der Weg, da eine Verbindung zur Datenbank zu bekommen und die zu verwenden?

    Thomas
    Geändert von Thomas Pyrin (16.02.2022 um 12:31 Uhr)

  9. #9
    Contao-Nutzer
    Registriert seit
    30.07.2015.
    Beiträge
    140

    Standard

    Wie ist das mit dem Routing unter 4.13.

    Ich habe folgende config unter /Resources/config/routes.yml

    PHP-Code:
    # config/routes.yaml
    app.controller:
        
    resource: ../src/Controller
        type
    annotation 
    in der Plugin.php sieht das dann so aus:

    PHP-Code:
    public function getRouteCollection(LoaderResolverInterface $resolverKernelInterface $kernel)
        {
            
    $file __DIR__.'/../Resources/config/routes.yml';
            return 
    $resolver->resolve($file)->load($file);
        } 
    und dann habe ich einen Controller:

    PHP-Code:
    <?php

    use Symfony\Component\HttpFoundation\Request;
    use 
    Symfony\Component\HttpFoundation\Response;
    use 
    Symfony\Component\Routing\Annotation\Route;

    /**
     * @Route("/example", name=ExampleController::class, defaults={"_scope": "frontend"})
     */
    class ExampleController
    {
        public function 
    __invoke(Request $request): Response
        
    {
            return new 
    Response('Hello World!');
        }
    }
    aber das Routing funktioniert nicht. Wo habe ich denn etwas übersehen oder geht das so nicht?

  10. #10
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.901
    Partner-ID
    10107

    Standard

    Die Pfadangaben stimmen nicht ganz überein. In deiner routes.yaml hast du folgendes geschrieben:
    Code:
    resource: ../src/Controller
    Aufgelöst würde das ja den Ordner Resources/config/src in deinem Bundle geben, was vermutlich falsch ist? Außerdem hast du app.controller als Name verwendet, was aber eher für die App ist, nicht für Bundles. Damit könnte es später mal Probleme geben.
    » sponsor me via GitHub or PayPal or Revolut

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •