Controller GET Request mit Parametern funktioniert nicht wie erwünscht

Hallo, versuche folgendermaßen eine ID zu übergeben. Das funktioniert zwar, aber nicht so, wie beabsichtigt- Durch den Aufruf https://tklustig.de/getSeoUrl/5 bekomme ich die Idee. Die URL sollte allerdings so aufgerufen werden: https://tklustig.de/getSeoUrl?id=5
Wie mache ich es richtig?
Hier der Controller Code und die service.xml

#[Route(defaults: ['_routeScope' => ['storefront']])]
class SeoUrlController extends StorefrontController
{
    #[Route(path: '/getSeoUrl/{id}', name: 'frontend.seourl', methods: ['GET','POST'])]
    public function showExample(Request $request, SalesChannelContext $context,int $id): Response
    {
        dd($id);
        return $this->renderStorefront('@WtCreateSeoUrl/storefront/page/example.html.twig', [
            'example' => 'Hello world'
        ]);
    }
}

<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
    <services>
        <service id="WtCreateSeoUrl\Storefront\Controller\SeoUrlController" public="true">
            <call method="setContainer">
                <argument type="service" id="service_container"/>
            </call>
            <call method="setTwig">
                <argument type="service" id="twig"/>
            </call>
        </service>

    </services>
</container>
P.S.: Durch letzteren Aufruf bekomme ich die Exception: NO ROUTE FOUND, im ersten ergibt der var_dump 5

{id} weglassen und den Parameter über den RequestStack abfragen.

Wenn ich Deinem Vorschlag Folge leise, wirf das folgende Exception:

Wie hinterlege ich in der service.xml das controller.service_arguments? Das bloße Anfügen durch

<argument type="service" id="service_arguments"/>

funktioniert jedenfalls nicht!

Die Signature ist nicht richtig. Und die Dependency Injection weiß nicht wie int $id eingesetzt werden soll.

Korrekt wäre :

public function showExample(Request $request, SalesChannelContext $context)

Jetzt muss Du die id aber noch aus dem Request holen.

$id = $request->get('id');

Danach kannst Du mit der ID irgendwas tun.

2 Likes

Muss ich neben der Methodensignatur die Route ändern, oder nicht? Max_shop schrieb, ich solle sie weglassen, chamwaw ging erst gar nicht darauf ein. Ich denke mal, die Route muss so bleiben, denn sonst kann der Request doch erst gar nicht korrekt verarbeitet werden,oder?

Du benötigst ja irgendeine Route. Mein „weglassen“ hat sich auf das {id} bezogen, da Symfony sonst einen Wert in der URL erwartet.

Du rufst ihn aber nicht darüber ab, sondern über das $id = $request->get(‚id‘);

Das wäre der RoutePath: /getSeoUrl

Und das $id musst du natürlich als Parameter aus der function Deklaration entfernen, da die Variable nicht mehr in der Route, sondern erst innerhalb der Funktion erstellt wird.

Wenn Du die Url so aufrufen möchtest
/getSeoUrl/[hier_eine_id]
dann ist die Route halt /getSeoUrl/{id}

Oder halt /getSeoUrl?id=[hier_eine_id]
dann wäre halt die Route nur " /getSeoUrl" die Request Parameter müssen dann NICHT in der Route angegeben werden.

Das get(‚id‘) kann dann aber beides verarbeiten.

Vielen Dank an Max_Shop und chamaw für Eure Posts! Sie haben mir geholfen, das Problem zu lösen!
Euch Beiden angenehme Feiertage!