【问题标题】:Symfony Components without the full stack framework (Episode 2)没有完整堆栈框架的 Symfony 组件(第 2 集)
【发布时间】:2021-02-23 06:42:10
【问题描述】:

我在创建您自己的 PHP 框架 (https://symfony.com/doc/current/create_framework/index.html) 之后的项目中仅使用 Symfony DI、Http、内核、路由组件。 我指定的项目,@cerad 提供了很大帮助。再次感谢。 可以使用 Service 和 Controller 依赖注入。

参照。 Symfony Components without the full stack framework(第一集) 和 https://github.com/Monnomcjo/symfony-simplex

但现在我在依赖注入中实例化存储库时遇到了一个新困难。

我添加了 symfony/orm-pack 以使用 ServiceEntityRepository。

更新:

正如 cmets 中所述,我担心的是方法问题。

我的问题说得不好,上下文不够清楚。仍然在学习环境中,我尝试实现清洁架构和领域驱动设计的概念。

在这种分区和独立的思想中,我也试图更好地掌握我的Framework,从几乎没有开始,边做边添加,只添加我需要的。

仍然关注 cmets 我不再使用 symfony / orm-pack 而是教义 / dbal。

还有很多工作要做,但它确实有效。

#container.php

// Doctrine
$containerBuilder->register(\ExampleApp\Domain\Client\Entity\ClientRepository::class, \Infrastructure\Persistence\Doctrine\Client\DoctrineClientRepository::class)
    ->setArguments([new Reference('service_container')]);

$containerBuilder->register(\ExampleApp\Domain\Client\UseCase\GetClient\GetClient::class, \ExampleApp\Domain\Client\UseCase\GetClient\GetClient::class)
    ->setArguments([new Reference(\ExampleApp\Domain\Client\Entity\ClientRepository::class)]);

$containerBuilder->register(\ExampleApp\Presentation\Client\GetClientHtmlPresenter::class, \ExampleApp\Presentation\Client\GetClientHtmlPresenter::class);

$containerBuilder->register(\Infrastructure\View\GetClientView::class, \Infrastructure\View\GetClientView::class);

$containerBuilder->register(\Infrastructure\Controller\ClientController::class, \Infrastructure\Controller\ClientController::class)
    ->setArguments([
        new Reference(\ExampleApp\Domain\Client\UseCase\GetClient\GetClient::class),
        new Reference(\ExampleApp\Presentation\Client\GetClientHtmlPresenter::class),
        new Reference(\Infrastructure\View\GetClientView::class)
]);

现在可以退货了。

https://github.com/Monnomcjo/symfony-simplex 也更新了。

下一步,添加.env,conf文件类型services.yaml

【问题讨论】:

  • 您似乎没有在服务容器中注册您的存储库类。 EntityRepository 类需要一个具有开放数据库连接的 EntityManager。 DoctrineBundle 提供了一个抽象的ServiceEntityRepository-class,它帮助Service Container 通过ManagerRegistry 实例化这些类。这有助于自动装配存储库。如果您不想使用该类,则必须手动向容器注册每个存储库。
  • 你好@dbrumann。该项目的目的是进行案例研究。我试图更好地理解框架及其低级组件是如何工作的。我在上一篇文章中已经在这个主题上取得了很好的进展。特别是在服务和控制器中注入依赖项。所以我实际上是想用容器手动注册每个存储库。
  • 我在您的第 1 集问题上提供了一些帮助,所以当我说这从根本上说是错误的方法时,请相信我。 DoctrineBundle 专门用于将独立的 Doctrine 库与 Symfony 框架应用程序连接。您需要安装 Doctrine 库,研究 Doctrine 文档中的启动代码,然后创建自己的服务。不是一件容易的事。
  • 顺便说一句,有一个 Symfony Reddit 论坛可能是解决这类大问题的更好选择。实际上,我很惊讶您的第一个问题没有得到解决。
  • 出于好奇:这有什么问题吗?

标签: php symfony no-framework


【解决方案1】:

由于您现在的问题是缺少doctrine.orm.entity_manager,我认为了解 Symfony 是如何做到这一点的最好方法是查看 DoctrineBundle。特别是在DependencyInjection/DoctrineExtension.php 和接收配置值的Configuration。您可能还想看看service definitions

Extension 类采用通过 Configuration 验证的配置(通常在您的 config/packages/doctrine.yaml 中),然后更新 Resources/config 下的服务定义。这种方法相当复杂,但它可以帮助您了解 Symfony 中的事物是如何连接的。

或者,您可以查看Doctrine Docs 以了解如何获取 EntityManager,然后将其转换为 Symfony 服务容器注册:

$isDevMode = true;
$proxyDir = null;
$cache = null;
$useSimpleAnnotationReader = false;
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), $isDevMode, $proxyDir, $cache, $useSimpleAnnotationReader);
// or if you prefer yaml or XML
//$config = Setup::createXMLMetadataConfiguration(array(__DIR__."/config/xml"), $isDevMode);
//$config = Setup::createYAMLMetadataConfiguration(array(__DIR__."/config/yaml"), $isDevMode);

// database configuration parameters
$conn = array(
    'driver' => 'pdo_sqlite',
    'path' => __DIR__ . '/db.sqlite',
);

// obtaining the entity manager
$entityManager = EntityManager::create($conn, $config);

您可以在上面的服务定义链接中看到 EntityManager::create。您如何在应用程序中执行此操作很大程度上取决于您希望构建它与 Symfony 的距离以及您希望围绕 Doctrine 配置什么以及如何配置。

【讨论】:

  • 谢谢@dbrumann,这正是正确的方法。我更新了我的 GitHub 存储库。一切都很好。如果只是从现在开始超出“创建其框架”的练习,则添加 Clean Archi 的概念。和 DDD。
猜你喜欢
  • 2021-05-23
  • 1970-01-01
  • 2013-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-24
  • 2016-12-20
  • 2012-04-26
相关资源
最近更新 更多