2011-12-05 11 views
5

सिम्फोनी 1.4 में आप उदाहरण के लिए, एक कस्टम मार्ग वर्ग है, जहां आप कस्टम तर्क के साथ यूआरएल की पीढ़ी को ओवरराइड निर्धारित कर सकते हैं:कस्टम मार्ग वर्ग

custom: 
    class: sfDoctrineRouteCollection 
    options: 
    model:    Custom 
    prefix_path:   /custom/category/:category_id 
    column:    id 
    route_class:   CustomDoctrineRoute 

class CustomDoctrineRoute extends sfDoctrineRoute 
{ 
    public function generate($params, $context = array(), $absolute = false) 
    { 
    if (!isset($params['category_id'])) { 
     $params['category_id'] = sfContext::getInstance()->getRequest()->getParameter('category_id'); 
    } 

    return parent::generate($params, $context, $absolute); 
    } 

} 

यह url_for('custom_show', array('id'=> $object['id'])) लिखने के लिए और संदर्भ निर्भर पैरामीटर के बारे में परेशान नहीं की अनुमति देता है (श्रेणी ID)।

आप इस बात से कैसे संपर्क करते हैं symfony2 है?

+0

यहां मैंने UrlGenerator को ओवरराइड करके समान समस्या हल की है: http://stackoverflow.com/questions/8877806/symfony2-use-object-to-set-route-parameters – Dziamid

उत्तर

3

मैं इस के 2 दृष्टिकोणों के बारे में सोच सकता हूं।

parameters: 
    router.class: Company\CoreBundle\Routing\MyCustomRouter 

वहाँ एक अधिक शक्तिशाली (पढ़ें: जटिल) है: पहला, और सरल, अपने खुद के साथ रूटर वर्ग को बढ़ाने और अपने parameters.yml या config.yml में अपने वर्ग का उपयोग करने के सिम्फोनी बताने के लिए है समाधान जो आपको पूरे राउटर सेवा ओवरराइड या विस्तार करके अपने राउटर क्लास पर अधिक निर्भरताओं को परिभाषित करने की अनुमति देता है। एक बंडल है जिसे इसे BeSimpleI18nRoutingBundle कहा जाता है जिसे आप देख सकते हैं कि यह कैसे किया जाता है।

विशेष रूप से, CompilerPass पर ध्यान दें जहां वे डिफ़ॉल्ट router सेवा को स्वयं के साथ बदलते हैं। इसके बाद आपको अपने स्वयं के राउटर कक्षा में RouterInterface लागू करना होगा। इस विशेष बंडल में वे inject the original default router (कंपाइलर पास में इसका नाम बदलने के बाद)।

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