如何创建多个Symfony应用程序使用一个内核ob娱乐下载
编辑该页面如何创建多个Symfony应用程序使用一个内核ob娱乐下载
在Syob娱乐下载mfony应用程序中,传入的请求通常是由前端控制器在处理公共/ index . php
,实例化src / Kernel.php
类来创建应用程序的内核。这个内核加载包、配置和处理请求生成响应。
当前实现内核的类作为一个方便的单个应用程序的默认设置。但是,它还可以管理多个应用程序。而内核通常运行相同的应用程序基于各种不同的配置环境,它可以适应不同的应用程序与特定的包和配置。
这些都是一些常见的用例创建多个应用程序使用一个内核:
- 一个应用程序,该应用程序定义了一个API可以分为两个部分来提高性能。第一部分是常规的web应用程序,而第二部分专门对API请求作出响应。这种方法需要加载包更少,使更少的功能,为第二部分,因此优化性能;
- 一个高度敏感的应用程序可以分成两部分增强安全性。第一部分只会加载路径对应于应用程序的公开暴露部分。第二部分将加载应用程序的其余部分,其访问web服务器的维护;
- 单一的应用程序可能会逐渐转化为更多的分布式体系结构,比如micro-services。这种方法允许无缝迁移的应用程序,同时共享通用配置和组件。
将一个应用程序转化为多个应用程序
这些步骤将单个应用程序转换为一个新的支持多个应用程序:
- 创建一个新的应用程序;
- 更新内核类来支持多个应用程序;
- 添加一个新的
APP_ID
环境变量; - 更新前控制器。
下面的例子显示了如何创建一个新的应用程序的API,一个新的Symfony项目。ob娱乐下载
步骤1)创建一个新的应用程序
这个例子之前,共享内核模式:所有应用程序维护一个孤立的环境,但是他们可以共同包,如果需要配置和代码。最优方法将取决于您的特定需求和要求,这是由你来决定哪些最适合您的项目。
首先,创建一个新的应用程序
在项目的根目录,将所有必要的应用程序。每个应用程序都将遵循一个简化的目录结构中描述的ob娱乐下载Symfony的最佳实践:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
你的项目/├─应用/│└─api /│├─配置/││├─包。php││├─路线。yaml││└─服务。yaml│└─src /├─bin /│└─控制台├─配置/├─公共/│└─指数。php├─src /│└─Kernel.php
请注意
请注意,配置/
和src /
在项目的根目录将代表之间的共享上下文中的所有应用程序应用程序/
目录中。因此,你应该仔细考虑什么是普遍的,应该放置在特定的应用程序。
提示
你也可以考虑共享上下文重命名的命名空间,应用程序
来共享
,因为它会更容易区分,并提供清晰的意义。
自从新应用程序/ api / src /
目录将PHP代码相关的API,你必须更新composer.json
在自动装载部分文件包括:
1 2 3 4 5 6 7 8
{“自动”:{“psr-4”:{“共享\ \”:“src /”,“Api \ \”:“应用程序/ api / src /”}}}
另外,别忘了作曲家dump-autoload
生成自动装载文件。
步骤2)更新内核类来支持多个应用程序
自会有多个应用程序,最好添加一个新的属性字符串$ id
内核识别应用程序被加载。这个属性也将允许您将缓存,日志和配置文件,以避免碰撞与其他应用程序。此外,它有助于性能优化,每个应用程序将只加载所需的资源:
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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
/ / src / Kernel.php名称空间共享;/ /……类内核扩展BaseKernel{使用MicroKernelTrait;公共函数__construct(字符串美元环境bool,美元调试、私人字符串美元id){父::__construct (美元环境,美元调试);}公共函数getSharedConfigDir():字符串{返回美元这- >getProjectDir ()。“/配置”;}公共函数getAppConfigDir():字符串{返回美元这- >getProjectDir ()。/应用程序/”。美元这- >id。“/配置”;}公共函数registerBundles():iterable{美元sharedBundles=需要美元这- >getSharedConfigDir ()。' / bundles.php ';美元appBundles=需要美元这- >getAppConfigDir ()。' / bundles.php ';/ /加载常见的包,比如FrameworkBundle以及/ /特定包需要专门为应用程序本身foreach(array_merge (美元sharedBundles,美元appBundles)作为美元类= >美元env){如果(美元env(美元这- >环境)? ?美元env(“所有”)? ?假){收益率新美元类();}}}公共函数getCacheDir():字符串{/ /将为每个应用程序缓存返回(美元_SERVER(“APP_CACHE_DIR”)? ?美元这- >getProjectDir ()。/ var /缓存的)。' / '。美元这- >id。' / '。美元这- >环境;}公共函数getLogDir():字符串{/ /将为每个应用程序日志返回(美元_SERVER(“APP_LOG_DIR”)? ?美元这- >getProjectDir ()。“/ var / log”)。' / '。美元这- >id;}受保护的函数configureContainer(ContainerConfigurator美元容器):无效{/ /加载常见的配置文件,如框架。yaml以及/ /具体配置要求专门为应用程序本身美元这- >doConfigureContainer (美元容器,美元这- >getSharedConfigDir ());美元这- >doConfigureContainer (美元容器,美元这- >getAppConfigDir ());}受保护的函数configureRoutes(RoutingConfigurator美元路线):无效{/ /加载常见的路由文件,如路线/框架。yaml以及/ /具体路线需要专门为应用程序本身美元这- >doConfigureRoutes (美元路线,美元这- >getSharedConfigDir ());美元这- >doConfigureRoutes (美元路线,美元这- >getAppConfigDir ());}私人函数doConfigureContainer(ContainerConfigurator美元容器、字符串美元configDir):无效{美元容器- >导入(美元configDir。' /{包}/ * {php, yaml}’。);美元容器- >导入(美元configDir。' /{包}/ '。美元这- >环境。“/ * {php, yaml}’。);如果(is_file (美元configDir。' / services.yaml ')){美元容器- >导入(美元configDir。' / services.yaml ');美元容器- >导入(美元configDir。' /{服务}_ '。美元这- >环境。“.yaml”);}其他的{美元容器- >导入(美元configDir。' /{服务}. php ');}}私人函数doConfigureRoutes(RoutingConfigurator美元路线、字符串美元configDir):无效{美元路线- >导入(美元configDir。' /{路线}/ '。美元这- >环境。“/ * {php, yaml}’。);美元路线- >导入(美元configDir。' /{路线}/ * {php, yaml}’。);如果(is_file (美元configDir。' / routes.yaml ')){美元路线- >导入(美元configDir。' / routes.yaml ');}其他的{美元路线- >导入(美元configDir。' /{路线}. php ');}如果(假! = = (美元文件名= (新\ ReflectionObject (美元这))- >getFileName ())) {美元路线- >导入(美元文件名,“属性”);}}}
这个例子中重用默认实现导入配置和基于给定的线路配置目录。如图所示,这种方法将进口共享和app-specific资源。
步骤3)添加一个新的APP_ID环境变量
接下来,定义一个新的环境变量来标识当前应用程序。这个新变量可以被添加到.env
文件提供一个默认值,但是它通常应该添加到您的web服务器配置。
1 2
# .envAPP_ID = api
谨慎
这个变量的值必须匹配应用程序目录中应用程序/
因为它是用于内核加载特定的应用程序配置。
步骤4)更新前控制器
在这最后一步,更新前控制器公共/ index . php
和bin /控制台
通过的价值APP_ID
内核实例变量。这将允许内核加载并运行指定的应用程序:
1 2 3 4 5 6 7
/ /公共/ index . php使用共享\内核;/ /……返回函数(数组美元上下文):内核{返回新内核(美元上下文(“APP_ENV”),(保龄球)美元上下文(“APP_DEBUG”),美元上下文(“APP_ID”]);};
类似于配置所需的APP_ENV
和APP_DEBUG
值,内核构造函数的第三个参数是现在也需要设置应用程序ID,这是来自外部的配置。
对于第二个前端控制器,定义一个新的控制台选项允许通过CLI环境下运行的应用程序ID:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/ / bin /控制台使用共享\内核;/ /……返回函数(InputInterface美元输入数组,美元上下文):应用程序{美元内核=新内核(美元上下文(“APP_ENV”),(保龄球)美元上下文(“APP_DEBUG”),美元输入- >getParameterOption ([“id”,“我”),美元上下文(“APP_ID”)));美元应用程序=新应用程序(美元内核);美元应用程序- >getDefinition ()- >使用addOption (新InputOption (“id”,“我”,InputOption::VALUE_REQUIRED,“App ID”));返回美元应用程序;};
就是这样!
执行命令
的bin /控制台
脚本,用于运行Symfony命令,总是使用ob娱乐下载内核
类来构建应用程序和负载的命令。如果你需要运行控制台命令为一个特定的应用程序,你可以提供- - - id
选择连同适当的身份价值:
1 2 3 4 5 6 7
php bin /控制台缓存:明确——id = api / /或php bin /控制台缓存:明确-iapi / /或者出口APP_ID = api php bin /控制台缓存:清楚
您可能想要更新作曲家auto-scripts部分同时运行多个命令。这个例子显示了两个不同的应用程序的命令api
和管理
:
1 2 3 4 5 6 7 8 9 10
{“脚本”:{“auto-scripts”:{“缓存:明确-iapi”:“ob娱乐下载symfony-cmd”,“缓存:明确-iadmin”:“ob娱乐下载symfony-cmd”,“资产:安装% PUBLIC_DIR % -iapi”:“ob娱乐下载symfony-cmd”,”资产:安装% PUBLIC_DIR % -iadmin——no-cleanup”:“ob娱乐下载symfony-cmd”}}}
然后,运行作曲家auto-scripts
为了测试它!
请注意
每个控制台脚本(如可用的命令。bin /控制台-iapi
和bin /控制台-iadmin
)可以是不同的,因为他们依赖于包为每个应用程序启用,这将是不同的。
渲染模板
让我们考虑一下,您需要创建另一个应用程序调用管理
。如果你遵循的ob娱乐下载Symfony的最佳实践,共享内核模板将位于模板/
在项目的根目录。对于admin-specific模板,您可以创建一个新的目录应用程序/管理/模板/
下,您将需要手动配置管理应用程序:
1 2 3 4
#应用程序/管理/配置/包/ twig.yaml枝:道路:' % kernel.project_dir % /应用程序/管理/模板”:管理
然后,使用这个树枝名称空间引用任何模板管理应用程序中,例如@Admin /形式/ fields.html.twig
。
运行测试
在Syob娱乐下载mfony应用程序,功能测试通常扩展的WebTestCase默认类。在它的父类,KernelTestCase
,有一个方法调用createKernel ()
尝试创建内核负责在测试中运行应用程序。然而,当前的逻辑的方法不包括新应用程序ID参数,所以你需要更新:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ /应用程序/ api /测试/ ApiTestCase.php名称空间Api\测试;使用共享\内核;使用ob娱乐下载\包\FrameworkBundle\测试\WebTestCase;使用ob娱乐下载\组件\HttpKernel\KernelInterface;类ApiTestCase扩展WebTestCase{受保护的静态函数createKernel(数组美元选项= []):KernelInterface{美元env=美元选项(“环境”)? ?美元_ENV(“APP_ENV”)? ?美元_SERVER(“APP_ENV”)? ?“测试”;美元调试=美元选项(“调试”)? ?(保龄球)(美元_ENV(“APP_DEBUG”)? ?美元_SERVER(“APP_DEBUG”)? ?真正的);返回新内核(美元env,美元调试,“api”);}}
请注意
这个例子使用一个硬编码扩展这个应用程序ID值,因为测试ApiTestCase
类将只关注api
测试。
现在,创建一个测试/
目录内应用程序/ api /
应用程序。然后,更新的composer.json
文件和phpunit.xml
关于其存在配置:
1 2 3 4 5 6 7 8
{“autoload-dev”:{“psr-4”:{“共享测试\ \ \ \”:“测试/”,“Api测试\ \ \ \”:“应用程序/ api /测试/”}}}
记得要运行作曲家dump-autoload
生成自动装载文件。
这是所需的更新phpunit.xml
文件:
1 2 3 4 5 6 7 8
<testsuite文件><testsuite的名字=“共享”><目录>测试< /目录>< /testsuite><testsuite的名字=“api”><目录>应用程序/ api /测试< /目录>< /testsuite>< /testsuite文件>
增加更多的应用程序
现在,您可以根据需要添加更多的应用程序开始,比如一个管理
应用程序来管理项目的配置和权限。要做到这一点,你只需要重复步骤1:
1 2 3 4 5 6 7 8 9 10
你的项目/├─应用/│├─admin /││├─配置/│││├─包。php│││├─路线。yaml│││└─服务。yaml││└─src /│└─api /│└─……
此外,您可能需要更新您的web服务器配置设置APP_ID = admin
在一个不同的领域。