如何使用多个内核创建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娱乐下载
- 创建一个新的前端控制器来加载新的内核;
- 创建新的内核类;
- 定义新内核加载的配置。
下面的示例展示如何为给定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娱乐下载\组件\DependencyInjection\ContainerBuilder;使用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