我試圖注入倉庫到服務定義庫中的參數,併爲此目的,我定義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);
}
}
刪除第二個參數。只有當你想使用不同的元數據對象(不是類)時才需要它。你幾乎肯定不想這樣做。順便說一下,對於這種特殊情況,使用服務參數參數確實沒有任何價值。真的沒有什麼可以被覆蓋的。只是讓您的服務定義難以閱讀。 – Cerad
在提問時複製/粘貼代碼通常是一個好主意。我懷疑你真的在使用factory_service而不是factory-service。 – Cerad
@Cerad,是的,在'factory-service'中有一個錯字,但仍然存在參數問題 –