2017-07-19 21 views
0

私は、FOSRestBundle、FOSUserBundle、およびFOSOAuthBundleを使用して、Symfony 3によって強化されたRESTfulアプリケーションに取り組んでいます。Symfony FOSUserBundleユーザーマネージャ拡張

私の問題は、私はFOSのUserManagerクラスを拡張したいが、これは致命的なエラーをスローである:ここでは

Type error: Argument 1 passed to FOS\UserBundle\Doctrine\UserManager::__construct() must implement interface FOS\UserBundle\Util\PasswordUpdaterInterface, none given, called in /var/www/html/var/cache/dev/appDevDebugProjectContainer.php on line 2538

は、私のアプリケーションファイルの一部である:

# app/config/config.yml 

fos_user: 
    # [...] 
    service: 
     user_manager: foo.user_manager 
# src/FooBundle/Resources/config/services.yml 

services: 
    # [...] 
    foo.user_manager: 
     class: FooBundle\Service\UserManager 

    FooBundle\Service\UserManager: 
     arguments: 
      $class: '%fos_user.model.user.class%' 
<?php 

// src/FooBundle/Service/UserManager.php 

namespace FooBundle\Service; 

use FOS\UserBundle\Doctrine\UserManager as BaseUserManager; 

class UserManager extends BaseUserManager implements UserManagerInterface 
{ 
    /** 
    * {@inheritDoc} 
    * @see \FooBundle\Service\UserManagerInterface::findUsersAtPage() 
    */ 
    public function findUsersAtPage($usersPerPage, $page) { 
     $offset = $usersPerPage * $page; 
     return $this->getRepository()->findBy(array(), null, $usersPerPage, $offset); 
    } 
} 
<?php 

// src/FooBundle/Service/UserManagerInterface.php 

namespace FooBundle\Service; 

use FOS\UserBundle\Model\UserManagerInterface as BaseUserManagerInterface; 

interface UserManagerInterface extends BaseUserManagerInterface 
{ 
    /** 
    * Returns a collection with specified number of user instances at specified page. 
    * @param int $usersPerPage The number of users per page. 
    * @param int $page The page number. 
    * @return \Traversable 
    */ 
    public function findUsersAtPage($usersPerPage, $page); 
} 

私が観察したことは、デフォルトFOSユーザー・マネージャ、appDevDebugProjectContainer.phpは(パラメータ付き)getterメソッドを生成:

<?php 

// var/cache/dev/appDevDebugProjectContainer.php 

class appDevDebugProjectContainer extends Container 
{ 
    // [...] 

    protected function getFosUser_UserManagerService() 
    { 
    return $this->services['fos_user.user_manager'] = new \FOS\UserBundle\Doctrine\UserManager(${($_ = isset($this->services['fos_user.util.password_updater']) ? $this->services['fos_user.util.password_updater'] : $this->getFosUser_Util_PasswordUpdaterService()) && false ?: '_'}, ${($_ = isset($this->services['fos_user.util.canonical_fields_updater']) ? $this->services['fos_user.util.canonical_fields_updater'] : $this->getFosUser_Util_CanonicalFieldsUpdaterService()) && false ?: '_'}, ${($_ = isset($this->services['fos_user.object_manager']) ? $this->services['fos_user.object_manager'] : $this->getFosUser_ObjectManagerService()) && false ?: '_'}, 'FooBundle\\Entity\\User'); 
    } 

    // [...] 
} 

を、私は(パラメータなし)鉱山を使用する場合:

<?php 

// var/cache/dev/appDevDebugProjectContainer.php 

class appDevDebugProjectContainer extends Container 
{ 
    // [...] 

    protected function getFosUser_UserManagerService() 
    { 
     return $this->services['fos_user.user_manager'] = new \FooBundle\Service\UserManager(); 
    } 

    // [...] 
} 

してください、誰かが私を助けることができますか?その答えだ

答えて

1

[OK]をみんな:

サービスの引数は、サービス定義で設定する必要がありました、ありませんクラスのサービス定義。それはいくつかのコード、言葉よりもとても良く、本当にはっきりしていない:

# src/FooBundle/Resources/config/services.yml 

services: 
    # [...] 
    foo.user_manager: 
     class: FooBundle\Service\UserManager 
     arguments: 
      $class: '%fos_user.model.user.class%' 

    FooBundle\Service\UserManager: '@foo.user_manager' 

私はそれを試してみましたが、私は...

0

ちょうど同じような問題を解決していなかったことを考えていました。多分誰かに役立つでしょう。 Check this answer

それとも

services: 
    you_bundle.user_manager: 
     class: YourBundle\Services\UserManager 
     arguments: ["@fos_user.util.password_updater", "@fos_user.util.canonical_fields_updater", "@doctrine.orm.entity_manager", "%fos_user.model.user.class%"] 
を、このいずれかを試してみます
関連する問題