跳到内容

了解前端控制器、内核和环境如何协同工作

编辑此页

配置环境 部分解释了 Symfony 如何使用环境以不同的配置设置运行应用程序的基础知识。本节将更深入地解释应用程序启动时会发生什么。要介入此过程,您需要了解协同工作的三个部分

注意

通常,您不需要定义自己的前端控制器或 Kernel 类,因为 Symfony 提供了合理的默认实现。本文旨在解释幕后发生的事情。

前端控制器

前端控制器 是一种设计模式;它是应用程序提供的所有请求都必须经过的代码部分。

在 Symfony 骨架中,此角色由 public/ 目录中的 index.php 文件承担。这是处理请求时运行的第一个 PHP 脚本。

前端控制器的主要目的是创建 Kernel 的实例(稍后会详细介绍),使其处理请求并将生成的响应返回到浏览器。

由于每个请求都通过它路由,因此前端控制器可用于在设置内核之前执行全局初始化,或使用附加功能 装饰 内核。示例包括

  • 配置自动加载器或添加额外的自动加载机制;
  • 通过使用 HttpCache 的实例包装内核来添加 HTTP 级别缓存;
  • 启用 Debug 组件

您可以通过在 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 扩展而来,并使用 MicroKernelTraitKernel 类保留了 KernelInterface 中的一些未实现的方法,而 MicroKernelTrait 定义了几个抽象方法,因此您必须全部实现它们

registerBundles()
它必须返回运行应用程序所需的所有扩展包的数组。
configureRoutes()
它向应用程序添加单个路由或路由集合(例如,加载在某些配置文件中定义的路由)。
configureContainer()
它从配置文件或使用 loadFromExtension() 方法加载应用程序配置,并且还可以注册新的容器参数和服务。

为了填补这些(小的)空白,您的应用程序需要扩展 Kernel 类并使用 MicroKernelTrait 来实现这些方法。Symfony 默认在 src/Kernel.php 文件中提供该内核。

此类使用环境的名称(该名称传递给 Kernel 的 constructor 方法,并且可以通过 getEnvironment() 获得)来决定启用哪些扩展包。该逻辑位于 registerBundles() 中。

您可以自由创建自己的、替代的或额外的 Kernel 变体。您只需要调整您的(或添加新的)前端控制器以使用新的内核。

注意

Kernel 的名称和位置不是固定的。当将 多个内核放入单个应用程序 中时,添加额外的子目录可能是有意义的,例如 src/admin/AdminKernel.phpsrc/api/ApiKernel.php。重要的是您的前端控制器能够创建适当内核的实例。

注意

Kernel 还有很多其他用途,例如 覆盖默认目录结构。但是,您很可能不需要通过拥有多个 Kernel 实现来动态更改此类内容。

调试模式

Kernel 构造函数的第二个参数指定应用程序是否应在“调试模式”下运行。无论 配置环境 如何,Symfony 应用程序都可以使用设置为 truefalse 的调试模式运行。

这会影响应用程序中的许多方面,例如在错误页面上显示堆栈跟踪,或者是否在每个请求上动态重建缓存文件。虽然不是必需的,但调试模式通常设置为 devtest 环境为 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 默认提供三种环境,分别称为 devprodtest

更技术地说,这些名称只不过是从前端控制器传递到 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 的默认目录结构

这项工作,包括代码示例,根据 Creative Commons BY-SA 3.0 许可证获得许可。
目录
    版本