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

编辑该页面

如何创建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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
/ / src / ApiKernel.php使用ob娱乐下载\\FrameworkBundle\内核\MicroKernelTrait;使用ob娱乐下载\组件\DependencyInjection\加载程序\配置器\ContainerConfigurator;使用ob娱乐下载\组件\HttpKernel\内核作为BaseKernel;使用ob娱乐下载\组件\路由\加载程序\配置器\RoutingConfigurator;ApiKernel扩展内核{使用MicroKernelTrait;公共函数getProjectDir():字符串{返回\目录名(__DIR__);}公共函数getCacheDir():字符串{返回美元- >getProjectDir ()。' / var /缓存/ api / '美元- >环境;}公共函数getLogDir():字符串{返回美元- >getProjectDir ()。“/ var / log / api”;}受保护的函数configureContainer(ContainerConfigurator美元容器):无效{美元容器- >导入(“. . / config / api /{包}/ * .yaml”);美元容器- >导入(“. . / config / api /{包}/”美元- >环境。“/ * .yaml”);如果(is_file(\目录名(__DIR__)。' / config / api / services.yaml ')){美元容器- >导入(“. . / config / api / services.yaml”);美元容器- >导入(“. . / config / api /{服务}_”美元- >环境。“.yaml”);}其他的{美元容器- >导入(“. . / config / api /{服务}。php”);}}受保护的函数configureRoutes(RoutingConfigurator美元路线):无效{美元路线- >导入(“. . / config / api /{路线}/”美元- >环境。“/ * .yaml”);美元路线- >导入(“. . / config / api /{路线}/ * .yaml”);/ /……只加载配置路线严格所需的API}/ /如果需要运行一些逻辑来决定哪些包加载,/ /您可能更愿意使用registerBundles()方法私人函数getBundlesPath():字符串{/ /加载只包严格所需的API返回美元- >getProjectDir ()。“/ config / api_bundles.php”;}}

步骤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许可证。
ob娱乐下载Symfony 6.2支持通过苏禄人
ob娱乐下载Symfony 6.2支持通过Les-Tilleuls.coop