9.6. पेरामीटर के साथ रूट
हम URL में पेरामीटर्स का उपयोग रूट्स के लिए कर सकते हैं। ये ठीक उसी तरह काम करते हैं जैसे कि Views में कांटेक्स्चुअल फ़िल्टर्स। हम उदाहरण के लिए URL में विभिन्न एंटिटी के ID, टेक्स्ट स्ट्रिंग्स या कॉमा या प्लस द्वारा अलग किए गए अनुक्रमिक ID पास कर सकते हैं। इस पाठ में, हम नोड का ID पास करेंगे और इस नोड के शीर्षक और बॉडी को सामग्री में प्रदर्शित करेंगे।
कोड उदाहरण GitHub पर देखे जा सकते हैं:
https://github.com/levmyshkin/drupalbook8
आइए हम अपने drupalbook.routing.yml मॉड्यूल फ़ाइल में रूट जोड़ें:
drupalbook.display_node:
path: '/display-node/{node}'
defaults:
_controller: '\Drupal\drupalbook\Controller\DisplayNode::content'
_title_callback: '\Drupal\drupalbook\Controller\DisplayNode::getTitle'
requirements:
_custom_access: '\Drupal\drupalbook\Controller\DisplayNode::access'
options:
parameters:
node:
type: entity:node
यहां path में हम दूसरा तर्क {node} पास करते हैं, URL में हम सामान्य ID लिखेंगे: /display-node/101, लेकिन तैयार नोड ऑब्जेक्ट हमारे कंट्रोलर में आएगा। इसके लिए, हम options में parameters निर्दिष्ट करते हैं कि इन पेरामीटर्स को क्या पास किया जाएगा और क्या आउटपुट होगा।
options:
parameters:
node: # तर्क का नाम, जो {} के बीच है, यह node1, node2 हो सकता है, यदि हम दो अलग-अलग तर्क पास करें।
type: entity: node # आउटपुट क्या होगा, हम इस एंटिटी का ऑब्जेक्ट कंट्रोलर के अंदर उपयोग कर सकते हैं।
मैंने यह भी निर्धारित किया कि हम _title_callback पेरामीटर का उपयोग करके हेडर को किस विधि में प्रदर्शित करेंगे। और हम लेखों को गुमनाम उपयोगकर्ताओं के लिए आउटपुट में सीमित करेंगे, इसके लिए हम _custom_access पेरामीटर का उपयोग करते हैं जिसमें हम निर्दिष्ट करते हैं कि हम विभिन्न प्रतिबंध कहां लागू करेंगे।
अब जब हम रूट का विवरण समझ गए हैं, तो आइए इस रूट के लिए एक क्लास लिखने पर आगे बढ़ें।
modules/custom/drupalbook/src/Controller/DisplayNode.php:
<?php
/**
* @file
* Contains \Drupal\drupalbook\Controller\DisplayNode.
*/
namespace Drupal\drupalbook\Controller;
use Drupal\Core\Access\AccessResult;
use Drupal\node\NodeInterface;
/**
* Provides route responses for the DrupalBook module.
*/
class DisplayNode {
/**
* Returns a simple page.
*
* @return array
* A simple renderable array.
*/
public function content(NodeInterface $node) {
$element = array(
'#markup' => $node->body->value,
);
return $element;
}
/**
* Checks access for this controller.
*/
public function access(NodeInterface $node) {
$user = \Drupal::currentUser();
if ($node->getType() == 'article' && !in_array('authenticated', $user->getRoles())) {
return AccessResult::forbidden();
}
return AccessResult::allowed();
}
/**
* Returns a page title.
*/
public function getTitle(NodeInterface $node) {
return $node->getTitle();
}
}
मैंने अपनी रूट के लिए एक अलग क्लास बनाई, ताकि सब कुछ एक ही कंट्रोलर क्लास में न आए। आइए देखें कि इन लाइनों का क्या अर्थ है।
\drupalbook\Controller;
हम यह निर्दिष्ट करते हैं कि हमारा कंट्रोलर फ़ाइल कहाँ स्थित है।
\Core\Access\AccessResult;
use Drupal\node\NodeInterface;
हम AccessResult क्लास फ़ाइलों को शामिल करते हैं - हम इसका उपयोग 403 त्रुटि आउटपुट करने के लिए करेंगे और NodeInterface - हम इसका उपयोग नोड ऑब्जेक्ट प्राप्त करने के लिए करेंगे, जो हमारे कंट्रोलर के पेरामीटर विधि में पास किया जाएगा।
function content(NodeInterface $node) {
$element = array(
'#markup' => $node->body->value,
);
return $element;
}
यहां ध्यान दें कि पेरामीटर में, हम नोड ऑब्जेक्ट प्राप्त करते हैं, Drupal स्वयं URL से ID को परिवर्तित करता है और हमें ऑब्जेक्ट पास करता है, ताकि हम नोड ऑब्जेक्ट को फिर से लोड न करें, बल्कि इसे सीधे प्राप्त करें जहाँ हमें इसकी आवश्यकता है। $node->body->value, यह हम नोड से फ़ील्ड मान प्राप्त करते हैं, लेकिन हम ऑब्जेक्ट्स के साथ काम करने के बारे में अगले पाठ में विस्तार से जानेंगे जब हम Entity API का विश्लेषण करेंगे। और अंत में, हम #markup के साथ एक एरे वापस करते हैं ताकि हमारा नोड टेक्स्ट पेज पर प्रदर्शित हो सके।
function access(NodeInterface $node) {
$user = \Drupal::currentUser();
if ($node->getType() == 'article' && !in_array('authenticated', $user->getRoles())) {
return AccessResult::forbidden();
}
return AccessResult::allowed();
}
पहले हम Drupal की currentUser() विधि का उपयोग करते हैं ताकि वर्तमान उपयोगकर्ता ऑब्जेक्ट प्राप्त किया जा सके, फिर हम इस ऑब्जेक्ट का उपयोग करके वर्तमान उपयोगकर्ता की भूमिकाएं प्राप्त करेंगे। if चेक में, हम अपने नोड के सामग्री प्रकार और उपयोगकर्ता की भूमिका की जांच करते हैं, गुमनाम उपयोगकर्ताओं को 403 त्रुटि प्राप्त होगी, अगर सब कुछ ठीक है, तो हम आगे बढ़ेंगे और allowed() रिटर्न करेंगे, यानी हम अपनी जाँच को स्वीकृत कर देंगे। आइए AccessResult क्लास को खोलें और देखें कि इस क्लास के पास और कौन सी विधियाँ हैं। इसके लिए, PhpStorm में आपको शिफ्ट दबाकर दो बार क्लास का नाम दर्ज करना होगा:
यहां आप निम्नलिखित अनुमति जांच विधियाँ पा सकते हैं:
neutral allowed forbidden allowedIf forbiddenIf allowedIfHasPermission allowedIfHasPermissions isAllowed isForbidden isNeutral orIf andIf
आप allowedIfHasPermission() के साथ प्रयोग कर सकते हैं, उदाहरण के लिए, और अपनी रूट के लिए विभिन्न भूमिकाओं के लिए अलग-अलग अनुमतियाँ सेट कर सकते हैं। उदाहरण के लिए, अपने मॉड्यूल में एक नई अनुमति बनाएं और इसे कंट्रोलर में उपयोग करें। हालांकि, यह आसान है, निश्चित रूप से, अनुमति को रूट की yml फ़ाइल में उपयोग करना। लेकिन AccessResult क्लास के माध्यम से, आप सामग्री तक पहुँचने के लिए लचीली लॉजिक का वर्णन कर सकते हैं, उदाहरण के लिए, "सामग्री तक पहुँच केवल प्रमाणित उपयोगकर्ताओं को 12 बजे से 4 बजे तक दी जाती है, और प्रीमियम खाता भूमिका वाले उपयोगकर्ताओं को चौबीसों घंटे।" प्रयोग करें और लेख नोड्स के लिए इस पहुँच अधिकार का विभाजन लागू करें।
जैसा कि आप देख सकते हैं, Drupal सामग्री तक पहुँच लागू करने के कई तरीके प्रदान करता है, जो सुविधाजनक है क्योंकि 99% मामलों में केवल एक अनुमति का उपयोग होता है और यह पहुँच अधिकारों को विभाजित करने के लिए पर्याप्त होता है।
function getTitle(NodeInterface $node) {
return $node->getTitle();
}
यहां हम बस नोड का नाम शीर्षक के रूप में वापस करते हैं, लेकिन हम अपने कॉलबैक की क्षमताओं का विस्तार कर सकते हैं। उदाहरण के लिए, इस तरह:
function getTitle(NodeInterface $node) {
$user = \Drupal::currentUser();
if ($node->getType() == 'article' && !in_array('authenticated', $user->getRoles())) {
return 'Premium content: ' . $node->getTitle();
}
else {
return 'Free access content: ' . $node->getTitle();
}
}
या शीर्षक में प्रकाशन तिथि प्रदर्शित करें:
जैसा कि आप देख सकते हैं, Drupal आपको अपने रूट और कंट्रोलर को लचीले ढंग से कॉन्फ़िगर करने की क्षमता प्रदान करता है। तो जब आपके क्लाइंट के पास साइट पर सामग्री के आउटपुट के बारे में विचार होते हैं, तो आप हमेशा इसे Drupal API और थोड़ा PHP कोड के माध्यम से कर सकते हैं।
कोड उदाहरण GitHub पर देखे जा सकते हैं:
https://github.com/levmyshkin/drupalbook8