理解前端控制器、内核和环境是如何协同工作的
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
理解前端控制器、内核和环境是如何协同工作的
一节如何掌握和创造新环境解释了Symfony如何使用环境以不同的配置设置运行应用ob娱乐下载程序的基础知识。本节将更深入地解释引导应用程序时会发生什么。要进入这个过程,你需要了解三个共同工作的部分:
前置控制器
的前端控制器是一种知名的设计模式;这是一段代码所有由应用程序提供服务的请求贯穿始终。
在ob娱乐下载Symfony2标准版,此角色由app.php而且app_dev.php文件web /
目录中。这些是处理请求时执行的第一个PHP脚本。
前端控制器的主要用途是创建对象的实例AppKernel
(稍后将详细介绍),让它处理请求并将结果响应返回给浏览器。
因为每个请求都要通过它路由,所以前端控制器可以用于在设置内核之前执行全局初始化装修具有附加特性的内核。例子包括:
- 配置自动装填机或添加额外的自动装填机制;
- 的实例包装内核,从而添加HTTP级缓存AppCache.
前端控制器可以通过请求url来选择:
1
http://localhost/app_dev.php/some/path/..。
如您所见,这个URL包含用作前端控制器的PHP脚本。您可以使用它来轻松切换前控制器或使用自定义一个放置在web /
目录(例如。app_cache.php
).
当使用Apache和RewriteRule随标准版一起发布,你可以从URL中省略文件名,RewriteRule将使用app.php
作为默认值。
请注意
几乎所有其他web服务器都应该能够实现类似于上面描述的RewriteRule的行为。有关详细信息,请查看服务器文档或参阅欧宝官网下载app配置web服务器.
请注意
确保你适当地保护你的前控制器,防止未经授权的访问。例如,您不想让生产环境中的任意用户都可以使用调试环境。
技术上,app /控制台在命令行上运行Symfony时使用的脚本也是一个前ob娱乐下载端控制器,只是它不用于web,而是用于命令行请求。
内核类
的内核是Symfony2的核心。ob娱乐下载它负责设置组成应用程序的所有包,并为它们提供应用程序的配置。然后,它在服务容器中的请求之前创建服务容器处理()方法。
类中声明了两个方法KernelInterface没有被实现的内核因此可以作为模板方法:
- registerBundles (),它必须返回运行应用程序所需的所有bundle的数组;
- registerContainerConfiguration (),它会加载应用程序配置。
为了填补这些(小的)空白,您的应用程序需要子类化内核并实现这些方法。生成的类通常称为AppKernel
.
同样,Symfony2ob娱乐下载标准版提供了一个AppKernel在app /
目录中。这个类使用环境的名称——它被传递给内核构造函数方法,可通过getEnvironment ()-决定创建哪些bundle。这样做的逻辑是正确的registerBundles ()
,当您开始向应用程序添加包时,该方法将由您扩展。
当然,您可以自由地创建自己的、替代的或附加的AppKernel
变体。您所需要的只是调整您的(或添加一个新的)前端控制器来使用新的内核。
请注意
的名称和位置AppKernel
不是固定的。例如,当将多个kernel放入单个应用程序中时,添加额外的子目录可能是有意义的应用程序/管理/ AdminKernel.php
而且应用程序/ api / ApiKernel.php
.重要的是前端控制器能够创建适当内核的实例。
有不同AppKernels
可能有助于使不同的前端控制器(可能在不同的服务器上)独立运行应用程序的部分(例如,管理UI、前端UI和数据库迁移)。
请注意
还有很多AppKernel
可以用于,例如重写默认目录结构.但是很有可能你不需要通过几个来快速改变这些东西AppKernel
实现。
的环境
我们刚刚提到了另一种方法AppKernel
必须实施registerContainerConfiguration ().该方法负责从右侧加载应用程序的配置环境.
环境已经被广泛地覆盖在前一章中,你可能还记得标准版有三个-dev
,刺激
而且测验
.
从技术上讲,这些名称不过是从前端控制器传递到AppKernel
的构造函数。的名称中使用此名称registerContainerConfiguration ()方法来决定加载哪些配置文件。
标准版AppKernel类通过简单地加载app / config / config_ * * .yml环境
文件。当然,如果您需要一种更复杂的方式来加载配置,您可以自由地以不同的方式实现此方法。