ob娱乐下载Symfony内部
由杰弗里·巴切莱特
你可曾想过一个HTTP请求时,会发生什么变化达到一个symfony应用程序?ob娱乐下载如果是的,那么你是在正确的地方。本章将解释深度symfony如何处理每个请求为了创建并返回响应。ob娱乐下载当然,仅仅描述过程缺乏一点乐趣,所以我们也会看一看你可以做一些有趣的事情,你可以与这一过程。
引导
这一切开始于应用程序的控制器。说你有一个前端
控制器和一个dev
环境(一个非常经典的开始对于任何symfony项目)。ob娱乐下载在这种情况下,您会得到一个前端控制器位于web / frontend_dev.php
。这个文件中到底发生了什么?在短短几行代码,symfony检索的应用配置和创建一个实例ob娱乐下载sfContext
负责调度请求。当创建应用程序配置是必要的sfContext
对象,它是依赖于应用程序引擎symfony的后面。ob娱乐下载
提示
ob娱乐下载Symfony已经给你相当多的控制在这里发生了什么让你通过一个自定义应用程序根目录的第四个参数ProjectConfiguration: getApplicationConfiguration ()
以及自定义上下文类第三(最后)参数这里sfContext: createInstance ()
(但是记住扩展sfContext
)。
检索应用程序的配置是一个非常重要的一步。首先,sfProjectConfiguration
负责猜应用程序的配置类,通常${}应用配置
,位于应用程序/ ${应用}/ config / ${应用}Configuration.class.php
。
sfApplicationConfiguration
实际上延伸ProjectConfiguration
,这意味着任何方法ProjectConfiguration
可以在所有应用程序之间共享。这也意味着,sfApplicationConfiguration
与两个共享它的构造函数ProjectConfiguration
和sfProjectConfiguration
。这是幸运的,因为内部的项目配置sfProjectConfiguration
构造函数。首先,一些有用的值计算和存储,如项目的根目录和symfony图书馆目录。ob娱乐下载sfProjectConfiguration
还创建了一个新的事件类型的调度程序sfEventDispatcher
,除非是作为第五个参数传递ProjectConfiguration: getApplicationConfiguration ()
前端控制器。
只是在那之后,你将有机会与配置过程中通过重写设置()
的方法ProjectConfiguration
。这通常是最好的地方启用/禁用插件(使用sfProjectConfiguration: setPlugins ()
,sfProjectConfiguration: enablePlugins ()
,sfProjectConfiguration: disablePlugins ()
或sfProjectConfiguration: enableAllPluginsExcept ()
)。
下一个插件加载的sfProjectConfiguration: loadPlugins ()
和开发人员有机会与这个过程通过交互sfProjectConfiguration: setupPlugins ()
可以重载。
插件初始化很直接。为每个插件,symfony查找ob娱乐下载${}插件配置
(如。sfGuardPluginConfiguration
如果发现)类和实例化它。否则,sfPluginConfigurationGeneric
使用。您可以钩到一个插件的配置通过两种方法:
${}插件配置:配置()
之前,半自动的${}插件配置::初始化()
后,半自动的
接下来,sfApplicationConfiguration
执行它配置()
方法,该方法可用于自定义每个应用程序的配置大量的内部配置初始化过程开始之前sfApplicationConfiguration: initConfiguration ()
。
symfony的配置过程的ob娱乐下载这一部分是负责很多事情,有几个入口点如果你想连接到这个过程。例如,您可以与被连接到自动装卸机的配置autoload.filter_config
事件。接下来,几个非常重要的配置文件加载,包括settings.yml
和app.yml
。最后,最后一点可以通过每个插件的插件配置配置/ config。
文件或配置类的初始化()
方法。
如果sf_check_lock
被激活,symfony将检查ob娱乐下载锁文件(创建的一个项目:禁用
任务,例如)。如果找到锁,检查以下文件和第一个可用的包含,随后立即终止脚本:
应用程序/ ${应用}/ config / unavailable.php
,配置/ unavailable.php
,web /错误/ unavailable.php
,lib /供应商/ sob娱乐下载ymfony / lib / /数据/ unavailable.php异常
,
最后,开发人员有一个最后的机会来定制应用程序的初始化sfApplicationConfiguration:初始化()
方法。
引导和配置概述
- 检索应用程序的配置
ProjectConfiguration:设置()
(此处定义插件)- 插件加载
${}插件配置:配置()
${}插件配置::初始化()
ProjectConfiguration: setupPlugins ()
(在这里设置你的插件)${}应用配置:配置()
autoload.filter_config
通知- 加载
settings.yml
和app.yml
${}应用配置::初始化()
- 创建一个
sfContext
实例
sfContext
和工厂
潜水到调度过程之前,让我们来谈谈一个symfony工作流程的重要组成部分:工厂。ob娱乐下载
在syob娱乐下载mfony中,工厂是一组组件或应用程序依赖的类。工厂的例子日志记录器
,i18n
等等。每个工厂都是通过配置factories.yml
编制的,这是一个配置处理程序(稍后将详细介绍配置处理程序)和转换为PHP代码实际上工厂实例化对象(您可以查看此代码在您的缓存缓存/前端/ dev / config / config_factories.yml.php
文件)。
请注意
工厂装货时发生sfContext
初始化。看到sfContext:初始化()
和sfContext: loadFactories ()
为更多的信息。
此时,您已经可以定制的很大一部分symfony的行为只是通过编辑ob娱乐下载factories.yml
配置。你甚至可以取代symfony的内置和自己的ob娱乐下载工厂类!
请注意
如果你有兴趣了解更多有关工厂,symfob娱乐下载ony的参考书以及factories.yml
文件本身是无价的资源。
如果你看着生成的config_factories.yml.php
,您可能已经注意到,工厂实例化在一个特定的顺序。顺序很重要,因为有些工厂(例如,依赖别人路由
组件显然需要请求
来检索所需的信息)。
让我们谈论更多的细节请求
。默认情况下,sfWebRequest
类代表了请求
。在实例化时,sfWebRequest:初始化()
叫做,收集相关的信息,比如GET / POST参数以及HTTP方法。你再给一个机会来添加自己的请求处理request.filter_parameters
事件。
使用request.filter_parameter
事件
假设你运营一个网站暴露用户的公共API。通过HTTP API可用,每个用户想要使用它必须提供一个有效的API密钥通过请求头(例如X_API_KEY
)来验证您的应用程序。这可以很容易地通过使用request.filter_parameter
事件:
类apiConfiguration扩展sfApplicationConfiguration{公共函数配置(){/ /……这个美元- >调度程序- >连接(“request.filter_parameters”,数组(这个美元,“requestFilterParameters”));}公共函数requestFilterParameters(sfEvent美元的事件,美元的参数){美元的请求=美元的事件- >getSubject();美元api_key=美元的请求- >getHttpHeader(“X_API_KEY”);如果(零= = =美元api_key| |假= = =api_user美元= Doctrine_Core::可以获得的(“ApiUser”)- >findOneByToken(美元api_key)){扔新RuntimeException(sprintf(“无效的api键“% s”,美元api_key));}美元的请求- >setParameter(“api_user”,api_user美元);返回美元的参数;}}
你将能够访问API用户从请求:
公共函数executeFoobar(sfWebRequest美元的请求){api_user美元=美元的请求- >getParameter(“api_user”);}
这种技术可以被使用,例如,验证webservice调用。
请注意
的request.filter_parameters
事件有很多关于请求的信息,看到了sfWebRequest: getRequestContext ()
方法的更多信息。
下一个非常重要的工厂是路由。路由的初始化是相当简单的,并且大多都是收集和设置特定的选项。但是,您可以连接到这个过程通过routing.load_configuration
事件。
请注意
的routing.load_configuration
事件给你访问当前路由对象的实例(在默认情况下,sfPatternRouting
)。然后您可以操纵注册路线通过各种方法。
routing.load_configuration
事件的使用例子
例如,您可以很容易地添加一个路线:
公共函数设置(){/ /……这个美元- >调度程序- >连接(“routing.load_configuration”,数组(这个美元,“listenToRoutingLoadConfiguration”));}公共函数listenToRoutingLoadConfiguration(sfEvent美元的事件){美元的路由=美元的事件- >getSubject();如果(!美元的路由- >hasRouteName(“my_route”)){美元的路由- >prependRoute(“my_route”,新sfRoute(' / my_route ',数组(“模块”= >“默认”,“行动”= >“foo”)));}}
URL解析发生初始化后,通过sfPatternRouting: parse ()
方法。有很多方法,但只要说结束的时候我们到达parse ()
实例化的方法,找到正确的路线,并绑定到相关参数。
请注意
有关路由的更多信息,请参阅先进的路由
这本书的一章。
一旦加载了所有工厂和正确设置,context.load_factories
事件被触发。这个事件是很重要的因为它是最早的事件框架的开发人员访问所有symfony的核心工厂对象(请求、响应用户、日志、数据库等)。ob娱乐下载
这也是时间连接到另一个非常有用的事件:template.filter_parameters
。这个事件发生时,每当一个文件呈现sfPHPView
实际上允许开发人员控制的参数传递给模板。sfContext
利用这一事件将一些有用的参数添加到每个模板(即sf_context美元
,sf_request美元
,sf_params美元
,sf_response美元
和sf_user美元
)。
你可以连接到template.filter_parameters
事件以添加额外的自定义全局参数模板。
利用template.filter_parameters
事件
说你决定每一个模板使用应该访问一个特定的对象,说一个helper对象。您将添加下面的代码ProjectConfiguration
:
公共函数设置(){/ /……这个美元- >调度程序- >连接(“template.filter_parameters”,数组(这个美元,“templateFilterParameters”));}公共函数templateFilterParameters(sfEvent美元的事件,美元的参数){美元的参数(“my_helper_object”]=新MyHelperObject();返回美元的参数;}
现在每个模板的一个实例MyHelperObject
通过my_helper_object美元
。
sfContext
总结
- 初始化的
sfContext
- 工厂装货
- 活动通知:
- 全球模板参数添加
一个词在配置处理程序
配置处理程序是symfony的配置的核心系统。ob娱乐下载配置处理程序负责理解一个配置文件背后的意义。每个配置处理程序是一个简单的类,用来将一组yaml配置文件转化为的PHP代码块可以根据需要执行。每个配置文件分配给一个特定的配置处理程序中config_handlers.yml
文件。
需要澄清的是,配置处理程序的工作不实际解析yaml文件(这是由sfYaml
)。而不是每个配置处理程序创建一组PHP方向基于YAML信息并保存这些方向一个PHP文件,以后可以有效地包括。的编译每个YAML配置文件的版本可以在缓存中找到目录。
最常用的配置处理程序是最肯定的sfDefineEnvironmentConfigHandler
,它允许为特定于环境的配置设置。这个配置处理程序只负责获取当前环境的配置设置。
还不相信吗?让我们来探讨sfFactoryConfigHandler
。这个配置处理程序用于编译factories.yml
,这是最重要的一个symfony的配置文件。ob娱乐下载这个配置处理程序是非常特殊的,因为它将YAML配置文件转换为PHP代码,最终工厂实例化(至关重要的组件我们前面谈到)。不是你的平均配置处理程序,是吗?
请求的调度和执行
足够的关于工厂,让我们回到正轨的调度过程。一次sfContext
完成初始化,最后一步是控制器的电话吗调度()
方法,sfFrontWebController:调度()
。
symfony的调度过程本身是非常简单的。ob娱乐下载事实上,sfFrontWebController:调度()
只是把模块和操作名称从请求参数,并将应用程序通过转发sfController:向前()
。
请注意
在这一点上,如果路由不能解析任何模块名称或从当前url,动作名称sfError404Exception
提出,404年将请求转发到错误处理模块(看到了吗sf_error_404_module
和sf_error_404_action
)。注意,您可以从任何地方引发这样一个异常在应用程序中实现这种效果。
的向前
方法负责很多预执行检查以及准备的配置和数据要执行的动作。
第一个控制器检查的存在generator.yml
文件为当前模块。这张支票是执行第一(在一些基本的模块/动作名称清理),因为generator.yml
配置文件(如果它存在的话)负责生成模块的基本操作类(通过它配置处理程序,sfGeneratorConfigHandler
)。这是下一步需要,检查模块和行动的存在。这是委托给控制器,通过sfController: actionExists ()
,进而调用sfController: controllerExists ()
方法。在这里,如果actionExists ()
方法失败了,一个sfError404Exception
是提高。
请注意
的sfGeneratorConfigHandler
是一个特殊的配置处理程序负责实例化的生成器类模块和执行它。关于配置处理程序的更多信息,请参阅一个词在配置处理程序在这一章。同时,以获取更多的信息generator.yml
,请参阅第六章symfony的参考书ob娱乐下载。
这里你可以做除了覆盖sfApplicationConfiguration: getControllerDirs ()
方法在应用程序的配置类。这个方法返回一个数组控制器文件所在的目录,使用一个额外的参数告诉symfony如果它应该检查是否启用通过控制器在每个目录ob娱乐下载sf_enabled_modules
配置选项的settings.yml
。例如,getControllerDirs ()
可能是这样的:
/ * * *控制器/ tmp / myControllers不需要* * /被启用公共函数getControllerDirs(moduleName美元){返回array_merge(父::getControllerDirs(moduleName美元),数组(“/ tmp / myControllers /”。moduleName美元= >假));}
请注意
如果操作不存在,一个sfError404Exception
抛出。
下一步是获取控制器包含动作的一个实例。这是通过处理sfController: getAction ()
方法,actionExists ()
是正面的sfController: getController ()
、方法。最后,添加到控制器实例行动堆栈
。
请注意
行动堆栈是一个FIFO(先进先出)风格堆栈保存所有操作期间执行的请求。堆栈中的每个项目在一个包裹sfActionStackEntry
对象。你可以随时访问堆栈sfContext: getInstance () - > getActionStack ()
或$ this - > getController () - > getActionStack ()
在一个动作。
一点配置加载后,我们将准备执行我们的行动。的特定于模块的配置必须加载,可以在两个不同的地方找到。第一个symob娱乐下载fony查找module.yml
文件(通常位于应用程序/前端/模块/ yourModule / config / module.yml
),因为它是一个YAML配置文件,使用配置缓存。此外,这个配置文件可以声明模块内部,使用mod_yourModule_is_internal
设置将导致请求失败在这一点上从一个内部模块不能被称为公开。
请注意
内部模块以前用于生成(通过电子邮件内容getPresentationFor ()
,例如)。现在,您应该使用其他技术,如部分呈现($ this - > renderPartial方法()
)。
现在,module.yml
加载,是时候来检查一次,当前模块启用。事实上,你可以设置美元的mod_ moduleName_enabled
设置为假
如果你想禁用模块。
请注意
如前所述,有两种不同的方法启用或禁用一个模块。不同的是当模块是禁用的。在第一种情况下,当sf_enabled_modules
设置检查,禁用模块将导致sfConfigurationException
被扔。这应该是永久禁用模块时使用。在第二种情况下,通过美元的mod_ moduleName_enabled
设置,禁用模块将导致应用程序禁用模块(请参阅的sf_module_disabled_module
和sf_module_disabled_action
设置)。你应该用这个当你想暂时禁用模块。
最后的机会在于配置模块config。
文件(应用程序/前端/模块/ yourModule / config / config . php
),您可以将任意的PHP代码运行的上下文sfController:向前()
方法(也就是说,您可以访问sfController
通过实例这个美元
变量,代码是在运行sfController
类)。
调度过程总结
sfFrontWebController:调度()
被称为sfController:向前()
被称为- 检查
generator.yml
- 检查模块/行动的存在
- 检索一个控制器的目录列表
- 检索操作的一个实例
- 通过加载模块配置
module.yml
和/或config。
过滤器链
现在所有配置已经完成,是时候开始真正的工作。在这种特殊情况下,真正的工作是过滤器链的执行。
请注意
ob娱乐下载Symfony的过滤器链实现设计模式被称为链的责任。这是一个简单而强大的模式,允许链接行为,每个部分的链链能够决定是否应该继续执行。链的每一部分也能够执行之前和之后剩下的链的执行。
的配置过滤器链从当前模块的filters.yml
,这就是为什么动作实例是必要的。这是你的机会去修改组执行的过滤器链。记住,呈现过滤器应该总是第一个列表中(稍后我们将看到为什么)。默认的过滤器配置是:
请注意
强烈建议你之间添加您自己的过滤器安全
和缓存
过滤器。
安全过滤器
自呈现
过滤器等待每个人在做任何事情之前,完成第一个过滤器,真正得到执行安全
过滤器。这个过滤器确保一切都是正确的根据security.yml
配置文件。具体地说,过滤器将未经过身份验证的用户登录
模块/行动和一个用户凭证的不足安全
模块/行动。注意,这个过滤器只是执行给定的行动。如果启用了安全
缓存过滤
接下来是缓存
过滤器。这个过滤器利用其防止进一步过滤器执行的能力。事实上,如果缓存中被激活,如果我们有了,为什么还要执行行动?当然,这只能用于一个完全可缓存的页面,这不是绝大多数的页面。
但是这个过滤器有一个第二位的逻辑执行执行过滤后,和之前渲染过滤器。这段代码负责建立正确的HTTP缓存头,并将页面到缓存如果必要,多亏了sfViewCacheManager: setPageCache ()
方法。
执行过滤器
最后但并非最不重要的执行
过滤,最后,执行业务逻辑的照顾和处理相关的视图。
一切开始于过滤器检查缓存当前行动。当然,如果我们有在缓存中,执行跳过和实际行动成功
然后执行视图。
如果行动不是发现在缓存中,然后执行preExecute ()
逻辑控制器,最后执行行动本身。这是通过动作通过调用实例sfActions: execute ()
。这种方法并不多:它只是检查行动是可调用,然后调用它。在过滤器,postExecute ()
现在是采取行动的逻辑执行。
请注意
操作的返回值是非常重要的,因为它将决定视图将得到执行。默认情况下,如果没有找到,返回值sfView:成功
假设(翻译,你猜对了,成功
,如indexSuccess.php
)。
一步领先,查看时间。过滤器检查两个特殊的返回值,你的行动可能返回,sfView: HEADER_ONLY
和sfView::没有
。每个正是他们的名字说:只发送HTTP头(通过内部处理sfWebResponse: setHeaderOnly ()
)或跳过完全呈现。
请注意
内置的视图名称:警报
,错误
,输入
,没有一个
和成功
。但是你可以返回任何你想要的。
一旦我们知道我们做想要呈现的东西,我们准备进入过滤器的最后一步:实际执行。
我们做的第一件事是获取一个sfView
对象通过sfController: getView ()
方法。这个对象可以来自两个不同的地方。首先你可以自定义视图对象的具体行动(假设当前模块/行动,让我们保持简单,模块/动作)actionSuccessView
或module_actionSuccessView
在一个文件叫做应用程序/前端/模块/模块/视图/ actionSuccessView.class.php
。否则,类中定义mod_module_view_class
将使用配置条目。这个值默认为sfPHPView
。
提示
使用你自己的视图类提供了一个机会让你运行一些特定逻辑视图,通过sfView: execute ()
方法。例如,您可以实例化自己的模板引擎。
有三种呈现方式可能呈现的视图:
sfView: RENDER_NONE
”:相当于sfView::没有
,从实际上这个取消任何渲染,渲染。sfView: RENDER_VAR
:填充行动的演讲,然后通过其堆栈的条目sfActionStackEntry: getPresentation ()
方法。sfView: RENDER_CLIENT
默认模式,将渲染视图和饲料响应的内容。
请注意
事实上,只有通过使用渲染模式sfController: getPresentationFor ()
方法返回给定的渲染模块/行动
显示过滤器
我们现在几乎完成,只是最后一步。执行过滤器链几乎已经完成了,但是你还记得呈现过滤器吗?这是年初以来链式等待每个人来完成他们的工作,这样就可以做自己的工作。即呈现过滤器将响应内容发送到浏览器,使用sfWebResponse:发送()
。
摘要过滤器链的执行
- 过滤器链是实例化的配置
filters.yml
文件 - 的
安全
过滤检查授权和凭证 - 的
缓存
过滤器处理当前页面的缓存 - 的
执行
过滤器实际上执行的行动 - 的
呈现
过滤器发送响应sfWebResponse
全球的总结
- 检索应用程序的配置
- 创建一个
sfContext
实例 - 初始化的
sfContext
- 工厂装货
- 活动通知:
request.filter_parameters
routing.load_configuration
context.load_factories
- 全球模板参数添加
sfFrontWebController:调度()
被称为sfController:向前()
被称为- 检查
generator.yml
- 检查模块/行动的存在
- 检索一个控制器的目录列表
- 检索操作的一个实例
- 通过加载模块配置
module.yml
和/或config。
- 过滤器链是实例化的配置
filters.yml
文件 - 的
安全
过滤检查授权和凭证 - 的
缓存
过滤器处理当前页面的缓存 - 的
执行
过滤器实际上执行的行动 - 的
呈现
过滤器发送响应sfWebResponse
最终的想法
就是这样!请求已经处理,我们现在准备好了另一个。当然,我们可以写一整本书来symfony的内部流程,所以本章只作为一个概述。ob娱乐下载欢迎你多来探索自己——这是来源,将来,永远都是,最好的学习方法的真实力学框架或库。
这项工作在Creative Commons许可Attribution-Share都3.0 Unported许可执照。