Magento 2 Custom No Route Handler

7

Ich habe einen benutzerdefinierten No-Route-Handler mit dem folgenden Code hinzugefügt

<?xml version="0.1"?>
<config>
    <type name="Magento\Framework\App\Router\NoRouteHandlerList">
        <arguments>
            <argument name="handlerClassesList" xsi:type="array">
                <item name="hello" xsi:type="array">
                    <item name="class" xsi:type="string">Smartie\HelloRouter\App\Router\NoRouteHandler</item>
                    <item name="sortOrder" xsi:type="string">10</item>
                </item>
            </argument>
        </arguments>
    </type>
</config>

Was alles gut ist, fügt es den Handler hinzu und ich habe es durch bewiesen

<?php

namespace Smartie\HelloRouter\App\Router;

class NoRouteHandler implements \Magento\Framework\App\Router\NoRouteHandlerInterface
{
    public function process(\Magento\Framework\App\RequestInterface $request)
    {
        die('woop');
    }
}

Was mir jedoch aufgefallen ist, ist, dass wenn ich in der Prozessfunktion false zurückgebe, der Front-Controller 100 Router-Match-Iterationen erreicht hat . Nach dem Betrachten der NoRouteHandlerList scheint es, dass durch Hinzufügen meines neuen No-Route-Handlers tatsächlich alle bereits hinzugefügten No-Route-Handler (der Standard-Handler) ersetzt werden, und ich habe mich gefragt, warum?

Der folgende ähnliche Code zum Hinzufügen eines neuen Routers hat den Effekt, dass ein neuer Router an die Liste angehängt wird

<type name="Magento\Framework\App\RouterList">
    <arguments>
        <argument name="routerList" xsi:type="array">
            <item name="custom" xsi:type="array">
                <item name="class" xsi:type="string">Smartie\HelloRouter\Controller\Router</item>
                <item name="disable" xsi:type="boolean">false</item>
                <item name="sortOrder" xsi:type="string">20</item>
            </item>
        </argument>
    </arguments>
</type>

Hinweis : Dies ist Magento 2 Version 0.74.0-beta16

Smartie
quelle
Ich habe versucht, die Probleme zu reproduzieren und kann es nicht. Vielleicht sollten Sie Magento auf die neueste Version aktualisieren.
KAndy

Antworten:

4

Ich bin auch darauf gestoßen. Der Kern des Problems wird hier in der Dokumentation behandelt:

http://devdocs.magento.com/guides/v2.0/extension-dev-guide/depend-inj.html#dep-inj-mod-type-args

Wenn die Konfigurationsdateien für einen bestimmten Bereich zusammengeführt werden, werden Array-Argumente mit demselben Namen zu einem neuen Array zusammengeführt. Wenn eine neue Konfiguration zu einem späteren Zeitpunkt geladen wird, entweder in einem spezifischeren Bereich oder über Code, ersetzen alle Array-Definitionen in der neuen Konfiguration die zuvor geladene Konfiguration vollständig, anstatt zusammengeführt zu werden.

(Hervorhebung von mir)

In meinem Fall habe ich einen benutzerdefinierten NoRouteHandler hinzugefügt {module}/etc/frontend/di.xml, während die Core-Handler in definiert sind {module}/etc/di.xml. Da 'Frontend' ein spezifischerer Bereich ist, hat mein benutzerdefinierter Handler die Core-Handler ersetzt, anstatt sie zu ergänzen.

Verschieben Sie Ihren di.xmlvon dem Konfigurationsbereich, in dem Sie ihn haben, in den etcOrdner, und alles wird gut.

Siehe auch:

  • app / code / Magento / Backend / etc / di.xml
  • app / code / Magento / Store / etc / di.xml
Ryan Hoerr
quelle