MetaModels Workshop in Berlin
Ergebnis 1 bis 7 von 7

Thema: Einfaches Routing-App-Bundle

  1. #1
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    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.
    Beiträge
    1.771
    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.014
    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
    Vienna, Austria
    Beiträge
    20.573
    User beschenken
    Wunschliste

    Standard

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

  5. #5
    Contao-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    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 13:41 Uhr)

  6. #6
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Vienna, Austria
    Beiträge
    20.573
    User beschenken
    Wunschliste

    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-Nutzer
    Registriert seit
    29.06.2016.
    Beiträge
    189

    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 17:29 Uhr)

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
  •