如何创建Symfony应用与ob娱乐下载多个内核

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 4.3,不再维护。

这个页面的更新版本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娱乐下载程:

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

下面的例子显示了如何创建一个新的内核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
/ / src / ApiKernel.php使用ob娱乐下载\组件\配置\加载程序\LoaderInterface;使用ob娱乐下载\组件\DependencyInjection\ContainerBuilder;使用ob娱乐下载\组件\HttpKernel\内核;ApiKernel扩展内核{/ /……公共函数registerBundles(){/ /加载只有API所需的包严格……}公共函数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枝:道路:#允许使用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
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。