2015-03-10 12 views
9

başka paket bir symfony uzantısı geçersiz kılmak için "doğru" yolu nedir aksi takdirde bir sonraki Symfony'nin güncelleştirme tarafından geçersiz olacaktır çekirdek dosyaları, dokunmadan varlık() dal fonksiyonunu geçersiz kılmak için dal fonksiyon 'varlık'Ben /vendor/symfony/symfony/src/Symfony/Bundle/TwigBundle/Extension/AssetsExtension.php</p> <p>Bu yükler dosyayı geçersiz gerekir

/** 
* 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')), 
    ); 
} 

kullanılarak demetinden dal getAssetUrl

cevap

6

Düşünün ki kod AppBundle ad alanında yaşıyor. Öncelikle app/config.yml veya src/AppBundle/Resources/config/something.yml'de (bu yapılandırma dosyasını bundle extension'a yüklemeniz gerekir) servis yapılandırması oluşturun. Servis anahtarının altına yerleştirmeyi unutmayın.

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

Şimdi uzatma src/AppBundle/Twig/AssetsExtension.php yapalım. Bu sınıf, orijinal uzantıdan miras alır ve sadece bir yöntemi geçersiz kılar (şablon varlığında()).

<?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); 
    } 
} 

Şimdi, yeniden yüklendikten sonra, tüm öğeleriniz yanlış olmalı ve öntanımlı olarak/şey/varsayılan olarak olmalıdır. Sorun olması durumunda Symfony önbelleğini silmeyi deneyebilirsiniz. Bu senaryoyu Symfony 2.5.5'te test ettim.

Yerleşik hizmetlerle çalışmanın başka bir yolu da compiler pass dur. Derleyici geçişinde tüm Symfony servis kabını değiştirebilir (sil, değiştir, servisleri değiştir). Symfony her şey DIC ile ilgilidir. Umarım yeterince iyi bir çözümdür.

+1

yerine ayrıca sadece yeni uzantı sınıfına işaret edecek parametre twig.extension.assets.class ayarlayabilirsiniz hizmet tanımını çoğaltma. Ancak derleyici geçişi gerçekten en iyi çözümdür. Aslında, getAssertUrl'i değiştirme ihtiyacını sorguluyorum. Muhtemelen 3. parti şablonlar kullanıyorsanız, muhtemelen değerinden daha fazla sorun yaratacaktır. Kendi uzantınızı ve işlevinizi yazmayı düşünün. – Cerad

+0

Evet, bu doğru. Ayrıca, özel uzantıyla twig.extension.assets.class parametresini de ayarlayabilirsiniz. Soru açıktı - Symfony koduna dokunmadan varlığın() nasıl geçersiz kılınacağı. Kullanıcının neden kullanabileceğine dair bir ipucum yok. Kullanıcı3531149'un buna ihtiyacı var. – kba

+0

Çözümünüz gayet iyi. Umarım bu başka bir sürücü değildir. – Cerad

6

Başka bir çözüm buluyorum, çünkü symfony 3.0'dan beri hizmetlerin sınıf adları artık geçersiz kılmıyor. Derleyici geçiş çözümünü seçmelisiniz.

<?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()); 
    } 
} 

Sonra TwigRoutingExtensionPass dosyası oluşturmak:

Diyelim ki url() dal işlevi geçersiz kılmak istediğimizi varsayalım, sen tanımını bunun için bir derleyici geçiş oluşturmak ve değişmelidir Ve sonra RoutingExtension dosyanızı oluşturun.

yeni uzantısına bazı hizmetleri enjekte etmek istiyorsanız

:

<?php 

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

Ben senin çözüm denedim, ama bir hata aldım '' 'Symfony \ Bridge \ Twig \ Extension \ TranslationExtension 'uzantısı benim durumumda etkin değilken trans() işlevini geçersiz kılmaya çalışıyorum. herhangi bir fikir ? –

+1

Üzgünüm, çevirmene izin verdiniz mi? http://symfony.com/doc/current/translation.html # yapılandırma – nikophil

İlgili konular