2013-08-02 21 views
9

'da SecurityServiceProvider'u nasıl kullanacağımı anlayamıyorum. Benim yapılandırma şudur: Eğer $app->boot(); var aramak için bir istek işlenmesi dışında Güvenlik özelliklere erişmek istiyorum ama bu zaman bazı durumlarda belgelerine göreSilex SecurityServiceProvider 'Identifier' atar security.authentication_providers "tanımlı değil."

Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Identifier "security.authentication_providers" is not defined.' 

:

$app['security.firewalls'] = array(
    'admin' => array(
     'pattern' => '^/_admin/.+', 
     'form' => array('login_path' => '/_admin/', 'check_path' => '/_admin/login_check'), 
     'logout' => array('logout_path' => '/_admin/logout'), 
     'users' => array(
      'admin' => array('ROLE_ADMIN', '5FZ2Z8QIkA7UTZ4BYkoC+GsR...'), 
     ), 
    ), 
); 
$app->register(new Silex\Provider\SecurityServiceProvider()); 

Bu sadece atar benim durumum değil.

Unable to generate a URL for the named route "_admin_login_check" as such route does not exist. 

muhtemelen aynı sorunla an issue a few months ago var ama kapalı bulunuyor: herhangi durum yükseltmenizi değil ama sonra üreten giriş formunda Twig atar çünkü muhtemelen hiç değil çizme $app->boot();$app->register(...) önce ararsam
Bu yüzden

+0

Belki konuyla ilişkili olmaması, ancak iki biriyle yerine getirmeyen altın kurallar (dokümanlarda belirtilir): giriş_pathınız kısıtlanmış alanın DIŞINDAKİ ZORUNLUdur. Sizinki/_admin/adresinde ve kısıtlı alanınız /_admin/.+ adresinde. Bu nedenle, onu dışarıda tanımlamıyorsunuz. – mTorres

+0

Ben öyle düşünmüyorum. '/ _admin /.+' ifadesi '/ _admin /' yoluna uymuyor, bu yüzden/_admin/'kısıtlı alanın dışında. – martin

cevap

12

SecurityServiceProvider'u TwigServiceProvider'dan önce kaydetmeye çalışırken aynı istisnayı almam gerektiğini tahmin ediyorum.

Sadece kayıt sırasını değiştirdi ( Güvenlik Twig sonra) ve her şey iyi çalışmaya başladı: Sen SecurityServiceProvider kayıt ve TwigServiceProvider tescil arasına başvurunuzu önyükleme zorunda

// Twig service 

$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => sprintf("%s/../views", __DIR__), 
)); 

// Security service 

$app["security.firewalls"] = array(); 
$app->register(new Silex\Provider\SecurityServiceProvider()); 
+1

Bu aslında Symfony Security için Twig uzantılarını ('is_granted' gibi) kaydetmiyor, çünkü 'TwigServiceProvider' $ app ['security']' 'ın ayarlandığını ve' TwigServiceProvider 'ın ardından' SecurityServiceProvider 'kaydolduktan sonra kazanıldığını kontrol ediyor Uzantıyı Twig'e eklemeyin. – martin

+0

Haklısınız, bu istisnai durumun arkasındaki sebebi bulamadığım halde bir uygulamayı çalıştırmak ve çalıştırmak için kullandığım hızlı bir çözümdü. KuiKui'nin cevabı daha uygun görünüyor. – agmangas

12

:

// Security service 
$app["security.firewalls"] = array(); 
$app->register(new Silex\Provider\SecurityServiceProvider()); 

// Boot your application 
$app->boot(); 

// Twig service 
$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => sprintf("%s/../views", __DIR__), 
)); 

Yukarıdaki kod yukarıdaki gibi görünüyor. Sorununuzu x ama en azından bir kimlik doğrulama sağlayıcısını eklemelisiniz.

0

Aynı konuyla karşılaştım - ayrıca şu anki silex sürümü ~ 2.7 ile.

Sonunda, benim durumumda besteci ile entegre edilen "symfony/twig-bridge" bileşeninin problem olduğunu öğrendim. Bu twig-bridge bileşenini çeviri için twig şablonumda trans özelliğini kullanmam için entegre ettim (ör. {{ 'Age'|trans }}). Projeden twig köprüyü kaldırdıktan sonra tüm beklendiği gibi çalıştı. Kendimi hâlâ özellik sözdizimi kullanmak için

benim şablonlarda trans kullanmak için ben bir I18nExtension hayata geçirdik:

<?php 

namespace AppBundle\Utils; 

class I18nExtension extends \Twig_Extension { 
    private $app; 

    /** 
    * Register the extension after registering the TwigServiceProvider by 
    * $app['twig']->addExtension(new AppBundle\Utils\I18nExtension($app)); 
    */ 
    public function __construct(\Silex\Application $app) { 
     $this->app = $app; 
    } 

    /** 
    * Provide an additional simple filter called trans - calling 
    * the translate function specified below. 
    */ 
    public function getFilters() { 
     return array(
      new \Twig_SimpleFilter('trans', array($this, 'translate')), 
     ); 
    } 

    /** 
    * Translates the given $value using the translator registered in the app. 
    */ 
    public function translate($value) { 
     return $this->app['translator']->trans($value); 
    } 

    /** 
    * Name of the extension. 
    */ 
    public function getName() { 
     return "I18nExtension"; 
    } 
}