Mengapa merutekan file diisi dengan garis bawah?

24

Apa masalahnya dengan semua parameter dengan, dan tanpa, karakter garis bawah yang diawali ?

Di mana Drupal memutuskan bagaimana memproses parameter ini?

Apakah konsep ini diperkenalkan dari Symfony, atau itu baru bagi Drupal?

Contoh ( node.routing.yml ):

node.overview_types:
  path: '/admin/structure/types'
  defaults:
    _controller: '\Drupal\Core\Entity\Controller\EntityListController::listing'
    entity_type: 'node_type'
    _title: 'Content types'
  requirements:
    _permission: 'administer content types'
Daniel
sumber
2
Itu adalah konvensi Symfony . Ada artikel yang bagus di sini , temukan bit yang mengatakan Hal terakhir yang harus diperhatikan adalah makna khusus karakter garis bawah pada nama parameter. Parameter yang dimulai dengan karakter ini memiliki makna khusus
Clive
1
Clive terima kasih. Artikel ini menyebutkan "makna khusus", tetapi tidak menjelaskan ini sama sekali. Mengapa parameter non-garis bawah juga istimewa?
Daniel
1
lol, Mengapa parameter non-garis bawah juga istimewa? , itu terdengar seperti pertanyaan yang sangat eksistensial! Biasanya (hanya biasanya) variabel awalan dilakukan untuk menunjukkan var 'pribadi' (tidak mungkin di sini), atau untuk membantu menghindari penamaan tabrakan dengan kelas / metode lain / sesuatu yang lain dalam suatu sistem. Akan baik untuk melihat dokumen resmi, ya
Clive

Jawaban:

41

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.

masukkan deskripsi gambar di sini

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.
Daniel Wehner
sumber
Wow. Jawaban yang mengesankan. Mengapa parameter tertentu memiliki periode di dalamnya yang menentang penggunaan garis bawah? Misalnya user.pass(dalam contoh di atas) vs user_pass. Apakah itu konvensi symfony juga?
chrisjlee
2
Ada beberapa jenis konvensi untuk menggunakan $ module. $ Name sebagai nama mesin suatu rute. Namun tidak ada yang menganggap itu secara internal.
Daniel Wehner
Sesuai masalah di bawah ini, _content tidak digunakan sama sekali lagi, tetapi _controller adalah. Jadi contoh di bagian Respons Halaman tidak mutakhir. drupal.org/node/2378809 Jika kita ingin menampilkan data di wilayah konten halaman kita, maka controller akan menentukan array render, mirip dengan bagaimana hal itu dilakukan dalam Drupal 7. Jika kita ingin mem-bypass itu, dan membuat halaman kita dari awal, maka kita dapat mengembalikan objek Respons.
benelori
Tentu, Anda tidak dapat berharap bahwa 1,5 tahun tidak terjadi
Daniel Wehner