如何将Symfony存储库注入自定义用户提供程序?

时间:2014-07-15 14:19:35

标签: php symfony dependency-injection

我之前已成功将存储库注入服务,但无法在自定义用户提供程序中注入工作。似乎永远不会调用__construct()方法,因此存储库永远不可用。您应该创建用户提供程序的方法是实现UserProviderInterface接口,但您创建的UserProvider类不会扩展另一个具有构造函数的类。当我尝试使用$ this-> personRepository-> findStatusByUsername($ username)访问存储库时,出现错误:

  

不在对象上下文中时使用$ this

我认为构造函数永远不会被调用的一个原因是它对$ this有两个赋值,但是我没有收到关于它们的错误消息。

我需要注入Person存储库,以便我可以检查尝试进行身份验证的人是否已在应用程序中获得批准(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类扩展另一个使用构造函数的合适类吗?如果是这样,任何关于什么类适合的想法?

感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

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