问题描述
我正在尝试将存储库注入服务中,为此,我以这种方式定义 services.yml
文件:
I'm trying to inject a repository into a service and for that purpose I'm defining services.yml
file this way:
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中。存储库
参数定义:参数:[%user_repository.factory_argument%,%user_repository.factory_argument2%]
我得到错误:
我正在关注此实际上以不同的方式定义了这些参数,但这对我不起作用,也许它是针对先前版本的symfony或教义完成的。
I was following this post which actually defines these arguments in a different way, but that's not working for me, maybe it was done for a previous version of symfony or doctrine.
编辑
factory_service中有一个错字,正如评论中指出的那样,我仍然会圈出同样的错误,我不知道是否需要配置参数接口或实现这些接口的类
There was a typo in 'factory_service` as noted in comments, still I'm going in circles through same error, I don't know if I need to configure parameters interfaces or classes implementing those interfaces
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:
UserRepositoryInterface:
<?php
namespace App\UserBundle\Repository;
use Doctrine\Common\Persistence\ObjectRepository;
interface UserRepositoryInterface extends ObjectRepository
{
public function fetch($id_or_email);
}
UserRepository:
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(接口)
UserService (interface)
<?php
namespace App\UserBundle\Services;
use Guzzle\Service\ClientInterface;
interface UserService
{
public function getUser($id_or_email);
}
UserServiceImpl:
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);
}
}
推荐答案
正如我在评论中提到的那样,您需要将第二个参数放在工厂中。这是一个工作示例:
As I mentioned in my comment, you need to drop the second argument to the factory. Here is a working example:
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
这篇关于在services.yml中定义存储库参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!