2015-10-17 63 views
4

我已經創建了一個具有安全功能的提供者。在the doc之後,我創建了自己的ExpressionLanguage類並註冊了提供者。如何在Symfony中註冊表達式語言

namespace AppBundle\ExpressionLanguage; 

use Symfony\Component\ExpressionLanguage\ExpressionLanguage as BaseExpressionLanguage; 
use Symfony\Component\ExpressionLanguage\ParserCache\ParserCacheInterface; 

class ExpressionLanguage extends BaseExpressionLanguage 
{ 
    public function __construct(ParserCacheInterface $parser = null, array $providers = array()) 
    { 
     // prepend the default provider to let users override it easily 
     array_unshift($providers, new AppExpressionLanguageProvider()); 

     parent::__construct($parser, $providers); 
    } 
} 

我正在使用相同的功能lowercasein the doc。但是現在,我沒有意識到如何註冊ExpressionLanguage類來加載我的Symfony項目。

「小寫」周圍不存在位置的功能26.

我:

我每次我嘗試用註釋的自定義函數加載頁面時得到這個錯誤使用Symfony 2.7.5。

+0

你是否能夠得到這個工作? – Chausser

+0

不,我發現一些不好的方法,比如替換默認的類,但沒有真正的本地。 –

回答

0

我假設你想使用你的自定義函數的安全表達式?在這種情況下,與security.expression_language_provider您註冊爲一個服務創建的表達式語言提供商,其標記爲:

services: 
    app.security_expression_language_provider: 
     class: AppBundle\ExpressionLanguage\AppExpressionLanguageProvider 
     tags: 
      - { name: security.expression_language_provider } 
+0

謝謝Wouter。在嘗試使用我自己的ExpressionLanguage類之前,我做了它。同樣的錯誤,'位置1附近不存在函數'小寫'。' –

+0

您是否清除了緩存? – scoolnico

+0

是的,我做過,scoolnico。 –

1

標籤security.expression_language_provider僅用於語言供應商添加到symfonys安全組件所使用的表達語言,或者更具體在ExpressionVoter中。

FrameworkBundle的@ Security-Annotation使用表達式語言的不同實例,它不知道您創建的語言提供程序。

爲了能夠在@安全性的註釋使用自定義的語言學校,我解決了這個使用下面的編譯過程:

<?php 

namespace ApiBundle\DependencyInjection\Compiler; 

use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; 
use Symfony\Component\DependencyInjection\Reference; 

/** 
* This compiler pass adds language providers tagged 
* with security.expression_language_provider to the 
* expression language used in the framework extra bundle. 
* 
* This allows to use custom expression language functions 
* in the @Security-Annotation. 
* 
* Symfony\Bundle\FrameworkBundle\DependencyInection\Compiler\AddExpressionLanguageProvidersPass 
* does the same, but only for the security.expression_language 
* which is used in the ExpressionVoter. 
*/ 
class AddExpressionLanguageProvidersPass implements CompilerPassInterface 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function process(ContainerBuilder $container) 
    { 
     if ($container->has('sensio_framework_extra.security.expression_language')) { 
      $definition = $container->findDefinition('sensio_framework_extra.security.expression_language'); 
      foreach ($container->findTaggedServiceIds('security.expression_language_provider') as $id => $attributes) { 
       $definition->addMethodCall('registerProvider', array(new Reference($id))); 
      } 
     } 
    } 
} 

這種方式,由ExpressionVoter和FrameworkBundle使用的表達語言都配置使用相同的語言提供者。