राउटर फ़ाइलों को अंडरस्कोर से क्यों भरा जाता है?


24

एक पूर्वसर्गित अंडरस्कोर वर्ण के साथ और उसके बिना सभी मापदंडों के साथ क्या सौदा है ?

द्रुपाल ने कहां तय किया कि इन मापदंडों को कैसे संसाधित किया जाए?

क्या इस अवधारणा को सिम्फनी से पेश किया गया था, या यह ड्रुपल के लिए नया है?

उदाहरण ( node.rout.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
यह एक सिम्फनी सम्मेलन है । यहाँ एक अच्छा लेख है , बिट को कहते हैं कि ध्यान देने योग्य बात यह है कि पैरामीटर नामों में अंडरस्कोर वर्ण का विशेष अर्थ है। पैरामीटर है कि इस चरित्र के साथ शुरू विशेष अर्थ नहीं होता
क्लाइव

1
धन्यवाद क्लाइव। इस लेख में "विशेष अर्थ" का उल्लेख है, लेकिन यह बिल्कुल भी स्पष्ट नहीं करता है। कठबोली गैर-अंडरस्कोर पैरामीटर भी विशेष क्यों हैं?
डैनियल

1
योग्य, क्यों नॉन-अंडरस्कोर पैरामीटर विशेष नहीं हो सकते? , कि एक गहरे अस्तित्व के सवाल की तरह लगता है! आमतौर पर (आम तौर पर) पूर्व-चर चर या तो 'निजी' संस्करण (यहां पर असंभावित) को इंगित करने के लिए किया जाता है, या सिस्टम में अन्य वर्गों / विधियों / कुछ और के साथ नामकरण टकराव से बचने में मदद करने के लिए किया जाता है। आधिकारिक डॉक्स को देखने के लिए अच्छा होगा हाँ
क्लाइव

जवाबों:


41

यहां रूटिंग सिस्टम के विचार के साथ-साथ इसके लिए विशिष्ट विशिष्ट परिवर्धन के पीछे एक उम्मीद से अच्छी व्याख्या है।

सामान्य अवलोकन

सिम्फनी के घटकों की दो महत्वपूर्ण अवधारणाएँ हैं। 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'

नोट: यह मेरे दृष्टिकोण से सबसे महत्वपूर्ण बिंदुओं को कवर करता है, हालांकि इस बारे में बात करने के लिए निश्चित रूप से कई और बिंदु हैं।

टी एल; डॉ

  • अंडरस्कोर उन सभी चीजों के लिए निर्दिष्ट किया जाता है जो नियंत्रक के लिए पैरामीटर नहीं हैं। यह सहानुभूति से "मानक" की तरह आ रहा है।
  • इन मापदंडों को परम कनवर्टर के माध्यम से उकेरा जाता है और नियंत्रक रिज़ॉल्वर का उपयोग करके नियंत्रक को दिया जाता है
  • ड्रुपल के पास कुछ जोड़ हैं जो लोगों को सिम्फनी रूटिंग सिस्टम के साथ बातचीत करना आसान बनाते हैं।

वाह। प्रभावशाली उत्तर। अंडरस्कोर का उपयोग करने के विरोध में कुछ मापदंडों के कारण उनमें अवधि क्यों होती है? जैसे user.pass(ऊपर उदाहरण में) बनाम user_pass। क्या वह सहानुभूति सम्मेलन भी है?
क्रिसजली

2
$ मॉड्यूल का उपयोग करने के लिए किसी प्रकार का सम्मेलन है। एक मार्ग के मशीन नाम के रूप में $ नाम। हालांकि कुछ भी नहीं है कि आंतरिक रूप से मानता है।
डैनियल वेनर

नीचे दिए गए मुद्दे के अनुसार, _content का उपयोग अब और नहीं किया जाता है, लेकिन _controller है। इसलिए पेज रिस्पांस भाग में उदाहरण तारीख तक नहीं है। drupal.org/node/2378809 यदि हम अपने पृष्ठ के सामग्री क्षेत्र में डेटा प्रदर्शित करना चाहते हैं, तो नियंत्रक एक रेंडर सरणी को परिभाषित करेगा, इसी तरह यह Drupal 7 में कैसे किया जाता है। खरोंच से, तो हम एक प्रतिक्रिया वस्तु वापस कर सकते हैं।
बेनेलोरी

ठीक है, आप उम्मीद नहीं कर सकते कि 1.5 साल नहीं होगा
डैनियल वीनर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.