了解前端控制器、内核和环境如何协同工作
配置环境 部分解释了 Symfony 如何使用环境以不同的配置设置运行应用程序的基础知识。本节将更深入地解释应用程序启动时会发生什么。要介入此过程,您需要了解协同工作的三个部分
注意
通常,您不需要定义自己的前端控制器或 Kernel
类,因为 Symfony 提供了合理的默认实现。本文旨在解释幕后发生的事情。
前端控制器
前端控制器 是一种设计模式;它是应用程序提供的所有请求都必须经过的代码部分。
在 Symfony 骨架中,此角色由 public/
目录中的 index.php
文件承担。这是处理请求时运行的第一个 PHP 脚本。
前端控制器的主要目的是创建 Kernel
的实例(稍后会详细介绍),使其处理请求并将生成的响应返回到浏览器。
由于每个请求都通过它路由,因此前端控制器可用于在设置内核之前执行全局初始化,或使用附加功能 装饰 内核。示例包括
您可以通过在 URL 中添加前端控制器来选择要使用的前端控制器,例如
1
http://127.0.0.1/index.php/some/path/...
如您所见,此 URL 包含要用作前端控制器的 PHP 脚本。您可以使用它来切换到位于 public/
目录中的自定义前端控制器。
另请参阅
您几乎永远不想在 URL 中显示前端控制器。这是通过配置 Web 服务器来实现的,如 配置 Web 服务器 中所示。
从技术上讲,在命令行上运行 Symfony 时使用的 bin/console
脚本也是一个前端控制器,只是它不用于 Web,而是用于命令行请求。
内核类
内核 是 Symfony 的核心。它负责设置应用程序使用的所有扩展包,并为它们提供应用程序的配置。然后,它在 handle() 方法中创建服务容器,然后再处理请求。
Symfony 应用程序中使用的内核从 Kernel 扩展而来,并使用 MicroKernelTrait。Kernel
类保留了 KernelInterface 中的一些未实现的方法,而 MicroKernelTrait
定义了几个抽象方法,因此您必须全部实现它们
- registerBundles()
- 它必须返回运行应用程序所需的所有扩展包的数组。
- configureRoutes()
- 它向应用程序添加单个路由或路由集合(例如,加载在某些配置文件中定义的路由)。
- configureContainer()
- 它从配置文件或使用
loadFromExtension()
方法加载应用程序配置,并且还可以注册新的容器参数和服务。
为了填补这些(小的)空白,您的应用程序需要扩展 Kernel 类并使用 MicroKernelTrait 来实现这些方法。Symfony 默认在 src/Kernel.php
文件中提供该内核。
此类使用环境的名称(该名称传递给 Kernel 的 constructor 方法,并且可以通过 getEnvironment() 获得)来决定启用哪些扩展包。该逻辑位于 registerBundles()
中。
您可以自由创建自己的、替代的或额外的 Kernel
变体。您只需要调整您的(或添加新的)前端控制器以使用新的内核。
注意
Kernel
的名称和位置不是固定的。当将 多个内核放入单个应用程序 中时,添加额外的子目录可能是有意义的,例如 src/admin/AdminKernel.php
和 src/api/ApiKernel.php
。重要的是您的前端控制器能够创建适当内核的实例。
注意
Kernel
还有很多其他用途,例如 覆盖默认目录结构。但是,您很可能不需要通过拥有多个 Kernel
实现来动态更改此类内容。
调试模式
Kernel
构造函数的第二个参数指定应用程序是否应在“调试模式”下运行。无论 配置环境 如何,Symfony 应用程序都可以使用设置为 true
或 false
的调试模式运行。
这会影响应用程序中的许多方面,例如在错误页面上显示堆栈跟踪,或者是否在每个请求上动态重建缓存文件。虽然不是必需的,但调试模式通常设置为 dev
和 test
环境为 true
,而 prod
环境为 false
。
类似于 配置环境,您也可以使用 .env 文件 启用/禁用调试模式
1 2 3
# .env
# set it to 1 to enable the debug mode
APP_DEBUG=0
可以通过在运行命令之前传递 APP_DEBUG
值来覆盖此值
1 2 3 4 5
# Use the debug mode defined in the .env file
$ php bin/console command_name
# Ignore the .env file and enable the debug mode for this command
$ APP_DEBUG=1 php bin/console command_name
在内部,调试模式的值将成为 服务容器 内部使用的 kernel.debug
参数。如果您查看应用程序配置文件,您将看到该参数的用法,例如,用于打开 Twig 的调试模式
1 2 3
# config/packages/twig.yaml
twig:
debug: '%kernel.debug%'
环境
如上所述,Kernel
必须实现另一个方法 - configureContainer()。此方法负责从正确的环境加载应用程序的配置。
配置环境 允许使用不同的配置执行相同的代码。Symfony 默认提供三种环境,分别称为 dev
、prod
和 test
。
更技术地说,这些名称只不过是从前端控制器传递到 Kernel
构造函数的字符串。然后可以在 configureContainer()
方法中使用此名称来决定要加载哪些配置文件。
Symfony 的默认 Kernel
类通过首先加载在 config/packages/*
上找到的配置文件,然后加载在 config/packages/ENVIRONMENT_NAME/
中找到的文件来实现此方法。如果您需要更复杂的配置加载方式,您可以自由地以不同的方式实现此方法。
环境和缓存目录
Symfony 以多种方式利用缓存:应用程序配置、路由配置、Twig 模板等都缓存到文件系统上的文件中存储的 PHP 对象。
默认情况下,这些缓存文件主要存储在 var/cache/
目录中。但是,每个环境都缓存自己的一组文件
1 2 3 4 5 6
your-project/
├─ var/
│ ├─ cache/
│ │ ├─ dev/ # cache directory for the *dev* environment
│ │ └─ prod/ # cache directory for the *prod* environment
│ ├─ ...
有时,在调试时,检查缓存文件以了解某些内容的工作方式可能会有所帮助。执行此操作时,请记住查看您正在使用的环境的目录(在开发和调试期间最常见的是 dev/
)。虽然可能会有所不同,但 var/cache/dev/
目录包括以下内容
App_KernelDevDebugContainer.php
- 表示缓存的应用程序配置的缓存“服务容器”。
url_generating_routes.php
- 生成 URL 时使用的缓存路由配置。
url_matching_routes.php
- 用于路由匹配的缓存配置 - 在此处查看用于将传入 URL 匹配到不同路由的已编译正则表达式逻辑。
twig/
- 此目录包含所有缓存的 Twig 模板。
注意
您可以更改缓存目录位置和名称。有关更多信息,请阅读文章 如何覆盖 Symfony 的默认目录结构。