यहां रूटिंग सिस्टम के विचार के साथ-साथ इसके लिए विशिष्ट विशिष्ट परिवर्धन के पीछे एक उम्मीद से अच्छी व्याख्या है।
सामान्य अवलोकन
सिम्फनी के घटकों की दो महत्वपूर्ण अवधारणाएँ हैं। Http कर्नेल एक प्रणाली है जिसे अनुरोध प्राप्त होता है, किसी तरह अन्य प्रणालियों से कोड के टुकड़े को परिभाषित करने के लिए उत्पादन करने के लिए कहता है जो अनुरोधित आउटपुट (एक प्रतिक्रिया वस्तु) का उत्पादन करता है और ग्राहक को प्रतिक्रिया भेजता है। कोड के इस टुकड़े को नियंत्रक कहा जाता है, इसलिए यह या तो फ़ंक्शन की तरह एक शुद्ध php4 हो सकता है, एक वस्तु पर एक विधि या यहां तक कि एक अनाम फ़ंक्शन भी हो सकता है।
सिस्टम जो जानता है कि वर्तमान अनुरोध के लिए कौन सा नियंत्रक जिम्मेदार है, रूटिंग सिस्टम है।
बेसिक रूटिंग फ़ाइल
मॉड्यूल डेवलपर के रूप में आप मार्गों की सूची और संबंधित नियंत्रकों को परिभाषित करते हैं।
यहाँ एक प्रतिक्रिया के लिए एक उदाहरण है:
taxonomy.autocomplete_vid:
path: '/taxonomy/autocomplete_vid/{taxonomy_vocabulary}'
defaults:
_controller: '\Drupal\taxonomy\Controller\TermAutocompleteController::autocompletePerVid'
requirements:
taxonomy_vocabulary: \d+
अधिकांश सिम्फनी दस्तावेज़ीकरण पैटर्न का उल्लेख करते हैं, लेकिन ड्रुपल ने अपनी रूटिंग फ़ाइल में नॉन-डिप्रेक्टेड "पथ" कुंजी को अनुमति देने का निर्णय लिया।
प्रमुख अवधारणा नियंत्रक है जो सिस्टम से कुछ पैरामीटर प्राप्त करता है और उन्हें प्रतिक्रिया में परिवर्तित करता है। इस उदाहरण में आपके पास 'taxonomy_vocabulary' पैरामीटर है। इसलिए अंडरस्कोर के बिना सब कुछ कंट्रोलर के लिए एक पैरामीटर माना जाता है। यदि आप एक डिफ़ॉल्ट मान निर्दिष्ट करना चाहते हैं, तो आप इसे डिफ़ॉल्ट सरणी में डालते हैं। उसी yml सरणी में आप सिस्टम को बताने के लिए '::' से जुड़े वर्ग और विधि को निर्दिष्ट करते हैं जहां सामान को देखना है। प्रत्येक अन्य संपत्ति का नियंत्रक मापदंडों से कोई लेना-देना नहीं है और इसलिए इसे आंतरिक माना जाता है और इसलिए उपसर्ग के रूप में एक अंडरस्कोर है।
सिम्फनी ही आपको नियमित अभिव्यक्तियों को परिभाषित करने की अनुमति देती है कि आने वाला पैरामीटर वैध है ('आवश्यकताओं' का उपयोग करके)। यहाँ यह केवल संख्याओं से मेल खाता है।
नियंत्रक रिवाल्वर
एक बार सिम्फनी पता चला कि वर्तमान अनुरोध पर कौन सा नियंत्रक सक्रिय है, यह तथाकथित नियंत्रक रिज़ॉल्वर को नियंत्रक का एक उदाहरण बनाने के लिए कहता है, जिसे call_user_func_array के माध्यम से निष्पादित किया जा सकता है। कंट्रोलर रिज़ॉल्वर के पास कंट्रोलर कॉल करने योग्य (ऑब्जेक्ट + मेथड, अनाम फ़ंक्शन) प्राप्त करने के लिए एक तरीका है और कंट्रोलर को दिए गए मापदंडों को प्राप्त करने के लिए एक तरीका कंट्रोलर रिज़ॉल्वर देखें
Drupal एक्सटेंशन
यह मूल रूप से आपको क्या सहानुभूति देता है।
ड्रुपल हालांकि थोड़ा अधिक जटिल है:
- आप मार्ग तक पहुंच की जांच कर सकते हैं। उदहारण के लिए user_access () Drupal 7 और उसके बाद के संस्करण में बहुत आम था।
- आप वर्गीकरण इकाई को उसकी वास्तविक इकाई वस्तु में परिवर्तित नहीं करना चाहते हैं
- आप पूर्ण पृष्ठ प्रतिक्रिया उत्पन्न नहीं करना चाहते हैं, लेकिन सिर्फ "मुख्य सामग्री"।
पहुंच जाँच करें
Drupal ने सिम्फनी भागों के शीर्ष पर एक प्रणाली शुरू की है जो यह जांचता है कि क्या उपयोगकर्ता के पास वर्तमान मार्ग और वैकल्पिक फेंक 403 (एक्सेस अस्वीकृत) अपवाद है। पहुंच प्रबंधक
रूटिंग फ़ाइल में आप इसे आवश्यकताओं के हिस्से में निर्दिष्ट करते हैं। सबसे आम बिट्स उदाहरण में सूचीबद्ध हैं:
path: '/user/{user}'
options:
_access_mode: 'ANY'
requirements:
_permission: 'access user profiles'
_entity_access: 'user.view'
_role: 'administrator'
_permission user_access () के लिए कॉल को परिभाषित करता है, _role सुनिश्चित करता है कि उपयोगकर्ता की एक निश्चित भूमिका है (आप OR और + के लिए AND तर्क के माध्यम से कई लोगों को निर्दिष्ट कर सकते हैं)। _entity_access इकाई प्रणाली से पूछता है कि क्या आपके पास उपयोगकर्ता इकाई को देखने के लिए पहुँच है। प्रति डिफ़ॉल्ट ड्रुपल सुनिश्चित करता है कि आप एक्सेस चेकर्स को जोड़ते हैं, जिससे आप आगे बढ़ सकते हैं, लेकिन आप इसे _access_bode के माध्यम से विकल्पों में बदल सकते हैं।
upcasting
जैसा कि लिस्टिंग में बताया गया है कि आप किसी इकाई को लोड करने के बारे में ध्यान नहीं रखना चाहते, उदाहरण के लिए / उपयोगकर्ता / {उपयोगकर्ता} देखें। संस्थाओं के लिए आप मूल रूप से केवल इकाई प्रकार के नाम का उपयोग करते हैं और यह URL में दर्ज आईडी के साथ एक Unit_load निष्पादित करेगा। परम कनवर्टर प्रबंधक
पृष्ठ की प्रतिक्रिया
जैसा कि नियंत्रक से पहले लिखा गया है कि प्रतिक्रिया वस्तु उत्पन्न करने के लिए जिम्मेदार है। यह Drupal में भयानक होगा क्योंकि एक पृष्ठ में बहुत कुछ होता है जैसे कि इसके क्षेत्रों में दिखाई देने वाले सभी ब्लॉक, html और पेज टेम्प्लेट आदि। इसलिए ड्रुपल ने एक नियंत्रक निर्दिष्ट करने के लिए एक अलग कुंजी निर्दिष्ट की है जो पृष्ठ की सामग्री को लौटाता है:
user.page:
path: '/user'
defaults:
_content: '\Drupal\user\Controller\UserController::userPage'
requirements:
_access: 'TRUE'
परिभाषित स्ट्रिंग आपके पेज के मुख्य सामग्री क्षेत्र के लिए रेंडर सरणी उत्पन्न करने के लिए उपयोग किया जाने वाला नियंत्रक है।
एक और जोड़ यह भी है कि फॉर्म से कैसे निपटना है, क्योंकि फॉर्म के साथ पेज को वापस करना सिर्फ रेंडर ऐरे की तुलना में थोड़ा अधिक जटिल है, इसलिए आप मौजूदा फॉर्म के लिए जिम्मेदार फॉर्मइंटरफेस के साथ _form को परिभाषित कर सकते हैं।
user.pass:
path: '/user/password'
defaults:
_form: '\Drupal\user\Form\UserPasswordForm'
requirements:
_access: 'TRUE'
नोट: यह मेरे दृष्टिकोण से सबसे महत्वपूर्ण बिंदुओं को कवर करता है, हालांकि इस बारे में बात करने के लिए निश्चित रूप से कई और बिंदु हैं।
टी एल; डॉ
- अंडरस्कोर उन सभी चीजों के लिए निर्दिष्ट किया जाता है जो नियंत्रक के लिए पैरामीटर नहीं हैं। यह सहानुभूति से "मानक" की तरह आ रहा है।
- इन मापदंडों को परम कनवर्टर के माध्यम से उकेरा जाता है और नियंत्रक रिज़ॉल्वर का उपयोग करके नियंत्रक को दिया जाता है
- ड्रुपल के पास कुछ जोड़ हैं जो लोगों को सिम्फनी रूटिंग सिस्टम के साथ बातचीत करना आसान बनाते हैं।