मेनू बिल्डिंग पैटर्न


9

जब मेनू को रूट करने के लिए उपयोग नहीं किया जाता है, तो मुझे मेनू के सक्रिय-राज्य हैंडलिंग के आसपास मेरे सिर को प्राप्त करने में परेशानी हो रही है।

मैं Drupal से आता हूँ जहाँ मेनू सिस्टम रूटिंग को भी हैंडल करता है। इसलिए सक्रिय राज्य और सक्रिय-ट्रेल स्टेट सेट करना मार्ग द्वारा नियंत्रित किया जाता है (जो मेनू रेंडरिंग सिस्टम के रूप में भी कार्य करता है)।

अब, बहुत सारे PHP फ्रेमवर्क में राउटर कक्षाएं हैं जो रूटिंग को संभालती हैं। यह एक अच्छा जुदाई लगता है क्योंकि एक मेनू POST के बारे में पता नहीं होना चाहिए || विकल्प || ... निवेदन।

लेकिन जब दृश्यपटल लिखते हैं, तो मैंने अपने आप को मेनू को हार्ड कोडिंग पाया। या DB में सब कुछ भंडारण और एक दृश्य के लिए उन मूल्यों को पारित। मुझे यह दृष्टिकोण पसंद नहीं है कि आप अपने राउटर में पहले से ही लिखे गए मेनू का उपयोग करके कॉपी करने का एक तरीका बना रहे हैं।

एक उदाहरण:

Route::get('/somewhere','routename.somewhere','showStuffController');
Route::post('/somewhere','routename.somewhere','saveStuffController');

Menu::add('label.somewhere','routename.somewhere');

आप यहां चिंताओं को अलग कर रहे हैं, इसलिए यह अच्छा है। लेकिन मेनू अपनी सक्रिय स्थिति निर्धारित करने के लिए रूट पर बहुत अधिक निर्भर करता है। मेनू को सक्रिय-पगडंडी सेट करने के लिए पदानुक्रम के बारे में भी जानना होगा।

तो हाँ, सक्रिय राह और सक्रिय स्थिति वर्गों की स्थापना वास्तव में एक देखने वाली बात है। लेकिन होने

if ( Route::currentName() === $menuitem->getRouteName() ) { print 'active'; }

आपके विचार से सभी बेवकूफ लग रहे हैं। फिर उन सभी कष्टप्रद सक्रिय-ट्रेल को जोड़ें यदि वह है और यह एक वास्तविक ब्लोट है। यह देखते हुए कि इससे पहले कि यह देखने लायक हो जाए और एक सक्रिय-ट्रैग फ़्लैग को स्थापित करना सच में इतना बदसूरत लगने लगे कि मुझे यह कैसे पता चले (सभी बच्चों पर एक फ़ॉर्चिंग लूप जो सभी बच्चों पर लूप करता है, ...)

मेरा सवाल यह है कि:

क्या इस क्लीनर को पाने के लिए कोई पैटर्न या स्मार्ट तरीका है, बेहतर है, ...? सक्रिय-ट्रेल 'समस्या' को कैसे संभालना चाहिए?

मैं बच्चे के बारे में सोच रहा था -> माता-पिता। इसलिए विज्ञापन को सबसे गहरे स्तर से शुरू करें और फिर अपने तरीके से काम करें। लेकिन तब बच्चा अपने माता-पिता के बारे में जानता है लेकिन माता-पिता को अपने बच्चों के बारे में कुछ नहीं पता (अजीब लगता है)।

जवाबों:


1

जब मेनू को रूट करने के लिए उपयोग नहीं किया जाता है

मैं कहूंगा कि मेनू के लिए रूटिंग का उपयोग किया जा सकता है।


जैसा कि आपने पहले ही बताया, राउटर हुक करने के लिए एक अच्छा स्थान होगा। मुझे नहीं लगता कि यह हुक का उपयोग करने के लिए बदसूरत होगा जो प्रत्येक अनुरोध पर वर्तमान पृष्ठ के लिए मेनू मेटा का मूल्यांकन करता है।

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

आपके राउटर और आपकी आवश्यकताओं के आधार पर एक साधारण फ़ंक्शन या क्लास जो कुछ स्टैटिक मेनू मेटा डेटा लेता है और वर्तमान मार्ग आपके लिए आवश्यक सभी जानकारी प्रदान करने के लिए पर्याप्त होगा।

मेनू मेटा स्वयं एक वस्तु नहीं होना चाहिए। विधियों के बिना एक साधारण कुंजी मूल्य डेटा संरचना ज्यादातर मामलों में पर्याप्त होनी चाहिए।

हुक आपके मेनू से संबंधित कुछ सामान्य कार्यात्मकताओं के साथ एक राज्य वस्तु बना सकता है, जैसे ब्रेडक्रंब, गहराई, मूल पृष्ठ या वर्तमान पृष्ठ और आपके http अनुरोध के संदर्भ में इस ऑब्जेक्ट को ज्ञात करता है। आपके पास हुक के अंदर अलग-अलग संभावनाएं हैं - लेकिन आमतौर पर यह आवश्यक डेटा एकत्र करने, तैयार करने और पारित करने के बारे में है जो जानता है कि इससे कैसे निपटना है।

यह दृष्टिकोण आपकी आवश्यकताओं के साथ बढ़ता है और इसके कुछ फायदे हैं:

  1. आपके डेटाबेस को डेटा से निपटने की आवश्यकता नहीं है, जिसे आप कम लागत के साथ रनटाइम पर प्रदान कर सकते हैं
  2. आपके पास एक स्थान पर आपका मेनू (मेटा) होगा जो इसे बनाए रखता है
  3. यदि आप चाहते हैं कि आपका मेनू पूरी तरह से आपके मार्गों पर 1: 1 पर निर्भर करे, तो इसे गतिशील रूप से मेनू मेटा प्रदान करके प्राप्त किया जा सकता है
  4. यदि आपकी सामग्री बढ़ती है (और इसलिए मेनू) तो आप इस डेटा को सत्र में स्थानांतरित कर सकते हैं जो कि एक तेज़ कुंजी मूल्य स्टोर में लिखा जा सकता है
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.