Gelöst: Eigener Controller - No route found

Ich scheitere auch beim Anlegen eines eigenen Controllers. Mein Test sieht hierbei wie folgt aus:

TestPlugin/src/Controller/ExampleController.php

<?php

namespace TestPlugin\Controller;

use Exception;

use Shopware\Storefront\Controller\StorefrontController;

use Doctrine\DBAL\Connection;


class ExampleController extends StorefrontController
{

    public function __construct()
    {
    }

}

Ratlose Versuche in der routes.xml:

<import resource="../../***/*Controller.php" type="annotation"/>

geht nicht

<import resource="../../Controller/*Controller.php" type="annotation"/>

geht nicht

<import resource="../../***/*Controller" type="annotation"/>

geht nicht

Beim Aufruf von Controller: No route found

Ich sehe es einfach nicht, was nicht stimmt.

1 „Gefällt mir“

Controller liegt nach Convention unter DEINPLUGIN/src/Core/Api/DEINPLUGINController.php

dementsprechend ist der Namespace des Controllers

<?php

declare(strict_types=1);

namespace DEINPLUGIN\Core\Api;

Unter

DEINPLUGIN/src/Resources/routes.xml

sollte die RouteConfig liegen mit folgendem Inhalt:

<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing
        http://symfony.com/schema/routing/routing-1.0.xsd">

    <import resource="../../**/Api/*Controller.php" type="annotation" />
</routes>

Diese Datei ist unter Einhaltung der Conventionen immer gleich.

Zuletzt musst du deinen Controller noch als Service erkenntlich machen in der

DEINPLUGIN/src/Resources/services.xml

<service id="DEINPLUGIN\Core\Api\DEINPLUGINController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container" />
            </call>
</service>

Ok, muss ich mal testen. In der Doku steht das aber etwas anders:

ok vergiss meine Antwort, ich habe nur Controller gelesen, meine Antwort würde sich auf einen AbstractController beziehen für eine API Route, sorry^^

Wollt nur ein eigenen Plugin-Controller fürs Frontend :slight_smile:

fear not, ich hab auch dafür ein Beispiel auf Lager

kein Problem, ich suche weiter :slight_smile:

Ich beziehe mich hier wieder auf die mir bekannten Namenskonventionen

DEINPLUGIN/src/Storefront/Controller/DEINPLUGINController.php

<?php

declare(strict_types=1);

namespace DEINPLUGIN\Storefront\Controller;

use ...

/**
 * @RouteScope(scopes={"storefront"})
 */
class DEINPLUGINController extends StorefrontController

DEINPLUGIN/src/Resources/config/routes.xml

<?xml version="1.0" encoding="UTF-8" ?>
<routes xmlns="http://symfony.com/schema/routing"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/routing
        https://symfony.com/schema/routing/routing-1.0.xsd">

    <import resource="../../**/Storefront/Controller/*Controller.php" type="annotation" />
    <import resource="../../**/Api/*Controller.php" type="annotation" />
</routes>

Um den Service zu registrieren (das ist der einzige Punkt den du in deiner Frage nicht aufgeführt hast, vielleicht haperts hier?)

<!-- // storefront controller -->
        <service id="DEINPLUGIN\Storefront\Controller\DEINPLUGINController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
</service>
1 „Gefällt mir“

Im Controller müsste der RouteScope definiert werden und bei den Methoden/für die Routen müsste entsprechend die Route Annotation verwendet werden.

Der Pfad der Resource der Controller in deiner routes.xml müsste noch angepasst werden. Je Nachdem wo deine routes.xml liegt, müsstest du den Pfad der Resource anpassen.
Sollte die routes.xml in TestPlugin/src/Resources/config/ liegen, dann müsste der Import folgendermaßen sein:

<import resource="../../Controller/*Controller.php" type="annotation" />

Der Controller muss natürlich noch in der services.xml registriert werden.

1 „Gefällt mir“

Vielen Dank für eure Antworten. Ich gehe das heute noch mal durch.

Ne, mein Frontend Test-Controller bekomme ich nicht zum laufen :frowning:

Mein Aufbau sieht jetzt so aus:

TestPlugin\Resources\config\routes.xml
TestPlugin\Resources\config\services.xml
TestPlugin\Storefront\Controller\ExampleController.php

Eintrag routes.xml

<import resource="../../Storefront/Controller/*Controller.php" type="annotation" />

Eintrag services.xml

 <services>
    <service id="TestPlugin\Storefront\Controller\ExampleController" public="true">
      <call method="setContainer">
      <argument type="service" id="service_container"/>
      </call>
    </service>
 </services>

Der Test-Controller ExampleController.php

<?php

namespace TestPlugin\Storefront\Controller;

use Exception;

use Shopware\Storefront\Controller\StorefrontController;

use Doctrine\DBAL\Connection;


class ExampleController extends StorefrontController
{

    public function __construct()
    {
    }

}

Fehler:

No route found for "GET https://www...de/example/"

Für mich sieht das alles korrekt aus. Mehr brauch es doch eigentlich nicht.

Du hast weder einen scope, noch eine Methode mit einer route definiert. Ein Beispiel wurde doch bereits verlinkt?!

Viele Grüße

1 „Gefällt mir“

Ah Mensch, komplett übersehen. Jetzt geht alles :slight_smile: Vielen Dank für die Hilfe!!!

Hallo,
ich habe ein ähnliches Problem hier mit meinem lokalen shopware test projekt
Schaut mal bitte ob Ihr seht was da fehlt oder fehlerhaft ist.

Jedes mal bekomme ich No route found for "GET http://shopware.test/example/"

ich habe jest in der console nochmal
php bin/console plugin:refresh ausgeführt, jetzt bekomem ich folgende Meldung:
Unable to load template "storefront/page/example.html.twig". (Looked into: SoundDesign, Framework, Administration, Elasticsearch, Profiling, Storefront)


ich hoffe es ist OK das ich hier in disem Thread schreibe?

Hast du den Fehler selbst gefunden? Deine Datei heißt index.html.twig und nicht example.html.twig

2 „Gefällt mir“

das und das ich in der console das plugin neu refreshen musste.
(php bin/console plugin:refresh)

1 „Gefällt mir“