【问题标题】:Refactoring a Controller in symfony to adapt to hexagonal architecture在 symfony 中重构一个 Controller 以适应六边形架构
【发布时间】: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


【解决方案1】:

此答案适用于 Symfony 3.3+/4+

您需要将存储库注册为服务。您应该使用组合而不是继承,而不是将其扩展为 3rd 方代码。

final class OwnerRepository implements OwnerRepositoryInterface
{
    private $entityManager;

    public function __construct(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    public function save(Owner $owner) 
    {
        $this->entityManager->persist($owner);
        $this->entityManager->flush();
    }
}

并将其注册为服务:

# app/config/services.yml
services:
    App\Repository\:
        # for location app/Repository
        resource: ../Repository

您可能需要稍微调整路径才能使其正常工作。

要获得更多扩展答案,请参阅How to use Repository with Doctrine as Service in Symfony

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多