2015-03-10 7 views
9

मैं फ़ाइल /vendor/symfony/symfony/src/Symfony/Bundle/TwigBundle/Extension/AssetsExtension.php"सही" जिस तरह से एक और बंडल से एक सिम्फोनी विस्तार

यह लोड करता है ओवरराइड करने के लिए की जरूरत है ओवरराइड करने के लिए क्या है बंडल से टहनी getAssetUrl कोर फ़ाइलें, जो अन्यथा अगले सिम्फोनी अद्यतन द्वारा ओवरराइड किया जाएगा बिना छुए टहनी समारोह 'संपत्ति'

/** 
* Returns a list of functions to add to the existing list. 
* 
* @return array An array of functions 
*/ 
public function getFunctions() 
{ 
    return array(
     new \Twig_SimpleFunction('asset', array($this, 'getAssetUrl')), 
     new \Twig_SimpleFunction('assets_version', array($this, 'getAssetsVersion')), 
    ); 
} 

का उपयोग कर रहा परिसंपत्ति() टहनी समारोह ओवरराइड करना चाहते

उत्तर

6

उस पर विचार करें कोड ऐपबंडल नेमस्पेस में रहते हैं। पहले ऐप/config.yml या src/Appbundle/Resources/config/something.yml में सेवा कॉन्फ़िगरेशन बनाएं (आपको bundle extension में इस कॉन्फ़िगरेशन फ़ाइल को लोड करना होगा)। इसे सेवा कुंजी के तहत न भूलें।

twig.extension.assets: 
    class:  AppBundle\Twig\AssetsExtension 
    arguments: ["@service_container", "@?router.request_context"] 
    public: false 
    tags: 
     - { name: twig.extension } 

अब विस्तार एक्सटेंशन/एपबंडल/ट्विग/AssetsExtension.php बनाएं। यह वर्ग मूल एक्सटेंशन से प्राप्त होता है और मैं केवल एक विधि (टेम्पलेट संपत्ति() में ओवरराइड कर दूंगा)।

<?php 

namespace AppBundle\Twig; 

class AssetsExtension extends \Symfony\Bundle\TwigBundle\Extension\AssetsExtension 
{ 
    public function getAssetUrl($path, $packageName = null, $absolute = false, $version = null) 
    { 
     return parent::getAssetUrl('/something/' . $path, $packageName, $absolute, $version); 
    } 
} 

अब, फिर से लोड करने के बाद, अपने सभी परिसंपत्तियों गलत और/कुछ/डिफ़ॉल्ट रूप से साथ उपसर्ग होना चाहिए। आप समस्याओं के मामले में सिम्फनी कैश को हटाने का प्रयास कर सकते हैं। मैंने सिम्फनी 2.5.5 पर इस परिदृश्य का परीक्षण किया।

बिल्ट-इन सेवाओं के साथ काम करने का एक और तरीका compiler pass है। कंपाइलर पास में आप संपूर्ण सिम्फनी सेवा कंटेनर संशोधित कर सकते हैं (हटाएं, प्रतिस्थापित करें, सेवाओं को संशोधित करें)। सिम्फनी डीआईसी के बारे में सब कुछ है। मुझे उम्मीद है कि यह काफी अच्छा समाधान है।

+1

इसके बजाय सेवा परिभाषा आप भी सिर्फ नया विस्तार वर्ग के लिए बात करने के लिए पैरामीटर twig.extension.assets.class सेट कर सकते हैं डुप्लिकेट करने की। लेकिन कंपाइलर पास वास्तव में सबसे अच्छा समाधान है। असल में, मैं getAssertUrl को बदलने की आवश्यकता पर सवाल उठाता हूं। संभवतः यदि आप किसी तीसरे पक्ष के टेम्पलेट का उपयोग कर रहे हैं तो इसके लायक होने की तुलना में अधिक परेशानी होगी। बस अपना खुद का विस्तार और कार्य लिखने पर विचार करें। – Cerad

+0

हां, यह सच है। आप कस्टम एक्सटेंशन के साथ पैरामीटर twig.extension.assets.class भी सेट कर सकते हैं। सवाल स्पष्ट था - सिम्फनी कोड को छूए बिना संपत्ति() को ओवरराइड कैसे करें। मुझे वास्तव में उपयोग के मामले के बारे में कोई जानकारी नहीं है क्यों उपयोगकर्ता 3531149 को इसकी आवश्यकता है। – kba

+0

आपका समाधान ठीक है। उम्मीद है कि यह एक और ड्राइव नहीं है। – Cerad

6

मैं एक और समाधान प्रदान करता हूं, क्योंकि सिम्फनी 3.0 के बाद से सेवा के वर्ग नाम अब अतिसंवेदनशील नहीं हैं। आपको कंपाइलर पास समाधान चुना है।

मान लीजिए कि आप यूआरएल() टहनी में समारोह को ओवरराइड करना चाहते हैं, तो आप इसके लिए एक संकलक पास बना सकते हैं और परिभाषा बदलना चाहिए:

<?php 
// AppBundle/DependencyInjectoin/Compiler/TwigRoutingExtensionPass.php  

namespace AppBundle\DependencyInjection\Compiler; 

use AppBundle\Twig\Extension\RoutingExtension; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; 

class TwigRoutingExtensionPass implements CompilerPassInterface 
{ 
    public function process(ContainerBuilder $container) 
    { 
     if (false === $container->hasDefinition('twig.extension.routing')) { 
      return; 
     } 

     $definition = $container->getDefinition('twig.extension.routing'); 
     $definition->setClass(RoutingExtension::class); 
    } 
} 

:

<?php 
// AppBundle/AppBundle.php 

namespace AppBundle; 

use AppBundle\DependencyInjection\Compiler\TwigRoutingExtensionPass; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\HttpKernel\Bundle\Bundle; 

class AppBundle extends Bundle 
{ 
    public function build(ContainerBuilder $container) 
    { 
     parent::build($container); 

     $container->addCompilerPass(new TwigRoutingExtensionPass()); 
    } 
} 

फिर TwigRoutingExtensionPass फ़ाइल बनाने और फिर अपनी रूटिंग एक्सटेंशन फ़ाइल बनाएं।

आप नया विस्तार करने के लिए कुछ सेवाओं इंजेक्षन करना चाहते हैं:

<?php 

    $definition->addArgument('some_service'); 
    // OR 
    $definition->addMethodCall('setSomeService' [$container->get('some_service')]); 
+1

मैंने आपके समाधान का प्रयास किया है, लेकिन मुझे एक त्रुटि मिलती है 'सिम्फनी \ ब्रिज \ ट्विग \ एक्सटेंशन \ अनुवाद एक्सटेंशन "मेरे मामले में एक्सटेंशन सक्षम नहीं है' मैं ट्रांस() फ़ंक्शन को ओवरराइड करने का प्रयास कर रहा हूं। कोई विचार ? –

+1

क्षमा करें, लेकिन क्या आपने अनुवादक को सक्षम किया है? http://symfony.com/doc/current/translation।एचटीएमएल # विन्यास – nikophil

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