Konfigurowanie trasy administratora w Magento 2

15

Patrząc na podstawowy kod Magento 2, wydaje się, że istnieją dwa sposoby skonfigurowania trasy administratora.

Pierwszy

#File: vendor/magento/module-media-storage/etc/adminhtml/routes.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="admin">
        <route id="adminhtml">
            <module name="Magento_MediaStorage" />
        </route>
    </router>
</config>

jest podobny do Magento 1. Dodajesz moduł do listy modułów na adminhtmltrasie, a Magento sprawdza go za Ciebie.

Drugi

#File: vendor/magento/module-cms/etc/adminhtml/routes.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="admin">
        <route id="cms" frontName="cms">
            <module name="Magento_Cms" before="Magento_Backend" />
        </route>
    </router>
</config>

konfigurujesz nową trasę ( cmspowyższy identyfikator ), a następnie dodajesz do niej moduł.

Czy jeden z nich jest „właściwym / preferowanym” sposobem robienia tego w Magento 2? Jeśli nie, jaka jest różnica między nimi? tzn. kiedy używałbyś jednego nad drugim?

Proszenie o nierozwiązywanie określonego problemu, ale upewnienie się, że tworzę swoje trasy we właściwy sposób i że unika się problemów podobnych do modułów Magento 1 (pobieranie bibliotek ajax, bezpieczeństwo itp.).

Alan Storm
źródło

Odpowiedzi:

23

Różnica polega na adresach URL. Adres URL ma następującą strukturę: <areaFrontName>/<moduleFrontName>/<actionPath>/<actionName>

Trasa „Adminhtml” ma moduleFrontName „admin”, tak samo jak areaFrontName. Wszystkie ścieżki w ścieżce „adminhtml” zaczną się admin/admin.

Jeśli chcesz mieć bardziej szczegółowy adres URL, powinieneś użyć określonej trasy, podobnie jak robi to katalog. Wszystkie adresy URL katalogu zaczynają się od admin/catalog. To jest preferowany sposób.

Preferowana konfiguracja to:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="admin">
        <route id="cms" frontName="cms">
            <module name="Magento_Cms"/>
        </route>
    </router>
</config>

Pamiętaj, że before="Magento_Backend"nie jest to konieczne

Anton Kril
źródło
3
czy są jakieś wyjaśnienia na temat nazewnictwa ID i frontName? czy powinno być tak samo dla obszaru administracyjnego? czy powinien używać nazwy modułu? dlaczego nie działa, gdy id! = frontName?
Sergey Korzhov
4

Natknąłem się również na to, szukając przykładów dodawania kontrolera adminhtml. Przeprowadziłem badania i oto, co znalazłem.

route id="adminhtml"Sposób stosowany jest 24 razy w rdzeniu.

before="Magento_Backend"Sposób stosowany jest 31 razy w rdzeniu.

Istnieje tylko 50 modułów z adminhtml / tras.xml, ale 24 + 31 = 55. Wskazówka nr 1.

Próbowałem znaleźć wspólny mianownik między tym, jaki typ modułów używa tego typu, ale wydaje się, że nie mogę go zidentyfikować. Może więc zmiana została wprowadzona w pewnym momencie, więc sprawdziłem synchronizację obu typów. Niestety było to dość trudne, ponieważ większość z nich była ostatnio edytowana w połowie września, aby wprowadzić nowe urny, więc musiałem użyć funkcji historii Githuba.

Zauważyłem wtedy, że niektóre pliki route.xml, w których route id="adminhtml"używana jest ta opcja, również używają before="Magento_Backend", patrz na przykład plik Rout.xml Magento_UrlRewrite . Nie mogę znaleźć żadnych rozstrzygających podobieństw między tymi trzema wariantami.

Sprawdziłem również nowe moduły (które nie były w M1 i dlatego nie mogły zostać przeniesione, ale zostały napisane jako nowe dla M2), takie jak AdvancedPricingImportExport , Integration , MediaStorage i EncryptionKey i chociaż niektóre używają, before="Magento_Backend"a niektóre nie, wszystkie używają <route id="adminhtml">tag. Spośród nich te bez tych before="Magento_Backend"zostały ostatnio zmienione w lutym 2015 r., A te z tym tagiem wszystkie były edytowane po tej dacie.

Tak więc, mój wstępny wniosek jest taki, że jest to preferowany sposób, aby to zrobić (albo wyraźnie postanowiono wewnętrznie w siedzibie Magento, albo nie);

<config xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <router id="admin">
        <route id="adminhtml">
            <module name="Your_Extension" before="Magento_Backend"/>
        </route>
    </router>
</config>

Oczywiście chciałbym usłyszeć stanowisko głównego dewelopera Magento w tej sprawie.

AKTUALIZACJA: Anton Kril odpowiedział, zobacz jego odpowiedź na preferowany sposób, aby to zrobić.

Peter Jaap Blaakmeer
źródło