Yönlendirme dosyaları neden alt çizgi ile dolu?


24

Ön ekli alt çizgi karakterli olan ve olmayan tüm parametrelerin konusu nedir?

Drupal bu parametrelerin nasıl işleneceğine nerede karar veriyor?

Bu konsept Symfony'den mi tanıtıldı, yoksa Drupal için yeni mi?

Örnek ( 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'

2
Bu bir var Symfony'nin kongre . Burada iyi bir makale var , yazan kısmı bulun. Dikkat edilmesi gereken son şey, parametre adlarındaki alt çizgi karakterinin özel anlamıdır. Bu karakterle başlayan parametrelerin özel bir anlamı vardır
Clive

1
Teşekkürler Clive. Bu makale "özel anlamdan" bahseder, ancak bunu hiçbir şekilde açıklamaz. Alt çizgi olmayan parametreler de neden özel olamıyor?
Daniel,

1
lol, Neden alt çizgi olmayan parametreleri de özel olamaz? , derin varoluşsal bir soru gibi geliyor! Genellikle (sadece genellikle) önekleme değişkenleri ya 'özel' bir değişkeni belirtmek (burada pek mümkün değildir) ya da sistemdeki diğer sınıflarla / yöntemlerle / çarpışmalarla isimlendirilmekten kaçınmaya yardımcı olmak için yapılır. Resmi belgeleri görmek iyi olur, evet
Clive

Yanıtlar:


41

İşte size yönlendirme sistemi fikrinin ve buna özel drupal eklemelerin ardındaki umut verici bir açıklama.

Genel Bakış

Symfony bileşenleri burada iki önemli konsepte sahiptir. Http çekirdeği, isteği alan bir sistemdir, bir şekilde diğer sistemlerden, istenen çıktıyı üreten bir kod parçasını (bir yanıt nesnesi) tanımlamasını ve yanıtı müşteriye geri göndermesini isteyin. Bu kod parçasına denetleyici denir, bu yüzden ya saf bir php4 benzeri işlev, bir nesnedeki bir yöntem ya da anonim bir işlev olabilir.

Mevcut istek için hangi kontrol cihazının sorumlu olduğunu bilen sistem, yönlendirme sistemidir.

görüntü tanımını buraya girin

Temel yönlendirme dosyası

Modül geliştiricisi olarak, rota listesini ve ilgili kontrol cihazlarını tanımlarsınız.

İşte bir json yanıtı için bir örnek:

taxonomy.autocomplete_vid:
  path: '/taxonomy/autocomplete_vid/{taxonomy_vocabulary}'
  defaults:
    _controller: '\Drupal\taxonomy\Controller\TermAutocompleteController::autocompletePerVid'
  requirements:
    taxonomy_vocabulary: \d+

Symfony belgelerinin çoğu modelden bahseder, ancak drupal, yönlendirme dosyasında kullanımdan kaldırılan "yol" anahtarına yalnızca izin vermeye karar verdi.

Anahtar kavram sistemden bazı parametreleri alan ve bunları cevaba çeviren denetleyicidir. Bu örnekte 'taxonomy_vocabulary' parametresine sahipsiniz. Bu yüzden alt çizgi içermeyen her şey kontrol cihazının bir parametresi olarak kabul edilir. Varsayılan bir değer belirtmek istiyorsanız, bunu defaults dizisine koyun. Aynı yml dizisinde, sisteme nereye bakılacağını anlatmak için '::' ile bağlantılı sınıf ve yöntemi belirtirsiniz. Diğer tüm özelliklerin denetleyici parametreleriyle hiçbir ilgisi yoktur ve bu nedenle içsel olarak kabul edilir ve önek olarak bir alt çizgi vardır.

Symfony'nin kendisi de gelen parametrenin geçerli olduğunu doğrulamak için normal ifadeler tanımlamanıza izin verir ('gereksinimler' kullanarak). Burada sadece sayılarla eşleşir.

Denetleyici çözücü

Symfony, mevcut istek üzerinde hangi kontrol cihazının aktif olduğunu öğrendiğinde, call_user_func_array aracılığıyla çalıştırılabilen kontrol cihazı örneği oluşturması için kontrol cihazı çözümleyicisine sorulur. Denetleyici çözümleyicisinin denetleyicinin çağrılabilir duruma getirilmesi için bir yöntem (nesne + yöntemi, adsız işlev) ve denetleyiciye iletilen parametreleri almak için bir yöntem vardır, bkz. Denetleyici çözümleyicisi

Drupal uzantıları

Bu temelde symfony'nin size verdiği şey.

Drupal olsa biraz daha karmaşık:

  • Rotaya erişimi kontrol edebilirsiniz. Örneğin, user_access () işlevini çağırmak Drupal 7 ve altında çok yaygındı.
  • Taxonomy_vocabulary öğesini gerçek varlık nesnesine dönüştürmek istemezsiniz
  • Tam sayfa yanıtını oluşturmak istemezsiniz, yalnızca "ana içeriği" isteyin.

Erişim kontrolü

Drupal, kullanıcının mevcut rotaya erişip erişmediğini kontrol eden symfony parçalarının üzerine bir sistem sundu ve alternatif bir 403 (erişim reddedildi) istisnası attı. Erişim yöneticisi

Yönlendirme dosyasında bunu gereksinimler bölümünde belirtirsiniz. En yaygın bitler örnekte listelenmiştir:

  path: '/user/{user}'
  options:
    _access_mode: 'ANY'
  requirements:
    _permission: 'access user profiles'
    _entity_access: 'user.view'
    _role: 'administrator'

_permission, user_access () çağrısını tanımlar, _role, kullanıcının belirli bir rolü olmasını sağlar (birden fazla olanı, OR için ve AND için + mantığı için belirleyebilirsiniz). _entity_access varlık sistemine kullanıcı varlığını görüntüleme erişiminiz olup olmadığını sorar. Varsayılan olarak drupal, erişim denetimi eklemenizi sağlar; ilerlemenizi sağlar, ancak bunu _access_mode aracılığıyla seçeneklerde değiştirebilirsiniz.

Upcasting

Listede belirtildiği gibi, bir varlık yüklemeye dikkat etmek istemiyorsanız, örnek olarak / user / {user} bölümüne bakın. Temelde varlık türünün adını kullandığınız varlıklar için, URL’de geçirilen kimliğe sahip bir entity_load yürütür. Param dönüştürücü yöneticisi

Sayfa yanıtı

Kontrolörden önce yazıldığı gibi, cevap nesnesinin oluşturulmasından sorumludur. Bu sayfa Drupal’da korkunç olacaktır, çünkü bir sayfa kendi bölgelerinde görünen tüm bloklar, html ve sayfa şablonları vb.

user.page:
  path: '/user'
  defaults:
    _content: '\Drupal\user\Controller\UserController::userPage'
  requirements:
    _access: 'TRUE'

Tanımlanan dize, sayfanızın ana içerik bölgesi için oluşturma dizisini oluşturmak için kullanılan denetleyicidir.

Başka bir ek de formla başa çıkmanın yoludur, çünkü formlu bir sayfa döndürmek sadece bir render dizisinden biraz daha karmaşıktır, böylece mevcut formdan sorumlu FormInterface ile _form tanımlayabilirsiniz.

user.pass:
  path: '/user/password'
  defaults:
    _form: '\Drupal\user\Form\UserPasswordForm'
  requirements:
    _access: 'TRUE'

Not: Bu konu benim açımdan en önemli noktaları kapsıyor, ancak konuşacak çok daha fazla nokta var.

TL; DR

  • Denetleyiciye parametre olmayan her şey için alt çizgiler belirlenir. Bu, symfony'den bir çeşit "standart" olarak geliyor.
  • Bu parametreler param dönüştürücü ile yukarı yüklenir ve denetleyici çözümleyicisi kullanılarak denetleyiciye iletilir
  • Drupal, insanların symfony yönlendirme sistemiyle etkileşime geçmesini kolaylaştıracak bazı eklemelere sahiptir.

Vay. Etkileyici cevap Bazı parametrelerde neden alt çizgi kullanmanın aksine zamanlar var? Örneğin, user.pass(yukarıdaki örnekte) karşı user_pass. Bu bir simbiyoz sözleşmesi mi?
chrisjlee

2
Bir yolun makine adı olarak $ module. $ Name kullanmak için bir tür kural vardır. Hiçbir şey, bunun dahili olarak olduğunu varsaymaz.
Daniel Wehner

Aşağıdaki konuya göre, _content artık hiç kullanılmamaktadır, ancak _kontrolördür. Dolayısıyla, Sayfa Yanıtı bölümündeki örnek güncel değil. drupal.org/node/2378809 Verileri sayfamızın içerik bölgesinde görüntülemek istiyorsak, kontrolör Drupal 7'deki gibi bir render dizisi tanımlayacaktır. 7. Bunu atlamak ve sayfamızı oluşturmak istiyorsak sıfırdan bir Response nesnesini geri döndürebiliriz.
benelori

Tabii ki, 1,5 yıl olmamasını bekleyemezsiniz
Daniel Wehner
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.