2014-07-15 110 views
0

我已经成功地将注入库注入到服务中,但无法使注入在自定义用户提供程序中工作。似乎__construct()方法永远不会被调用,所以存储库永远不可用。您应该创建用户提供程序的方式是实现接口UserProviderInterface,但您创建的UserProvider类不会扩展具有构造函数的另一个类。当我尝试访问使用资料库$这个 - > personRepository-> findStatusByUsername($用户名),我得到的错误:原因如何将Symfony资源库注入到自定义用户提供程序中?

Using $this when not in object context

一个我觉得构造函数永远不会得到所谓的是,它有两个赋值到$ this,但我没有收到有关它们的错误消息。

我需要的人库将被注入,这样我可以检查是否试图验证人在应用已经批准(Person表中状态=核准)。

我services.yml文件具有以下设置:

parameters: 
    ginsberg_transportation.user.class: Ginsberg\TransportationBundle\Services\User 
    user_provider.class: Ginsberg\TransportationBundle\Security\User\UserProvider 

services: 
    ginsberg_user: 
    class: "%ginsberg_transportation.user.class%" 
    user_provider: 
    class: "%user_provider.class%" 
    arguments: 
     ["@ginsberg_person.person_repository", "@logger"] 
    ginsberg_person.person_repository: 
    class: Doctrine\ORM\EntityRepository 
    factory_service: doctrine.orm.default_entity_manager 
    factory_method: getRepository 
    arguments: 
     - Ginsberg\TransportationBundle\Entity\Person 

我UserProvider.php类开始是这样的:

namespace Ginsberg\TransportationBundle\Security\User; 

use Symfony\Component\Security\Core\User\UserProviderInterface; 
use Symfony\Component\Security\Core\User\UserInterface; 
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; 
use Symfony\Component\Security\Core\Exception\UnsupportedUserException; 
use Ginsberg\TransportationBundle\Entity\Person; 
use Doctrine\ORM\EntityRepository; 

class UserProvider implements UserProviderInterface 
{ 
    private $personRepository; 
    private $logger; 

    public function __construct(\Ginsberg\TransportationBundle\Entity\PersonRepository $personRepository, \Monolog\Logger $logger) { 
    $this->personRepository = $personRepository; 
    $this->logger = $logger; 
    } 

    public function loadUserByUsername($uniqname) 
    { 
     $password = "admin"; 
     $salt = ""; 
     $roles = array(); 

     if (self::is_authenticated() && self::is_approved()) { 
     if (self::is_superuser()) { 
      $roles[] = 'ROLE_SUPER_ADMIN'; 
     } elseif (self::is_admin()) { 
      $roles[] = 'ROLE_ADMIN'; 
     } elseif (self::is_eligible() && self::is_approved()) { 
      $roles[] = 'ROLE_USER'; 
     } 

     return new User($uniqname, $password, $salt, $roles); 
     } 

     throw new UsernameNotFoundException(
     sprintf('Username "%s" does not exist.', $uniqname)); 
    } 
... 
    public static function is_approved() 
    { 
     $uniqname = self::get_uniqname(); 
     $status = $this->personRepository->findStatusByUsername($username); 

     return($status == 'approved') ? TRUE : FALSE;  
    } 

我也使用属性注射过尝试,但塔也没有工作。

我应该让我的UserProvider类扩展另一个适当的类,它可以使用构造函数吗?如果是这样,关于什么课程适合的想法?

感谢您的任何建议。

+0

您是否将您的服务和自定义用户提供程序集成到了* security.yml *中? – Javad

+0

factory_service和factory_method已弃用。所以,你应该使用'工厂:[“@ doctrine.orm.entity_manager”,“getRepository”]'而不是 –

回答

1

问题是方法is_approved()static。在静态上下文中不能使用$this。你需要声明你的方法是非静态的。

+0

好悲伤。我不敢相信我做到了。谢谢。 –

相关问题