Menyiapkan Rute Admin di Magento 2

15

Melihat kode inti Magento 2, tampaknya ada dua cara mengatur rute admin.

Pertama

#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>

mirip dengan Magento 1. Anda menambahkan modul Anda ke daftar modul di adminhtmlrute, dan Magento memeriksanya untuk Anda.

Kedua

#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>

Anda telah mengatur rute baru (id di cmsatas), dan kemudian menambahkan modul Anda ke sana.

Apakah salah satu dari ini adalah cara "benar / disukai" dalam melakukan ini di Magento 2? Jika tidak, apa bedanya keduanya? yaitu kapan Anda akan menggunakan satu di atas yang lain?

Meminta untuk tidak memecahkan masalah tertentu, tetapi untuk memastikan saya membuat rute saya dengan cara yang benar dan bahwa masalah yang mirip dengan modul Magento 1 (menarik perpustakaan ajax, keamanan, dll.) Dihindari.

Alan Storm
sumber

Jawaban:

23

Perbedaannya ada di url. Url memiliki struktur sebagai berikut: <areaFrontName>/<moduleFrontName>/<actionPath>/<actionName>

Rute "Adminhtml" memiliki moduleFrontName "admin", sama seperti areaFrontName. Jadi semua jalur di bawah rute "adminhtml" akan dimulai dengan admin/admin.

Jika Anda ingin memiliki url yang lebih spesifik, Anda harus menggunakan rute tertentu, seperti katalog. Url katalog semuanya dimulai dengan admin/catalog. Ini adalah cara yang disukai.

Jadi konfigurasi yang disukai adalah:

<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>

Catatan yang before="Magento_Backend"tidak diperlukan

Anton Kril
sumber
3
apakah ada penjelasan tentang ID penamaan dan nama depan? haruskah itu sama untuk area admin? haruskah itu menggunakan nama modul? mengapa tidak berfungsi saat id! = frontName?
Sergey Korzhov
4

Saya menemukan ini juga sambil mencari contoh cara menambahkan controller adminhtml. Saya melakukan riset dan inilah yang saya temukan.

The route id="adminhtml"cara digunakan 24 kali dalam inti.

Itu before="Magento_Backend" cara digunakan 31 kali dalam inti.

Hanya ada 50 modul dengan adminhtml / routes.xml tetapi 24 + 31 = 55. Petunjuk # 1.

Saya mencoba mencari penyebut yang sama antara jenis modul apa yang menggunakan tipe apa, tapi sepertinya saya tidak bisa mengidentifikasi. Jadi mungkin perubahannya diperkenalkan pada titik waktu tertentu, jadi saya memeriksa waktunya pada dua jenis. Sayangnya ini cukup sulit karena kebanyakan dari mereka diedit pertengahan September untuk memperkenalkan guci baru jadi saya harus menggunakan fungsi sejarah Github.

Saya kemudian memperhatikan beberapa file routes.xml di mana route id="adminhtml"opsi digunakan juga menggunakan before="Magento_Backend", lihat misalnya file tables.xml Magento_UrlRewrite . Sepertinya saya tidak dapat menemukan kesamaan konklusif antara ketiga varian.

Saya juga memeriksa modul-modul baru (yang tidak dalam M1 dan karena itu tidak dapat porting tetapi ditulis baru untuk M2), seperti AdvancedPricingImportExport , Integrasi , MediaStorage dan EncryptionKey dan meskipun beberapa menggunakan before="Magento_Backend"dan beberapa tidak, mereka semua menggunakan yang <route id="adminhtml">tag. Di antara ini, yang tanpa before="Magento_Backend"yang terakhir diubah pada Februari 2015 sementara yang dengan tag itu semua diedit setelah tanggal itu.

Jadi, kesimpulan awal saya adalah bahwa ini adalah cara yang disukai untuk melakukannya (baik secara eksplisit diputuskan secara internal di Magento HQ atau tidak);

<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>

Saya ingin mendengar posisi inti Magento tentang ini, jelas.

PEMBARUAN: Anton Kril menjawab, lihat jawabannya untuk cara yang disukai untuk melakukan ini.

Peter Jaap Blaakmeer
sumber