Symfony2 多内核?

Symfony2 multiple kernel?

我的应用程序包含核心网站、api 和管理区域。我想知道将所有内容都放在一个应用程序中是不是一个坏主意,或者我应该创建不同的 Symfony2 项目还是应该将它们分成不同的内核?

我不确定在同一个内核上添加大量包是否会对性能产生很大影响,或者只是一点点,哪个不重要?

选项如下:

  1. 将所有内容都放在同一个内核上,不会有太大区别
  2. 应用程序的不同部分(api、管理和核心网站)有多个内核
  3. 为管理区域和 api 创建不同的 Symfony2 项目。
  4. 或者你的妙语:)

这是个人选择,但我有一个类似的项目,并且我在同一个项目中有一个 publicBundle、adminBundle 和 apiBundle。

额外的性能损失可以忽略不计,但组织是关键……这就是我们首先使用 MVC 包 (Symfony) 的原因,不是吗? :)

注意:你的术语有点混乱,我认为 Kernel 你的意思是 Bundle

这主要取决于捆绑包的质量。这就是他们之间的联系。

我会在开始时拒绝第 3 点 (create different Symfony2 project for admin area and api.) - 因为您可能不会构建两个单独的应用程序。

应用程序的不同部分(api、管理和核心网站)有多个内核

常见问题是由容器中的侦听器和服务造成的。特别是当你的监听器应该只在一个应用程序上下文中工作时 (api/frontend/backend)。即使您记得在侦听器方法的最开始检查它(并且仅在需要的上下文中使用魔术),那么侦听器仍然可以依赖于无论如何都需要构建和注入的注入服务。这里的好例子是 FOS/RestBundle:即使你配置 zones 然后仍然在前端(当 view_listener 为 api 激活时) view_handler 被初始化并注入到监听器- https://github.com/FriendsOfSymfony/FOSRestBundle/blob/master/Resources/config/view_response_listener.xml#L11 我不确定这里是否 100% 但也禁用 API 的翻译和树枝(等)(大多数 api 不需要它)会加速它向上。

为 API 上下文创建单独的内核将解决该问题(在我们的项目中,我们使用一个内核并且我们必须禁用该侦听器 - 因为 blackfire.io 配置文件告诉我们它节省了 ~15ms在每个前台请求上)。

为 API 创建新的内核将确保 API 的 none-only services/listeners 不会干扰 frontend/backend 渲染(它同时工作方法)。但它会为您创建额外的工作,创建共享 components 用于项目内的许多捆绑包(来自不同内核的捆绑包) - 但在有作曲家的世界中,这不再是一项艰巨的任务。

但这仅适用于测量每毫秒响应时间的人。并取决于 your/3dparty 捆绑包质量。如果一切都很好,那么您就不需要弄乱内核。

有几个内核不一定有用。

将您的应用程序拆分成捆绑包,并保留通过应用程序的不同部分共享您的实体(等等)的所有优势。

您可以定义根据 host/url 加载的分隔 routing/controllers/configuration。

注:

如果您要将您的应用分成两个大包(即 Admin 和 Api), 并且两者共享相同的实体,您肯定必须做出选择。

这个选择可能涉及到您的一个 bundle 包含太多(且不相关)的逻辑,以后需要在多个 bundle 中进行重构。

为您的应用程序的每个部分创建一个与一组相关资源相对应的包,并通过配置的不同上下文来区分这两个部分。

此外,合理地命名您的 classes/namespaces。

您可以定义更多 "environments"。

例如:

AppKernel.php

public function registerBundles()
    {
        $bundles = array(
            new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
            new Symfony\Bundle\SecurityBundle\SecurityBundle(),
            new Symfony\Bundle\TwigBundle\TwigBundle(),
            new Symfony\Bundle\MonologBundle\MonologBundle(),
            new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
            new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
            new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
            //new AppBundle\AppBundle()
        );

        if (in_array($this->getEnvironment(), array('api'), true)) {
            $bundles[] = new ApiBundle\ApiBundle();
            //-- Other bundle
        }
        //-- Other environments


        return $bundles;
   }
}