Di sini datang penjelasan yang mudah-mudahan bagus di balik gagasan sistem perutean serta tambahan spesifik drupal untuk itu.
Gambaran umum
Komponen Symfony memiliki dua konsep penting di sini. Kernel http adalah sistem yang mendapatkan permintaan, entah bagaimana meminta sistem lain untuk menghasilkan untuk menentukan bagian dari kode yang menghasilkan output yang diminta (objek respons) dan mengirim respons kembali ke klien. Sepotong kode ini disebut controller, jadi ini bisa berupa fungsi seperti php4 murni, metode pada objek atau bahkan fungsi anonim.
Sistem yang mengetahui controller mana yang bertanggung jawab atas permintaan saat ini adalah sistem routing.
File perutean dasar
Sebagai pengembang modul, Anda menentukan daftar rute dan pengontrol yang sesuai.
Berikut adalah contoh untuk respons json:
taxonomy.autocomplete_vid:
path: '/taxonomy/autocomplete_vid/{taxonomy_vocabulary}'
defaults:
_controller: '\Drupal\taxonomy\Controller\TermAutocompleteController::autocompletePerVid'
requirements:
taxonomy_vocabulary: \d+
Sebagian besar dokumentasi symfony menyebutkan pola, tetapi drupal memutuskan untuk hanya mengizinkan kunci "path" yang tidak usang dalam file peruteannya.
Konsep kuncinya adalah pengontrol yang mendapatkan beberapa parameter dari sistem dan mengubahnya menjadi respons. Dalam contoh ini Anda memiliki parameter 'taxonomy_vocabulary'. Jadi semuanya tanpa garis bawah dianggap sebagai parameter untuk pengontrol. Jika Anda ingin menentukan nilai default, Anda memasukkannya ke dalam array default. Dalam array yml yang sama Anda menentukan kelas dan metode yang terhubung dengan '::' untuk memberi tahu sistem tempat mencari barang. Setiap properti lainnya tidak ada hubungannya dengan parameter pengontrol dan karenanya dianggap internal dan memiliki garis bawah sebagai awalan.
Symfony sendiri juga memungkinkan Anda untuk menentukan ekspresi reguler untuk memvalidasi bahwa parameter yang masuk valid (menggunakan 'persyaratan'). Di sini hanya cocok dengan angka.
Resolver pengontrol
Setelah symfony menemukan controller mana yang aktif pada permintaan saat ini, ia meminta yang disebut resolver controller untuk membuat turunan dari controller, yang dapat dieksekusi melalui call_user_func_array. Resolver controller memiliki satu metode untuk mendapatkan callable controller (objek + metode, fungsi anonim) dan satu metode untuk mendapatkan parameter yang dilewatkan ke controller, lihat Resolver controller
Ekstensi Drupal
Inilah yang pada dasarnya memberi Anda symfony.
Drupal sedikit lebih rumit:
- Anda dapat memeriksa akses ke rute. Misalnya memanggil user_access () sangat umum di Drupal 7 dan di bawah.
- Anda tidak ingin mengkonversi taxonomy_vocabulary menjadi objek entitas yang sebenarnya
- Anda tidak ingin menghasilkan respons halaman penuh, tetapi hanya "konten utama".
Pemeriksaan akses
Drupal telah memperkenalkan sistem di atas bagian symfony yang memeriksa apakah pengguna memiliki akses ke rute saat ini dan melemparkan alternatif 403 (akses ditolak). Manajer akses
Di file perutean Anda menentukan ini di bagian persyaratan. Bit yang paling umum tercantum dalam contoh:
path: '/user/{user}'
options:
_access_mode: 'ANY'
requirements:
_permission: 'access user profiles'
_entity_access: 'user.view'
_role: 'administrator'
_permission mendefinisikan panggilan ke user_access (), _role memastikan bahwa pengguna memiliki peran tertentu (Anda dapat menentukan beberapa peran melalui, untuk OR dan + untuk logika AND). _entity_access menanyakan sistem entitas apakah Anda memiliki akses untuk melihat entitas pengguna. Per default drupal memastikan bahwa Anda menambahkan checker memungkinkan Anda untuk melanjutkan, tetapi Anda dapat mengubahnya dalam opsi melalui _access_mode.
Siaran
Seperti yang disebutkan dalam cantuman yang tidak ingin Anda lakukan saat memuat entitas, lihat / user / {user} sebagai contoh. Untuk entitas, Anda pada dasarnya hanya menggunakan nama tipe entitas dan itu akan mengeksekusi entitas_load dengan ID yang diteruskan dalam URL. Manajer konverter param
Respons halaman
Seperti yang ditulis sebelum controller bertanggung jawab untuk menghasilkan objek respons. Ini akan mengerikan di Drupal karena halaman terdiri dari lebih banyak lagi seperti semua blok yang muncul di wilayahnya, html dan templat halaman dll. Oleh karena itu drupal menetapkan kunci berbeda untuk menentukan pengontrol yang mengembalikan konten halaman:
user.page:
path: '/user'
defaults:
_content: '\Drupal\user\Controller\UserController::userPage'
requirements:
_access: 'TRUE'
String yang ditentukan adalah pengontrol yang digunakan untuk menghasilkan render array untuk wilayah konten utama halaman Anda.
Tambahan lain juga merupakan cara bagaimana menangani formulir, karena mengembalikan halaman dengan formulir sedikit lebih kompleks dari sekadar array render, sehingga Anda bisa mendefinisikan _form dengan FormInterface yang bertanggung jawab atas formulir saat ini.
user.pass:
path: '/user/password'
defaults:
_form: '\Drupal\user\Form\UserPasswordForm'
requirements:
_access: 'TRUE'
Catatan: Ini mencakup poin paling penting dari sudut pandang saya, meskipun pasti ada lebih banyak poin untuk dibicarakan.
TL; DR
- Garis bawah ditentukan untuk semua yang bukan parameter untuk pengontrol. Ini datang sebagai semacam "standar" dari symfony.
- Parameter ini dikirim melalui konverter param dan diteruskan ke controller menggunakan resolver kontroler
- Drupal memiliki beberapa tambahan untuk mempermudah orang berinteraksi dengan sistem perutean symfony.