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

编辑本页

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

本页的更新版本用于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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
/ / src / ApiKernel.php使用ob娱乐下载组件配置加载程序LoaderInterface使用ob娱乐下载组件DependencyInjectionContainerBuilder使用ob娱乐下载组件HttpKernel内核ApiKernel扩展内核使用MicroKernelTrait公共函数registerBundles()//只加载API严格需要的bundle内容需要->getProjectDir()。“/ config / api_bundles.php”foreach内容作为= >env) {如果env->环境)? ?env“所有”) ? ?) {收益率();}}}公共函数getProjectDir()字符串返回\目录名(__DIR__);}公共函数getCacheDir()字符串返回->getProjectDir()。' / var /缓存/ api / '->getEnvironment ();}公共函数getLogDir()字符串返回->getProjectDir()。“/ var / log / api”;}公共函数configureContainer(ContainerBuilder容器, LoaderInterface加载程序容器->addResource (FileResource (->getProjectDir()。“/ config / api_bundles.php”));容器->setParameter (“container.dumper.inline_factories”,真正的);confDir->getProjectDir()。“/ config / api”加载程序->负载(confDir“/{包}/ *”自我::CONFIG_EXTS,“水珠”);加载程序->负载(confDir' /{包}/ '->环境。“/ *”自我::CONFIG_EXTS,“水珠”);加载程序->负载(confDir' /{服务}'自我::CONFIG_EXTS,“水珠”);加载程序->负载(confDir' /{服务}_ '->环境。自我::CONFIG_EXTS,“水珠”);}受保护的函数configureRoutes(RouteCollectionBuilder路线无效confDir->getProjectDir()。“/ config / api”/ /……只加载API严格需要的配置路由}}

步骤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许可证。