如何使用多个内核创建Symfob娱乐下载ony应用程序

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.1,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

如何使用多个内核创建Symfob娱乐下载ony应用程序

谨慎

Symfony不再推荐使用多个内核创建应用程序。ob娱乐下载可以考虑创建多个小型应用程序。

在大多数Symfob娱乐下载ony应用程序中,传入的请求由公共/ index . php前端控制器,它实例化src / Kernel.php类来创建应用程序内核,该内核装入包并处理请求以生成响应。

这种单内核方法是一种方便的默认方法,但是Symfony应用程序可以定义任意数量的内核。ob娱乐下载而环境使用不同的配置执行相同的应用程序,内核可以执行相同应用程序的不同部分。

下面是创建多个内核的一些常见用例:

  • 出于性能考虑,定义API的应用程序可以定义两个内核。第一个内核将服务于常规应用程序,第二个内核只响应API请求,加载更少的包,支持更少的功能;
  • 高度敏感的应用程序可以定义两个内核。第一个方法只加载与应用程序公开部分相匹配的路由。第二个内核将加载应用程序的其余部分,它的访问将受到web服务器的保护;
  • 面向微服务的应用程序可以定义几个内核来有选择地启用/禁用服务,将传统的整体应用程序转变为几个微应用程序。

向应用程序添加新内核

在Symfony应用程序中创建新内核分为三个步骤:ob娱乐下载

  1. 创建一个新的前端控制器来加载新的内核;
  2. 创建新的内核类;
  3. 定义新内核加载的配置。

下面的示例展示如何为给定Symfony应用程序的API创建新内核。ob娱乐下载

步骤1)创建一个新的Front Controller

比起从头开始创建新的前端控制器,复制现有控制器更容易。例如,创建公共/ api.php公共/ index . php

然后,更新新的前端控制器的代码来实例化新的内核类,而不是通常的内核类内核类:

1 2 3 4 5 6 7
/ /公共/ api.php/ /……内核ApiKernel (_SERVER“APP_ENV”) ? ?“开发”_SERVER“APP_DEBUG”) ? ?(“刺激”! = = (_SERVER“APP_ENV”) ? ?“开发”)));/ /……

提示

另一种方法是保留现有的index . php前端控制器,但增加了一个如果语句根据URL加载不同的内核(例如,如果URL以/ api,使用ApiKernel).

步骤2)创建新的内核类

现在需要定义ApiKernel新前端控制器使用的类。最简单的方法是复制现有的src / Kernel.php归档并进行所需的更改。

在本例中,ApiKernel将加载比默认内核更少的包。一定要更改缓存、日志和配置文件的位置,这样它们就不会与来自的文件发生冲突src / Kernel.php

12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
/ / src / ApiKernel.php使用ob娱乐下载组件HttpKernel内核使用ob娱乐下载组件配置加载程序LoaderInterface使用ob娱乐下载组件DependencyInjectionContainerBuilderApiKernel扩展内核/ /……公共函数registerBundles()//只加载API严格需要的bundle…公共函数getCacheDir()返回目录名(__DIR__).' / var /缓存/ api / '->getEnvironment ();}公共函数getLogDir()返回目录名(__DIR__).“/ var / log / api”;}公共函数configureContainer(ContainerBuilder容器, LoaderInterface加载程序//只加载API严格需要的配置文件confDir->getProjectDir()。“/配置”加载程序->负载(confDir“/ api / *”自我::CONFIG_EXTS,“水珠”);如果(is_dir (confDir“/ api /”->环境)){加载程序->负载(confDir“/ api /”->环境。“/ * * / *”自我::CONFIG_EXTS,“水珠”);}}}

步骤3)定义内核配置

最后,定义新的配置文件ApiKernel将负载。根据上面的代码,这个配置将存在于一个或多个文件中配置/ api /而且配置/ api / ENVIRONMENT_NAME /目录。

当您只加载几个包时,可以从头创建新的配置文件,因为它很小。否则,复制现有的配置文件配置/包/或者更好的是,导入它们并重写所需的选项。

使用不同内核执行命令

bin /控制台用于运行Symfony命令的脚本总是使ob娱乐下载用默认值内核类来构建应用程序并加载命令。如果需要使用新内核执行控制台命令,请复制bin /控制台脚本并重命名它(例如:bin / api).

然后,替换内核由您自己的内核实例化(例如。ApiKernel),现在您可以使用新的内核执行命令(例如。PHP bin/api缓存:清除现在你可以使用新的内核来执行命令了。

请注意

每个控制台脚本可用的命令(例如。bin /控制台而且bin / api)可能会有所不同,因为它们依赖于为每个内核启用的包,这些包可能是不同的。

渲染在不同内核中定义的模板

如果您遵循Symfony最佳实践,默ob娱乐下载认内核的模板将存储在模板/.尝试在不同的内核中呈现这些模板将导致命名空间"__main__"没有注册路径错误。

为了解决这个问题,在内核中添加以下配置:

1 2 3 4 5
#配置/ api / twig.yaml枝:道路:#允许在ApiKernel中使用api/templates/ dir“% kernel.project_dir % / api /模板”

使用不同的内核运行测试

在Syob娱乐下载mfony应用程序中,默认情况下,功能测试从WebTestCase类。在该类中,调用一个方法getKernelClass ()尝试查找在测试期间用于运行应用程序的内核类。此方法的逻辑不支持多个内核应用程序,因此您的测试不会使用正确的内核。

解决方案是为扩展的功能测试创建自定义基类WebTestCase类,并重写getKernelClass ()方法返回要使用的内核的全限定类名:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
使用ob娱乐下载FrameworkBundle测试WebTestCase//需要ApiKernel工作的测试,现在必须扩展这个// ApiTestCase类代替默认的WebTestCase类ApiTestCase扩展WebTestCase受保护的静态函数getKernelClass()返回“App \ ApiKernel”;}//这是必需的,因为KernelTestCase类保留了对//之前创建的内核的静态$kernel属性。因此,//如果您的功能测试没有在隔离的进程中运行,则稍后运行//测试不同的内核将重用之前创建的实例,//指向不同的内核受保护的函数拆卸()::tearDown ();静态:: $类=;}}

向应用程序添加更多内核

如果您的应用程序非常复杂,并且您创建了多个内核,最好将它们存储在各自的目录中,而不是在默认文件中处理大量文件src /目录:

12 3 4 5 6 7 8 9 10 11 12
Project /├─src/│├─…│├─php├─api/│├─…│├─ApiKernel.php├─…├─public/├─…├─api.php├─index.php
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。