如何创建Symfony应用与ob娱乐下载多个内核
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 5.1,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
如何创建Symfony应用与ob娱乐下载多个内核
谨慎
创建应用程序与多个内核不再是Symfony推荐的。ob娱乐下载考虑创建多个小应用程序。
在大多数Symfob娱乐下载ony应用程序中,处理传入的请求公共/ index . php
前端控制器,它实例化src / Kernel.php
类来创建应用程序内核加载包和处理请求生成响应。
这个单一内核方法是一种方便的违约,但是Symfony应用程序可以定义任意数量的内核。ob娱乐下载而环境运行同一应用程序使用不同的配置,内核可以运行同一应用程序的不同部分。
这些都是一些常见的用例创建多个内核:
- 一个应用程序,该应用程序定义了一个API可以定义两个内核性能的原因。第一个内核将常规应用程序和第二个只会对API请求做出回应,加载少包,使功能;
- 一个高度敏感的应用程序可以定义两个内核。第一个只会加载路径相匹配的部分应用程序公开暴露。第二个内核加载应用程序的其余部分和其由web服务器访问将保护;
- 面向micro-services的应用程序可以定义多个内核启用/禁用服务选择性地将传统的应用程序分成几个micro-applications庞然大物。
向应用程序添加一个新的内核
创建一个新的内核在Symfony应用程序是一个三步的过ob娱乐下载程:
- 创建一个新的前端控制器来加载新的内核;
- 创建新内核类;
- 定义配置由新内核加载。
下面的例子显示了如何创建一个新的内核API的一个给定的Symfony应用程序。ob娱乐下载
步骤1)创建一个新的前端控制器
而不是从头开始创建新的前端控制器,它更容易复制。例如,创建公共/ 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
:
1 2 3 4 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美元内容=需要美元这- >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枝:道路:#允许使用api /模板/ ApiKernel dir“% kernel.project_dir % / api /模板”:~
运行测试使用不同的内核
在Syob娱乐下载mfony应用程序中,功能测试的默认扩展WebTestCase类。内部类,一个方法调用getKernelClass ()
试图找到内核使用的类测试期间运行应用程序。该方法的逻辑内核不支持多个应用程序,所以您的测试不会使用正确的内核。
解决方案是创建一个自定义基类功能测试扩展WebTestCase
类和覆盖getKernelClass ()
方法返回内核使用的完全限定类名:
1 2 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类的引用/ /之前创建的内核在其静态内核美元财产。因此,/ /如果你的功能测试不运行在分离过程中,稍后运行/ /测试不同的内核将重用以前创建的实例,/ /指向不同的内核受保护的函数拆卸(){父::tearDown ();静态::$类=零;}}
向应用程序添加更多的内核
如果您的应用程序是非常复杂和创建多个内核时,最好将它们存储在自己的目录,而不是干扰很多文件默认src /
目录:
1 2 3 4 5 6 7 8 9 10 11 12
项目/├─src /│├─……│└─内核。php├─api /│├─……│└─ApiKernel。php├─……└─公共/├─……├─api。php└─index . php