2014-07-15 62 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

好悲傷。我不敢相信我做到了。謝謝。 –

相關問題