2012-01-20 8 views
7

मेरे पास ज़ेंड फ्रेमवर्क से संबंधित कुछ प्रश्न हैं। मैं अब डिफ़ॉल्ट displayAction() विधि का उपयोग कर सभी स्थिर पृष्ठों को डिफ़ॉल्ट नियंत्रक के माध्यम से रूट करने का प्रयास कर रहा हूं। इसका इरादा displayAction()page परम देखकर अनुरोध को संसाधित करना है, यह निर्धारित करें कि स्क्रिप्ट पृष्ठ मौजूद है या नहीं, अगर यह दृश्य प्रस्तुत करता है अन्यथा 404 पेज को त्रुटि नहीं मिलती है। इसके अतिरिक्त, यह देखने के लिए एक परीक्षण किया जाता है कि क्या समान नाम वाला एक विधि मौजूद है, यदि ऐसा है, तो उस क्रिया पर कॉल करें।अपडेटेडः ज़ेंड फ्रेमवर्क में स्थिर सामग्री के प्रबंधन के लिए सर्वोत्तम अभ्यास?

यहां सूचीबद्ध application.ini

resources.router.routes.static-pages.route = /:page 
resources.router.routes.static-pages.defaults.module = default 
resources.router.routes.static-pages.defaults.controller = index 
resources.router.routes.static-pages.defaults.action = display 

यहाँ से रूटिंग कॉन्फ़िगरेशन है नियंत्रक कार्रवाई:

public function someAction() { 
    // do something 
} 

public function displayAction() { 
    // extract page param, e.g. 'some'  
    $page = $this->getRequest()->getParam('page'); 

    // create zend styled action method, e.g. 'someAction' 
    $page_action = $page.'Action'; 

    // if a method within this controller exists, call on it 
    if (method_exists($this, $page_action)) { 
     $this->$page_action(); 
    } 

    // if nothing was passed in page param, set to 'home' 
    if (empty($page)) { 
     $page = 'home'; 
    } 

    // if script exists, render, otherwise, throw exception. 
    if (file_exists($this->view->getScriptPath(null)."/".$this->getRequest()->getControllerName()."/$page.".$this->viewSuffix)) { 
     $this->render($page); 
    } else { 
     throw new Zend_Controller_Action_Exception('Page not found', 404); 
    } 
} 

अब, यहाँ मेरी प्रश्न हैं: वहाँ की एक बेहतर तरीका है यह कर रहा हूं? मैं इस ढांचे के लिए अपेक्षाकृत नया हूं, ऐसे में सर्वोत्तम प्रथाएं लागू होती हैं? क्या नियंत्रक के भीतर से कार्रवाई करने का कोई बेहतर तरीका है? मैंने दस्तावेज के माध्यम से चारों ओर देखने के लिए बहुत कुछ किया है, हालांकि, इसमें से कुछ ऐसा खुद का विरोधाभास प्रतीत होता है।

अद्यतन 1:

एक थिंक और पढ़ने के बाद, मैं समाधान को आसान बनाने में कामयाब रहे और कुछ चीजें जो उल्लेख किया गया था शामिल है। नोट: मैं अपने डिफ़ॉल्ट स्थैतिक-सामग्री नियंत्रक के रूप में PagesController का उपयोग करता हूं।

यहां सूचीबद्ध application.ini से रूटिंग कॉन्फ़िगरेशन है। होम पेज पर कॉल के लिए यानी "/", मैं अन्य सभी अनुरोधों के लिए action परम के रूप में "घर" पास करता हूं, उपयोगकर्ता परिभाषित/यूआरएल लिंक परम action में भेजा जाता है।

resources.router.routes.home.route = "/" 
resources.router.routes.home.defaults.module = "default" 
resources.router.routes.home.defaults.controller = "pages" 
resources.router.routes.home.defaults.action = "home" 
resources.router.routes.pages.route = "/:action" 
resources.router.routes.pages.defaults.module = "default" 
resources.router.routes.pages.defaults.controller = "pages" 

यहां नियंत्रक क्रियाएं हैं। यदि उपयोगकर्ता परिभाषित करता है पैरामीटर एक क्रिया के रूप में मौजूद है, तो इसे कहा जाएगा, अन्यथा यह php जादू फ़ंक्शन __call पर पड़ता है।

public function someAction() 
{ 
    // Do something 
} 

public function __call($method, $args) 
{ 
    // extract action param, e.g. "home" 
    $page = $title = $this->getRequest()->getParam('action'); 

    // test if script exists 
    if (file_exists($this->view->getScriptPath(null) . "/" 
     . $this->getRequest()->getControllerName() . "/$page . " . $this->viewSuffix)) 
    { 
     // pass title to layout 
     $this->view->assign(compact('title')); 
     // render script 
     $this->render($page); 
    } else { 
     throw new Zend_Controller_Action_Exception('Page not found', 404); 
    } 
} 

यह काम करता है। तो, यहां मेरे प्रश्न हैं: क्या आप स्थिर सामग्री का प्रबंधन करने के लिए इस विधि का उपयोग करने पर मानकीकरण पर विचार करेंगे? यदि नहीं, तो क्यों नहीं? आप इसे कैसे सुधारेंगे? इसके अलावा, यह एक जीईटी अनुरोध है, क्या यह इनपुट को शुद्ध करने के लिए Zend_Filter_input का उपयोग करने के लिए एक बुद्धिमान कदम होगा या यह सिर्फ ओवरकिल है?

उत्तर

1

आपका दृष्टिकोण मेरे लिए उचित लगता है। हालांकि, शायद आप __call विधि का लाभ बजाय लेना चाहिए, जो की अनुमति होगी आप के लिए और अधिक आसानी से मार्ग अपने कार्यों ...

सेटअप इस तरह से अपने मार्ग:

resources.router.routes.static-pages.route = /:action 
resources.router.routes.static-pages.defaults.module = default 
resources.router.routes.static-pages.defaults.controller = index 

और इसलिए की तरह अपने नियंत्रक:

public function someAction() { 
    //going to URL /some will now go into this method 
} 

public function __call($name, $args) { 
    //all URLs which don't have a matching action method will go to this one 
} 
+0

प्रतिक्रिया के लिए धन्यवाद, मैं निश्चित रूप से इसमें एक नज़र डालेगा। – Hegemon

1

मुझे लगता है कि आपके सही रास्ते पर हालांकि कुछ अन्य विचार हैं। अपने INI में वर्गों प्रति अपने मार्ग

तोड़ अप: एक ब्लॉग रूटर यानी, एक स्थैतिक पृष्ठ रूटर एक मंच रूटर आदि .. (मुझे लगता है कि आप पहले से ही ऐसा कर रहे हैं)

उपयोग विभिन्न रूटर वर्गों को संभालने के लिए एक नियंत्रक को भेजने के बजाय प्रति अनुभाग रूटिंग।

स्थैतिक: http://framework.zend.com/manual/en/zend.controller.router.html#zend.controller.router.routes.static

सभी: http://framework.zend.com/manual/en/zend.controller.router.html

कुछ लिंक है कि मदद मिल सकती है

:

  • codeutopia.net/blog/2007/11/16/routing- और-जटिल-urls-in-zend-framework/
  • www.vayani s.com/2009/03/20/intro-to-zend-framework-routing/
+0

प्रतिक्रिया के लिए धन्यवाद, जैसा कि आप कहते हैं, गतिशील पृष्ठों के लिए वैकल्पिक गैर स्थैतिक रूटिंग जगह पर है। मैं यह देखने के लिए प्रलेखन के माध्यम से देख सकता हूं कि डिजाइन पर सुधार करने के लिए मैं कुछ भी उपयोग कर सकता हूं या नहीं। – Hegemon

संबंधित मुद्दे