Symfony2 多内核?
Symfony2 multiple kernel?
我的应用程序包含核心网站、api 和管理区域。我想知道将所有内容都放在一个应用程序中是不是一个坏主意,或者我应该创建不同的 Symfony2 项目还是应该将它们分成不同的内核?
我不确定在同一个内核上添加大量包是否会对性能产生很大影响,或者只是一点点,哪个不重要?
选项如下:
- 将所有内容都放在同一个内核上,不会有太大区别
- 应用程序的不同部分(api、管理和核心网站)有多个内核
- 为管理区域和 api 创建不同的 Symfony2 项目。
- 或者你的妙语:)
这是个人选择,但我有一个类似的项目,并且我在同一个项目中有一个 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;
}
}
我的应用程序包含核心网站、api 和管理区域。我想知道将所有内容都放在一个应用程序中是不是一个坏主意,或者我应该创建不同的 Symfony2 项目还是应该将它们分成不同的内核?
我不确定在同一个内核上添加大量包是否会对性能产生很大影响,或者只是一点点,哪个不重要?
选项如下:
- 将所有内容都放在同一个内核上,不会有太大区别
- 应用程序的不同部分(api、管理和核心网站)有多个内核
- 为管理区域和 api 创建不同的 Symfony2 项目。
- 或者你的妙语:)
这是个人选择,但我有一个类似的项目,并且我在同一个项目中有一个 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;
}
}