Symfony2多内核?

10

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

我不确定在同一个内核上添加许多bundle会对性能产生很大影响还是只是一点点,这并不重要?

以下是选项:

  1. 将所有内容保留在同一个内核中,这不会有太大的差异。
  2. 为应用程序的不同部分(API、管理和核心网站)使用多个内核。
  3. 为管理区域和API创建不同的Symfony2项目。
  4. 或者您的智慧之言 :)

1
你可以尝试为执行以下开发示例创建环境:if (in_array($this->getEnvironment(), array('dev', 'test'))) { 在appKernel中实现。 - pietro
你对我之前的评论有什么想法? - pietro
你忘了一个选项:将代码分成几个包,这已经在这里讨论过了:Symfony 2.x 中真的应该把所有东西都打包吗? 或者 Symfony2 概念问题:通用包 vs. 特定包 - A.L
@Basit,我确定你是否将配置拆分为一个或多个捆绑包,所以我更喜欢分享链接。无论如何,通过Pietro的想法和新环境,似乎你将能够根据你的环境加载不同的bundle,这应该避免加载不必要的bundle。 - A.L
@Basit,通过这个解决方案,您可以为每个环境配置路由、参数等。 - pietro
4个回答

2
你可以定义更多的“环境”。
例如:
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;
   }
}

我认为这在习惯用语上不太对。API包可能会在生产/开发环境中加载,从而为我们提供不同的行为。因此,例如,ENV是核心应用程序、API应用程序区域的一种模式。此外,我们还可以拥有暂存、测试环境。 - lexeme

2
这主要取决于bundles的质量和它们之间的连接程度。我会在一开始拒绝第3个点(为管理区域和api创建不同的Symfony2项目。)-因为您可能不会构建两个单独的应用程序。
对于应用程序的不同部分(api、admin和核心网站),请使用多个内核。
容器中的侦听器和服务会创建常见问题,特别是当您的侦听器仅应在一个应用程序上下文中工作时(api /前端/后端)。即使您在侦听器方法的开头记得检查它(并且仅在所需的上下文中执行操作),那么仍然可能会有侦听器依赖于需要构造和注入的已注入服务。这里有一个很好的例子:FOS/RestBundle: 即使您配置了zones,但是在前端(当为api激活view_listener时),view_handler仍将被初始化并注入到侦听器中-https://github.com/FriendsOfSymfony/FOSRestBundle/blob/master/Resources/config/view_response_listener.xml#L11
为API上下文创建单独的内核将解决此问题(在我们的项目中,我们使用一个内核,我们不得不禁用该侦听器-因为blackfire.io分析告诉我们它可以在每个前端请求上节省约15毫秒)。
为API创建新内核将确保任何仅适用于API的服务/侦听器都不会干扰前端/后端呈现(双向工作)。但是,这将为您创建共享的components(组件)(来自项目中不同的内核)带来额外的工作负担-但在使用composer的世界中,这不再是一项巨大的任务。
但这只适用于衡量每毫秒响应时间的人。这取决于您/第三方bundles的质量。如果所有内容都完全正常,则无需使用内核。

0

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

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

NB:您的术语有点混淆,我认为您所说的Kernel是指Bundle


不,我所说的内核是指内核...我有所有的捆绑包...只是不确定在生产中有很多捆绑包是否是一个好选择,因为并非所有的捆绑包都在主网站上运行。 - Basit
拥有多个捆绑包(我们只谈论几个)真的不会影响性能。如果所有内容都属于同一域、品牌和URL,则使用一个内核即可。 - Egg
有几个额外的包几乎接近10个以上,所以可以做一些很花哨的东西和事件处理...就像SonataAdminBundle。 - Basit
@Basit,我建议你将最后一条评论的内容添加到你的问题中,因为你有10个以上的捆绑包(这个数字不在你的问题中),而且它们确实做了很多花哨的事情(加载配置等),这可能会影响性能。值得在你的问题中提到。 - A.L

0

拥有多个内核不一定有帮助。

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

您可以定义分离的路由/控制器/配置,这些内容根据主机/URL加载。

注意:

如果您要将应用程序分为两个大捆绑包(即管理和API),并且两者共享相同的实体,则肯定需要做出选择。

这个选择可能涉及到您的一个捆绑包包含太多(和不相关的)逻辑,并且需要稍后将其重构为几个捆绑包。

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

此外,请合理命名您的类/命名空间。


我确实有多个捆绑包,但是在不同的捆绑包中创建不同的内容并不能真正帮助我解决问题。我关心的是性能问题,即使你将东西放入不同的捆绑包中,但是只有在调用其路径时才需要这些捆绑包,那么这将如何影响性能。 - Basit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接