【发布时间】:2017-03-05 12:56:02
【问题描述】:
我已经创建了一个控制器,它将所有者记录创建到数据库中。一切都像这样在 CreateOwnerController 上完成并且工作正常:
class CreateOwnerController extends Controller
{
public function executeAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$owner = new Owner($request->request->get("name"));
$em->persist($owner);
$em->flush();
return new Response('Added',200);
}
}
现在,为了重构我已经创建了一个定义 OwnerRepository 的接口:
interface OwnerRepositoryInterface {
public function save(Owner $owner);
}
还有一个实现这个接口的 OwnerRepository:
class OwnerRepository extends EntityRepository implements OwnerRepositoryInterface {
public function save(Owner $owner) {
$this->_em->persist($owner);
$this->_em->flush();
}
}
然后我为应用层创建了一个 CreateOwnerUseCase 类,它接收一个 OwnerRepository 并执行一个方法来保存到 OwnerRepository:
class CreateOwnerUseCase {
private $ownerRepository;
public function __construct(OwnerRepositoryInterface $ownerRepository) {
$this->ownerRepository = $ownerRepository;
}
public function execute(string $ownerName) {
$owner = new Owner($ownerName);
$this->ownerRepository->save($owner);
}
}
好的,我正在拆分初始控制器介绍层域/应用程序/框架层。
在CreateOwnerController 上,现在我已经实例化了该用例并将OwnerRepository 作为参数传递,如下所示:
class CreateOwnerController extends Controller {
public function executeAction(Request $request) {
$createOwnerUseCase = new CreateOwnerUseCase(new OwnerRepository());
$createOwnerUseCase->execute($request->request->get("name"));
return new Response('Added',200);
}
}
但是在Make request to create new Owner时失败:
警告:Doctrine\ORM\EntityRepository::__construct() 缺少参数 1,在 /ansible/phpexercises/Frameworks/mpweb-frameworks-symfony/src/MyApp/Bundle/AppBundle/Controller/CreateOwnerController.php 中调用
它发生在作为参数传递的OwnerRepository 上。它想要一个$em 和映射类……这个映射类是什么意思?如何解决这个错误?
【问题讨论】:
-
由于 OwnerRepository 实际上是一个 Doctrine EntityRepository,你只能使用 EntityManager::getRepository 创建它。搜索一下示例。这种方法最好的办法是为所有者存储库创建一个服务,并且几乎避免使用 php new 运算符。
-
看起来您在
CreateOwnerController的代码示例中有语法错误,您在类中使用return而不是在方法中。 -
@Roman 当然,我在复制/粘贴时错过了。现在它是平等的。
-
@Cerad 这意味着我必须传递给 CreateOwnerUseCase($em-> getRepository(Owner))?或者在 CreateOwnerUseCase 类中获取存储库?问候
-
没有。如果你打算完成所有这些类的所有工作,那么你需要看看 Symfony 如何实现依赖注入:symfony.com/doc/current/components/dependency_injection.html 以及了解 Doctrine 2 的速度。
标签: php doctrine-orm frameworks symfony