2014-07-17 34 views
0

我試圖注入倉庫到服務定義庫中的參數,併爲此目的,我定義services.yml文件是這樣的:在services.yml

parameters: 
    user.repository.class: App\UserBundle\Repository\UserRepository 
    user_repository.factory_argument: App\UserBundle\Usuario 
    user_repository.factory_argument2: Doctrine\ORM\Mapping\ClassMetadata 
    user.service.class: App\UserBundle\Services\UserServiceImpl 
services: 
    app_user.registration.form.type: 
     class: App\UserBundle\Form\Type\RegistrationFormType 
     arguments: [%fos_user.model.user.class%] 
     tags: 
      - { name: form.type, alias: app_user_registration } 
    login_listener: 
     class: 'App\UserBundle\Listener\LoginListener' 
     arguments: ['@security.context', '@doctrine', '@service_container'] 
     tags: 
      - { name: 'kernel.event_listener', event: 'security.interactive_login' } 
    app.user.repository: 
     class: "%user.repository.class%" 
     factory-service: doctrine.orm.entity_manager 
     factory-method: getRepository 
     arguments: [%user_repository.factory_argument%, %user_repository.factory_argument2%] 
    user.service: 
     class: "%user.service.class%" 
     arguments: [ @app.user.repository ] 

的問題是在app.user.respository參數定義: arguments: [%user_repository.factory_argument%, %user_repository.factory_argument2%]

我得到錯誤:

PHP Catchable fatal error: Argument 2 passed to Doctrine\ORM\EntityRepository::__construct() must be an instance of Doctrine\ORM\Mapping\ClassMetadata, string given

我下面這個post這實際上以不同的方式定義這些參數,但這不適用於我,也許它是爲symfony或doctrine的先前版本完成的。

編輯

有在「factory_service`一個錯字在評論中指出,我依然會通過同樣的錯誤圈,我不知道我是否需要配置實現參數接口或類這些接口

parameters: 
    user.repository.class: App\UserBundle\Repository\UserRepository 
    user_repository.factory_argument: App\UserBundle\Entity\Usuario 
    user.service.class: App\UserBundle\Services\UserServiceImpl 
    user.service.argument: App\UserBundle\Repository\UserRepository 
services: 
    app_user.registration.form.type: 
     class: App\UserBundle\Form\Type\RegistrationFormType 
     arguments: [%fos_user.model.user.class%] 
     tags: 
      - { name: form.type, alias: app_user_registration } 
    login_listener: 
     class: 'App\UserBundle\Listener\LoginListener' 
     arguments: ['@security.context', '@doctrine', '@service_container'] 
     tags: 
      - { name: 'kernel.event_listener', event: 'security.interactive_login' } 
    app.user.repository: 
     public: true 
     class: "%user.repository.class%" 
     factory_service: doctrine.orm.entity_manager 
     factory_method: getRepository 
     arguments: [%user_repository.factory_argument%] #, %user_repository.factory_argument2%] 
    user.service: 
     class: "%user.service.class%" 
     arguments: [%user.service.argument%] 

這些都是我的課:

UserRepositoryInterface:

<?php 
namespace App\UserBundle\Repository; 

use Doctrine\Common\Persistence\ObjectRepository; 

interface UserRepositoryInterface extends ObjectRepository 
{ 
    public function fetch($id_or_email); 
} 

UserRepository:

<?php 

namespace App\UserBundle\Repository; 

use Doctrine\ORM\EntityRepository; 

class UserRepository extends EntityRepository 
        implements UserRepositoryInterface 
{ 
    public function fetch($id_or_email) 
    { 
     if (!$id_or_email) return; 

     $user = $this->find($id_or_email); 

     return $user; 
    } 
} 

UserService(接口)

<?php 

    namespace App\UserBundle\Services; 

    use Guzzle\Service\ClientInterface; 

    interface UserService 
    { 
     public function getUser($id_or_email); 
    } 

UserServiceImpl:

<?php 

namespace App\UserBundle\Services; 

use Guzzle\Service\ClientInterface; 
use Doctrine\ORM\EntityRepository; 
use App\UserBundle\Repository; 

class UserServiceImpl implements UserService { 

protected $userRepository; 

public function __construct(UserRepositoryInterface $fooRepository) // 
{ 
    $this->userRepository = $fooRepository; 
} 

public function getUser($em, $id_or_email=null) 
{ 
    error_log("#### getUSer {$id_or_email} ####"); 

    if (!$id_or_email) return; 

    return $this->userRepository->fetch($id_or_email); 
} 

}

+0

刪除第二個參數。只有當你想使用不同的元數據對象(不是類)時才需要它。你幾乎肯定不想這樣做。順便說一下,對於這種特殊情況,使用服務參數參數確實沒有任何價值。真的沒有什麼可以被覆蓋的。只是讓您的服務定義難以閱讀。 – Cerad

+0

在提問時複製/粘貼代碼通常是一個好主意。我懷疑你真的在使用factory_service而不是factory-service。 – Cerad

+0

@Cerad,是的,在'factory-service'中有一個錯字,但仍然存在參數問題 –

回答

0

正如我在我的評論中提到,你需要刪除ŧ他對工廠的第二次爭論。這是一個工作示例:

cerad_game__entity_manager__doctrine: 
    alias: doctrine.orm.games_entity_manager 

cerad_game__team_repository__doctrine: 
    class: Cerad\Bundle\GameBundle\Doctrine\EntityRepository\TeamRepository 
    factory_service: 'cerad_game__entity_manager__doctrine' 
    factory_method: 'getRepository' 
    arguments: 
     - 'Cerad\Bundle\GameBundle\Doctrine\Entity\Team' 

您的服務應該是這樣的:

app.user.repository: 
    class: App\UserBundle\Repository\UserRepository 
    factory_service: doctrine.orm.entity_manager 
    factory_method: getRepository 
    arguments: 
     - App\UserBundle\Usuario 
+1

這與我的方法非常相似,但對我無效 –

相關問題