İş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.
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.