第十七章——扩展Symfonyob娱乐下载
最终,您将需要改变symfony的行为。ob娱乐下载你是否需要修改某个类的行为方式或添加您自己的自定义功能,这将不可避免地发生,因为所有客户没有具体要求,框架可以预测。实际上,这种情况很常见,symfony提供了一种机制来扩展现有的类在运行时,除了简单的ob娱乐下载类继承。你甚至可以取代核心symfony类通过修改工厂设置。ob娱乐下载一旦你建立了一个扩展,你可以很容易地包插件,以便它可以在其他应用程序中重用,或由其他symfony用户。ob娱乐下载
事件
PHP不支持多重继承,这意味着它是不可能有一个类扩展超过另一个类。也不可能将新方法添加到现有类或覆盖现有的方法。为了缓解这两个限制和真正的可扩展框架,symfony介绍一个ob娱乐下载事件系统灵感来自于可可通知中心,基于观察者设计模式。
理解事件
的一些symfony类“ob娱乐下载通知调度员事件”在不同时刻的生活。例如,当用户改变他们的文化,用户对象通知change_culture
事件发生。这就像一个喊在项目的空间,他说:“我这样做。对它做任何你想做的”。
你可以决定在事件触发时做点特别的事情。例如,你可以保存用户文化每次到一个数据库表change_culture
事件发生时。为了做到这一点,你需要注册一个事件监听器换句话说,你必须声明一个函数,将在事件发生时被称为。清单丹麦队显示了如何在用户的注册一个侦听器change_culture
事件。
清单丹麦队,注册一个事件监听器
美元的调度员- >连接(“user.change_culture”,“changeUserCulture”);函数changeUserCulture(sfEvent美元的事件){$ user=美元的事件- >getSubject();美元的文化=美元的事件(“文化”];/ /与用户做一些文化}
所有事件和监听器注册是由一个特殊的对象称为事件调度器。这个对象可以从在symfony的方式ob娱乐下载ProjectConfiguration
实例,大多数symfony提供了一个对ob娱乐下载象getEventDispatcher ()
方法来获取直接访问它。使用调度程序的connect ()
方法,您可以注册任何PHP调用(一个类方法或函数)被称为一个事件发生时。的第一个参数connect ()
是事件标识符,它是一个字符串组成的名称空间和名称。第二个参数是一个PHP调用。
请注意
检索应用程序中的事件调度程序从任何地方:
美元的调度员= ProjectConfiguration::getActive()- >getEventDispatcher();
一旦函数注册的事件调度程序,它等待直到事件触发。事件调度器保持记录所有事件监听器,和知道哪些事件发生时调用。当调用这些方法或函数,调度员通过他们sfEvent
对象作为参数。
事件对象存储的信息通知事件。事件通知可以由于检索getSubject ()
方法,和事件参数可通过使用事件对象数组(例如,$事件['文化']
可用于检索文化
通过参数sfUser
当通知user.change_culture
)。
总结一下,事件系统允许您添加现有类的能力或修改其方法在运行时,不使用继承。
通知一个事件侦听器
就像symfony类ob娱乐下载通知事件偶有发生,自己的类可以提供运行时的可扩展性和通知的事件在特定场合。例如,假设您的应用程序请求几个第三方web服务,并写了一个sfRestRequest
类来包装这些请求的其他逻辑。一个好主意会触发一个事件每一次这类新请求。这将使添加日志记录或缓存功能更容易在未来。清单17-2显示了您需要添加到现有的代码fetch ()
方法通知一个事件侦听器。
清单17-2 -通知一个事件侦听器
类sfRestRequest{受保护的美元的调度员=零;公共函数__construct(sfEventDispatcher美元的调度员){这个美元- >调度程序=美元的调度员;}/ * * *使得外部web服务查询* /公共函数获取(美元的uri,美元的参数=数组()){/ /通知调度员的获取过程的开始这个美元- >调度程序- >通知(新sfEvent(这个美元,“rest_request.fetch_prepare”,数组(“uri”= >美元的uri,“参数”= >美元的参数)));/ /使美元请求,并将结果存储在一个结果变量/ /……/ /通知调度员的获取过程这个美元- >调度程序- >通知(新sfEvent(这个美元,“rest_request.fetch_success”,数组(“uri”= >美元的uri,“参数”= >美元的参数,“结果”= >美元的结果)));返回美元的结果;}}
的notify ()
事件调度器预计的方法sfEvent
对象作为参数;这是同一对象传递给事件侦听器。这个对象总是带有引用通知(这就是为什么事件实例初始化这
)和一个事件标识符。可选地,它接受一个参数的关联数组,给听众一个相互交流的方式通知的逻辑。
通知事件的调度程序,直到一个侦听器处理
通过使用notify ()
方法,你确保所有的侦听器注册通知事件执行。然而,在某些情况下,你需要让一个侦听器停止事件,防止进一步的听众通知。在这种情况下,您应该使用notifyUntil ()
而不是notify ()
。调度程序将执行所有听众,直到一个回报真正的
,然后停止事件通知。换句话说,notifyUntil ()
就像一个项目空间中喊说:“我这样做。如果有人在乎,那么我不会告诉任何人。”清单相信你展示了如何使用这种技术结合魔法__call ()
方法将方法添加到一个现有的类在运行时。
清单相信你-通知事件,直到一个侦听器返回True
类sfRestRequest{/ /……公共函数__call(美元的方法,美元的参数){美元的事件=这个美元- >调度程序- >notifyUntil(新sfEvent(这个美元,“rest_request.method_not_found”,数组(“方法”= >美元的方法,“参数”= >美元的参数)));如果(!美元的事件- >isProcessed()){扔新sfException(sprintf(调用未定义方法%年代:% s。,get_class(这个美元),美元的方法));}返回美元的事件- >getReturnValue();}}
一个事件侦听器注册的rest_request.method_not_found
事件可以测试要求美元的方法
并决定处理它,或者传递给下一个事件监听器调用。在清单节中,您可以看到第三方类可以添加put ()
和delete ()
方法sfRestRequest
类在运行时用这个技巧。
清单以17 -处理通知,直到事件类型
类frontendConfiguration扩展sfApplicationConfiguration{公共函数配置(){/ /……/ /注册监听器这个美元- >调度程序- >连接(“rest_request.method_not_found”,数组(“sfRestRequestExtension”,“listenToMethodNotFound”));}}类sfRestRequestExtension{静态公共函数listenToMethodNotFound(sfEvent美元的事件){开关(美元的事件(“方法”]){情况下“把”:自我::把(美元的事件- >getSubject(),美元的事件(“参数”]);返回真正的;情况下“删除”:自我::删除(美元的事件- >getSubject(),美元的事件(“参数”]);返回真正的;默认的:返回假;}}静态受保护的函数把(restRequest美元,美元的参数){/ /做一个put请求并将结果存储在一个美元的结果变量/ /……美元的事件- >setReturnValue(美元的结果);}静态受保护的函数删除(restRequest美元,美元的参数){/ /做一个删除请求并将结果存储在一个美元的结果变量/ /……美元的事件- >setReturnValue(美元的结果);}}
在实践中,notifyUntil ()
提供多重继承功能,或者说mixin(从第三方类添加方法到现有类),PHP。你现在可以“注入”的新方法,你不能扩展的对象的继承方式。这发生在运行时。你不再受限于PHP的面向对象的功能,当你使用symfony。ob娱乐下载
提示
作为第一个侦听器去赶notifyUntil ()
事件阻止进一步的通知,你可能担心听众的顺序执行。这个顺序对应于侦听器注册的顺序——第一次注册,第一次执行。在实践中,这可能是一个问题的情况很少发生。如果你意识到两个听众冲突在一个特定的事件,也许你的类应该通知几个事件,例如一个开始和一个结束时执行的方法。如果你使用事件将新方法添加到一个现有的类,命名您的明智的方法,这样其他尝试添加方法不冲突。方法名称前面加上与侦听器类的名称是一个很好的实践。
换一个方法的返回值
你可以想象一个侦听器不仅可以利用这些信息由一个事件,而且修改它,改变原来的逻辑的通知。如果你想让这个,你应该使用filter ()
事件调度器而不是方法notify ()
。所有事件监听器然后使用两个参数:事件对象和值来过滤。事件监听器必须返回值,是否改变与否。清单17显示了如何filter ()
可用于滤波器响应从web服务响应和转义特殊字符。
清单17 - - - - - - -通知和处理一个过滤器的事件
类sfRestRequest{/ /……/ * * * * /查询到外部web服务公共函数获取(美元的uri,美元的参数=数组()){/ /使美元请求,并将结果存储在一个结果变量/ /……/ /通知的获取过程返回这个美元- >调度程序- >过滤器(新sfEvent(这个美元,“rest_request.filter_result”,数组(“uri”= >美元的uri,“参数”= >美元的参数,)),美元的结果)- >getReturnValue();}}/ /转义添加到web服务响应美元的调度员- >连接(“rest_request.filter_result”,“rest_htmlspecialchars”);函数rest_htmlspecialchars(sfEvent美元的事件,美元的结果){返回htmlspecialchars函数(美元的结果ENT_QUOTES,“utf - 8”);}
内置的事件
symfony的ob娱乐下载许多类有内置的事件,允许您扩展框架而不必改变类本身。表丹麦队列出了这些事件,连同他们的类型和参数。
表丹麦队,Symfony的ob娱乐下载事件
事件名称(类型) | 通知 | 参数 |
---|---|---|
application.log(通知) | 很多类 | 优先级 |
应用程序。扔_exception (notifyUntil) | sfException | - - - - - - |
自动装载。过滤器_config (filter) | sfAutoloadConfigHandler | - - - - - - |
命令。日志(通知) | sfCommand *类 | 优先级 |
命令。pre_command (notifyUntil) | sfTask | 参数,选项 |
命令。post_command(通知) | sfTask | - - - - - - |
命令。过滤器_options (filter) | sfTask | command_manager |
配置。method_not_found (notifyUntil) | sfProjectConfiguration | 方法,参数 |
组件。method_not_found (notifyUntil) | sfComponent | 方法,参数 |
上下文。load_factories(通知) | sfContext | - - - - - - |
上下文。method_not_found (notifyUntil) | sfContext | 方法,参数 |
控制器。change_action(通知) | sfController | 模块,行动 |
控制器。method_not_found (notifyUntil) | sfController | 方法,参数 |
控制器。page_not_found(通知) | sfController | 模块,行动 |
debug.web。load_panels(通知) | sfWebDebug | - - - - - - |
debug.web.view。过滤器_parameter_html (filter) | sfWebDebugPanelView | 参数 |
教义。配置(通知) | sfDoctrinePluginConfiguration | - - - - - - |
教义。过滤器_model_builder_options (filter) | sfDoctrinePluginConfiguration | - - - - - - |
教义。过滤器_cli_config (filter) | sfDoctrinePluginConfiguration | - - - - - - |
教义。配置_connection (notify) | Doctrine_Manager | 数据库连接, |
doctrine.admin.delete_object(通知) | - - - - - - | 对象 |
doctrine.admin。save_object(通知) | - - - - - - | 对象 |
doctrine.admin。build_query(过滤器) | - - - - - - | |
doctrine.admin。pre_execute(通知) | - - - - - - | 配置 |
的形式。post_configure(通知) | sfFormob娱乐下载Symfony | - - - - - - |
的形式。filter_values(过滤器) | sfFormob娱乐下载Symfony | - - - - - - |
的形式。validation_error(通知) | sfFormob娱乐下载Symfony | 错误 |
的形式。method_not_found (notifyUntil) | sfFormob娱乐下载Symfony | 方法,参数 |
梅勒。配置(通知) | sfMailer | - - - - - - |
插件。pre_install(通知) | sfPluginManager | 通道,插件,is_package |
插件。post_install(通知) | sfPluginManager | 频道,插件 |
插件。pre_uninstall(通知) | sfPluginManager | 频道,插件 |
插件。post_uninstall(通知) | sfPluginManager | 频道,插件 |
推动。配置(通知) | sfPropelPluginConfiguration | - - - - - - |
推动。过滤器_phing_args (filter) | sfPropelBaseTask | - - - - - - |
推动。过滤器_connection_config (filter) | sfPropelDatabase | 名称、数据库 |
propel.admin.delete_object(通知) | - - - - - - | 对象 |
propel.admin。save_object(通知) | - - - - - - | 对象 |
propel.admin。build_criteria(过滤器) | - - - - - - | |
propel.admin。pre_execute(通知) | - - - - - - | 配置 |
请求。过滤器_parameters (filter) | sfWebRequest | path_info |
请求。method_not_found (notifyUntil) | sfRequest | 方法,参数 |
响应。method_not_found (notifyUntil) | sfResponse | 方法,参数 |
响应。过滤器_content (filter) | sfResponse, sfException | - - - - - - |
routing.load_configuration(通知) | sfRouting | - - - - - - |
task.cache。明确(notifyUntil) | sfCacheClearTask | 应用类型,env |
task.test。过滤器_test_files (filter) | sfTestBaseTask | 参数,选项 |
模板。过滤器_parameters (filter) | sfViewParameterHolder | - - - - - - |
user.change_culture(通知) | sfUser | 文化 |
用户。method_not_found (notifyUntil) | sfUser | 方法,参数 |
用户。change_authentication(通知) | sfBasicSecurityUser | 通过身份验证 |
视图。configure_format(通知) | sfView | 格式、响应请求 |
视图。method_not_found (notifyUntil) | sfView | 方法,参数 |
view.cache。过滤器_content (filter) | sfViewCacheManager | 反应,uri,新 |
你是自由的在任何这些事件注册事件侦听器。只要确保侦听器调用返回一个布尔当注册notifyUntil
事件类型,返回过滤值在注册一个过滤器
事件类型。
请注意,事件名称空间不一定匹配类角色。例如,所有symfony类通知的ob娱乐下载application.log
事件时需要出现在日志文件(并在web调试工具栏):
美元的调度员- >通知(新sfEvent(这个美元,“application.log”,数组(美元的消息)));
自己的类可以做同样的事情,并通知symfony事件时是有意义的。ob娱乐下载
注册监听器在哪里?
需要注册事件侦听器的早期生活中一个symfony请求。ob娱乐下载在实践中,正确的地方注册事件侦听器在应用程序配置类。这个类有参考事件的调度程序,您可以使用配置()
方法。清单夺得显示了如何注册一个侦听器的rest_request
上述事件的例子。
清单夺得-注册一个侦听器在应用程序中配置类,应用程序/前端/ config / ApplicationConfiguration.class.php
类frontendConfiguration扩展sfApplicationConfiguration{公共函数配置(){/ /……这个美元- >调度程序- >连接(“rest_request.method_not_found”,数组(“sfRestRequestExtension”,“listenToMethodNotFound”));}}
插件(见下文)可以注册自己的事件监听器。他们应该用插件的配置/ config。
执行脚本,它在应用程序初始化期间,提供访问事件调度程序通过$ this - >调度员
。
工厂
工厂类的定义是一个特定的任务。ob娱乐下载Symfony依靠工厂等核心功能的控制器和会话能力。例如,当框架需要创建一个新的请求对象,它会搜索在工厂定义类的名称使用。默认为请求工厂定义sfWebRequest
,所以syob娱乐下载mfony创建这个类的一个对象来处理请求。使用工厂定义的很大的优势是,它很容易改变框架的核心功能:更改工厂定义,symfony将使用您的自定义请求类,而不是自己的。ob娱乐下载
工厂定义存储在factories.yml
配置文件。定义文件清单17-7显示了默认的工厂。每个定义都是由一个自动装载类的名称和(可选)的一组参数。例如,会话存储工厂(设置下储存:
键)使用一个session_name
客户端电脑上创建cookie参数名称允许持久会话。
清单17-7 -默认工厂文件,前端/ config / factories.yml
——刺激:logger类:sfNoLogger参数:水平:犯错伐木工:~测试:存储:类:sfSessionTestStorage参数:session_path: % SF_TEST_CACHE_DIR % /会话响应:类:sfWebResponse参数:send_http_headers:假梅勒:param: delivery_strategy:没有开发:梅勒:param: delivery_strategy::没有一个路由:类:sfPatternRouting参数:generate_shortest_url:真正的extra_parameters_as_query_string:真实view_cache_manager:类:sfViewCacheManager参数:cache_key_use_vary_headers:真正的cache_key_use_host_name:真的
改变工厂最好的方法是创建一个新类继承从默认工厂和添加新方法。例如,设置为用户会话工厂myUser
类(位于前端/ lib /
)和继承自sfUser
。使用相同的机制,利用现有的工厂。清单17-8显示了一个示例请求对象的一个新工厂。
清单17-8 -覆盖工厂
/ /创建一个myRequest.class。php的自动装载目录,/ /例如前端/ lib /< ? php类myRequest扩展sfRequest{/ /你的代码}/ /声明在factories.yml这类请求工厂:要求:类:myRequest
插件
你可能会需要一段代码重用,你为你的一个symfony开发应用程序。ob娱乐下载如果你能这段代码打包成一个类,没有问题:类的下降lib /
另一个应用程序文件夹,自动装卸机将其余的照顾。但是如果代码分布在多个文件,如一个完整的新主题管理发电机或JavaScript文件和助手自动化您最喜爱的视觉效果,只是复制文件并不是最好的解决方案。
插件提供了一个方法包代码在几个文件中传播和跨多个项目重用代码。插件,你可以包类、过滤器、事件监听器、助手、配置、任务、模块、模式和模型扩展,固定装置,网络资产,等。插件很容易安装、升级、卸载。它们可以作为一个分布. tgz
存档、梨包或一个简单的付款代码库。PEAR打包插件依赖关系管理的优势,更容易升级和自动发现。symfob娱乐下载ony加载机制考虑插件和插件提供的功能是可用的项目如果插件代码框架的一部分。
所以,基本上,一个插件是一个包装扩展为一个symfony项目。ob娱乐下载与插件,您不仅可以跨应用程序重用自己的代码,但是你也可以重用的发展由其他贡献者和添加第三方扩展symfony的核心。ob娱乐下载
发现Symfonob娱乐下载y插件
symfob娱乐下载ony项目网站包含一个部分专门symfony插件和可访问以下网址:
/插件/
每个插件有自己的页面,列出详细的安装说明和文档。欧宝官网下载app
这些插件是来自社区的贡献,和一些来自symfony的核心开发人员。欧宝体育平台怎么样ob娱乐下载在后者中,你会发现以下几点:
sfFeed2Plugin
:自动化RSS和Atom提要的操纵sfThumbnailPlugin
:创建缩略图,例如,上传图片sfMediaLibraryPlugin
:允许媒体上传和管理,包括一个扩展为富文本编辑器允许创作富文本内部的图像sfGuardPlugin
:提供认证、授权和其他用户管理功能在symfony的标准安全特性ob娱乐下载sfSuperCachePlugin
:写页面缓存目录下的web根允许web服务器提供尽可能快sfErrorLoggerPlugin
:每404和500错误日志数据库,并提供了一个管理模块浏览这些错误sfSslRequirementPlugin
:提供SSL加密支持行动
你应该定期检查symfony插件部分,因为插件添加所有的时间,他们的许ob娱乐下载多方面带来非常有用的快捷键web应用程序编程。
除了symfony插件部分,其ob娱乐下载他方法来分发存档下载插件是提出一个插件,主机在梨频道,或将这些数据存储在一个公共版本控制存储库。
安装一个插件
插件安装过程根据不同的方式打包。总是把README文件和/或安装插件下载页面上的说明。
对每一个项目的插件安装应用程序。在以下部分中描述的所有方法导致把所有插件的文件到一个myproject /插件/ pluginName /
目录中。
梨插件
插件在symfony上市插件部分可以作为梨捆绑ob娱乐下载包,可以通过官方symfony插件梨频道:plugins.ob娱乐下载symfony-project.org
。要安装这些插件,可以使用插件:安装
任务插件名称,如清单17-9所示。
清单17-9 -安装symfony官方插件的插件梨通道ob娱乐下载
cd myproject php symfob娱乐下载ony插件:美元安装pluginName
或者,您可以从磁盘下载插件并安装它。在这种情况下,使用包存档的路径,如清单17-10所示。
清单17-10 -从PEAR包下载安装插件
cd myproject php symfob娱乐下载ony插件:美元安装/home/path/to/downloads/pluginName.tgz
一些插件是托管在外部梨频道。安装的插件:安装
任务,别忘了注册通道和通道名称,如清单17-11所示。
清单17-11 -从梨通道安装插件
cd myproject php symfob娱乐下载ony插件:美元add-channel channel.symfony.pear.example.com php symfony插件:美元安装——频道= channel.symfony.pear.example.com pluginName
这三种类型的安装都使用PEAR包,所以将使用术语“梨插件”不分青红皂白地谈论插件安装symfony的插件梨通道,外部梨频道,或梨包下载。ob娱乐下载
的插件:安装
任务还需要大量的选项,如清单17-12上显示。
有一些选项清单17-12 -安装一个插件
php syob娱乐下载mfony插件:美元美元——稳定=βpluginName php安装symfony插件:安装——释放= 1.0.3 pluginName php symfony插件:美元安装——install-deps pluginName
提示
至于每一个symfony的ob娱乐下载任务,你可以有一个充分的解释插件:安装
通过启动选项和参数php ob娱乐下载symfony帮助插件:安装
。
归档文件的插件
一些插件来作为一个简单的存档的文件。安装这些,只是解包档案到您的项目的插件/
目录中。如果插件包含一个web /
子目录,别忘了运行插件:发布资产
主要下命令来创建相应的符号链接web /
如清单17-13所示的文件夹。最后,别忘了清除缓存。
从一个归档清单17-13 -安装一个插件
cd插件焦油-zxpf美元并且。tgz $ cd . .php syob娱乐下载mfony插件:美元发布资产美元php symfony cc
从一个版本控制存储库安装插件
插件有时候有自己的源代码版本控制存储库。你可以安装他们的做一个简单的检查插件/
目录,但这可能会产生问题,如果你的项目本身置于版本控制之下。
或者,您可以将插件声明为外部依赖,这样每次更新项目的源代码也更新插件源代码。例如,Subversion存储的外部依赖svn:外部
财产。所以你可以添加插件通过编辑此属性和更新您的源代码之后,如清单17-14所示。
清单17-14 -从源代码版本库安装一个插件
cd myproject svn美元propedit svn:外部插件pluginName http://svn.example.com/pluginName/trunk svn了php symfony插件:美元发布资产美元php syob娱乐下载mfony cc
请注意
如果插件包含一个web /
目录,symfonyob娱乐下载插件:发布资产
命令必须运行在主下生成相应的符号链接web /
项目的文件夹。
激活一个插件模块
一些插件包含整个模块。模块插件和古典模块之间唯一的区别是,不要出现在模块插件/前端/模块/ myproject /应用程序
目录(让他们轻松地升级)。他们也需要被激活settings.yml
文件,如清单17-15所示。
清单17-15 -激活插件模块前端/ config / settings.yml
:.settings: enabled_modules:[违约,sfMyPluginModule]
这是为了避免情况的插件模块错误地提供应用程序不需要它,可以打开一个安全漏洞。想想一个插件,它提供了前端
和后端
模块。您需要启用前端
模块只在你前端
应用程序,后端
人只有在后端
应用程序。这就是为什么不默认激活插件模块。
提示
默认的模块是唯一默认启用模块。不是一个真正的插件模块,因为它驻留在框架中,sfConfig: get (sf_ob娱乐下载symfony_lib_dir) /控制器/违约
。这个模块提供了祝贺页,和404年的默认错误页面和凭证错误。如果你不想使用symfony的默认页面,删除这个模块的ob娱乐下载enabled_modules
设置。
列出已安装的插件
如果看你的项目的插件/
插件安装目录可以告诉你,插件:列表
任务告诉你更多:版本号和每个安装插件的通道名称(请参见清单17-16)。
清单17-16 -清单已安装的插件
cd myproject php symfob娱乐下载ony插件:美元安装插件列表:sfPrototypePlugin 1.0.0-stable # plugins.symfony-project.com (symfony) sfSuperCachePlugin 1.0.0-stable # plugins.symfony-project.com (symfony) sfThumbnail 1.1.0-stable # plugins.symfony-project.com (symfony)
升级和卸载插件
卸载一个梨插件调用插件:卸载
项目任务从根目录,如清单17-17所示。你必须安装的插件名称前缀频道如果是不同于默认ob娱乐下载
通道(使用插件:列表
任务来确定这个通道)。
清单17-17 -卸载插件
cd myproject php symfob娱乐下载ony插件:美元美元卸载sfSuperCachePlugin php symfony cc
卸载插件或存档一个SVN插件,手动删除插件文件从项目插件/
和web /
目录,并清除缓存。
升级一个插件,或者使用插件:升级
任务(梨插件)或做一个svn更新
(如果你抓住了插件从版本控制存储库)。归档文件的插件不能轻易升级。
解剖一个插件
插件使用PHP语言编写。如果你能理解应用程序是如何组织的,你能理解结构的插件。
插件文件结构
一个插件目录组织或多或少像是项目目录。插件文件必须在正确的目录以便在需要的时候被自动加载symfony。ob娱乐下载看一看这个插件文件结构描述清单17 - 18。
清单17 - 18 -文件结构的一个插件
pluginName / config /路由。yml / /路由配置文件app.yml / /插件默认设置*模式。yml模式* / /数据。xml配置。php / /特定的插件配置数据/发电机/ sfPropelAdmin * / / /管理发电机主题模板/框架/夹具/ *。yml / /设备文件lib / *。php / /类辅助/ *。php / * / /帮手模型。php / / / * Task.class模型类任务。php / / CLI任务模块/ * / / / / actions.class模块操作。php配置/模块。yml视图。yml安全。/ * yml模板。php web / * / /资产
插件的能力
插件可以包含很多东西。他们的内容会自动考虑您的应用程序在运行时,当与命令行调用任务。但对于插件正常工作,你必须尊重一些约定:
- 检测到的数据库模式
推动- - - - - -
任务。当你打电话推动:构建——类
或原则:建立——类
在您的项目,您重建项目模型和所有插件模型。注意,推动插件模式必须始终有一个包属性下的形状plugins.pluginName
。lib.model
,如清单19所示。如果你使用原则,任务将在插件目录自动生成的类。
清单17 - 19——推动模式声明的示例插件,编写myPlugin / config / schema.yml
推动:_attributes:{包:plugins.myPlugin.lib。模型}my_plugin_foobar: _attributes: {phpName: myPluginFoobar} id:名称:{类型:varchar大小:255年,指数:独特}…
- 插件配置是包含在插件配置类(
PluginNameConfiguration.class.php
)。这个文件是执行应用程序和项目配置后,所以symfony已经引导。ob娱乐下载例如,您可以使用这个文件事件监听器和扩展现有类的行为。 - 设备文件位于插件
数据/夹具/
目录的处理推动:数据加载
或原则:数据加载
的任务。 - 自定义类自动装载就像你放在你的项目的
lib /
文件夹。 - 助手会自动发现当你调用
use_helper ()
在模板。他们必须在一个辅助/
子目录的插件之一lib /
目录中。 - 如果你使用推动,模型类
编写myplugin / lib /模型/
专门生成的模型类推动builder(在编写myplugin / lib /模型/ om /
和编写myplugin / lib /模型/地图/
)。当然,他们是自动装载。请注意,您不能覆盖生成的模型类的插件在你自己的项目目录。 - 如果你使用原则,ORM生成插件的基类
编写myplugin / lib /模型/插件* .class.php
,具体类编写myplugin / lib /模型/
。这意味着您可以轻松地覆盖在您的应用程序模型类。 - 任务是立即尽快symfony命令行安装插件。ob娱乐下载一个插件可以添加新任务,或者覆盖现有文件。最佳实践是使用插件名称的命名空间的任务。类型
php ob娱乐下载symfony
查看可用的任务列表,包括添加的插件。 - 模块提供新的行动从外部访问,如果你声明它们
enabled_modules
在应用程序中设置。 - 网络资产(图像、脚本、样式表等)可用到服务器。当你安装一个插件通过命令行,symfony创建一个符号链接的项目ob娱乐下载
web /
目录如果系统允许它,或者拷贝的内容模块web /
目录的项目之一。如果插件安装的档案或版本控制存储库,你必须复制插件web /
(手工目录自述
捆绑的插件应该提到)。
提示
注册路由规则插件插件可以添加新规则路由系统,但它不是recomandable通过使用一个定制的routing.yml
配置文件。这是因为规则定义的顺序是非常重要的,和简单的级联配置系统的YAML文件在symfony会搞砸这个顺序。ob娱乐下载相反,插件需要注册一个事件监听器routing.load_configuration
事件侦听器和手动预谋规则:
/ /插件/编写myPlugin / config / config . php这个美元- >调度程序- >连接(“routing.load_configuration”,数组(“myPluginRouting”,“listenToRoutingLoadConfigurationEvent”));/ /插件/编写myPlugin / lib / myPluginRouting.php类myPluginRouting{静态公共函数listenToRoutingLoadConfigurationEvent(sfEvent美元的事件){美元的路由=美元的事件- >getSubject();/ /添加插件路由规则上现有的服务美元的路由- >prependRoute(“my_route”,新sfRoute(“my_plugin /:行动”,数组(“模块”= >“myPluginAdministrationInterface”)));}}
提示:定义默认设置配置/ app.yml
插件可以在其定义的默认设置配置/ app.yml
文件。然而覆盖设置中定义另一个插件是不安全的最终价值将取决于app.yml
文件加载顺序。自定义应用程序配置可用于插件代码(例如,通过使用sfConfig: get (“app_myplugin_foo”)
可以覆盖)和设置在应用程序级别(参见清单17 - 20为例)的处理默认值可以通过使用第二个参数sfConfig: get ()
方法或通过定义插件app.yml
文件。
手动插件安装
有一些元素插件:安装
任务不能自行处理,在安装过程中需要手工设置:
- 应该添加自定义路由通过插件代码
routing.load_configuration
事件或手动给应用程序routing.yml
。 - 自定义过滤器必须手动添加到应用程序
filters.yml
。 - 定制工厂必须手动添加到应用程序
factories.yml
。
与这样的手工设置应该嵌入一个插件自述
文件详细描述的安装。
定制应用程序的插件
每当你想要定制一个插件,从未改变的代码中发现的插件/
目录中。如果你这样做,你将失去你所有的修改升级插件。定制需求,插件提供自定义设置,并支持覆盖。
精心设计的插件应用程序中使用的设置可以改变app.yml
,如清单17 - 20所示。
清单17日-定制插件,使用应用程序配置
/ /插件代码示例$ foo= sfConfig::得到(“app_my_plugin_foo”,“酒吧”);/ /改变“foo”默认值app.yml(酒吧)应用程序所有:my_plugin: foo:理发员
模块设置及其默认值通常在插件的描述自述
文件。
你可以替换默认插件模块通过创建一个模块的内容相同的名称在您自己的应用程序。真的不是最重要的,因为应用程序中的元素而不是使用的插件。它的工作原理很好如果你创建模板和配置文件的名称相同的插件。
另一方面,如果一个插件想提供一个模块覆盖其行动的能力,actions.class.php
在插件模块必须是空的,继承一个半自动的类,这个类的方法可以被继承的actions.class.php
应用程序的模块。例如17 - 21见清单区间。
- 17 - 21清单区间定制插件行动
/ /编写myPlugin /模块/ mymodule里/ lib / myPluginmymoduleActions.class.php类myPluginmymoduleActions扩展sfActions{公共函数executeIndex(){/ /一些代码}}/ /编写myPlugin /模块/ mymodule里/行动/ actions.class.phprequire_once目录名(__FILE__)。“/ . . / lib / myPluginmymoduleActions.class.php”;类mymoduleActions扩展myPluginmymoduleActions{/ /没有}/ /在前端/模块/ mymodule里/行动/ actions.class.php类mymoduleActions扩展myPluginmymoduleActions{公共函数executeIndex(){/ /覆盖插件代码}}
侧边栏
自定义插件模式
学说
在构建模型时,原则将寻找所有的* schema.yml
在应用程序和插件的配置/
目录,所以项目模式可以覆盖一个插件模式。合并过程允许添加或修改的表或列。例如,下面的例子显示了如何将列添加到一个表中定义的插件模式。
#原始模式,编写myPlugin / config /插件/模式。yml:条列:名称:字符串(50)#项目模式,配置/模式。yml:条列:stripped_title: string(50) #产生的模式,合并后的内部和用于模型和sql生成文章:列:名称:字符串(50)stripped_title:字符串(50)
推动
在构建模型时,symfony会寻找定制YAML文件ob娱乐下载为每个现有的模式,包括插件的,下面这条规则:
原始模式名称 | 自定义模式名称 |
---|---|
配置/ schema.yml | schema.custom.yml |
配置/ foobar_schema.yml | foobar_schema.custom.yml |
插件/编写myPlugin / config / schema.yml | myPlugin-schema.custom.yml |
插件/编写myPlugin / config / foo_schema.yml | myPlugin_foo-schema.custom.yml |
自定义模式将寻找应用程序和插件的配置/
目录,所以一个插件可以覆盖另一个插件的模式,和可以有不止一个定制模式。
ob娱乐下载Symfony将合并两个模式基于每个表的phpName
。合并过程允许添加或修改表、列和列attibutes。例如,在下一个清单显示了一个定制的模式可以将列添加到一个表中定义一个插件模式。
#原始模式,编写myPlugin / config /插件/模式。yml推动:文章:_attributes: {phpName:}条标题:varchar (50) user_id:{类型:整数}created_at: myPlugin_schema.custom #自定义模式。yml推动:文章:_attributes: {phpName:文章中,包:foo.bar.lib。模型}stripped_title: varchar(50) #产生的模式,合并后的内部和用于模型和sql生成推动:文章:_attributes: {phpName:文章,包:foo.bar.lib。模型}标题:varchar (50) user_id:{类型:整数}created_at: stripped_title: varchar (50)
如表的合并过程使用phpName
作为一个关键,你甚至可以改变一个插件的名称表在数据库中,只要你保持相同的phpName
在模式中。
如何编写一个插件吗
只能安装插件打包为梨包插件:安装
的任务。记住,这样的插件可以经由symfony插件部分,梨频道,或一个简单的文件下载。ob娱乐下载如果你想一个插件作者,最好是发布一个梨包比作为一个简单的档案。此外,梨打包插件更容易升级,可以声明依赖性,并自动部署资产web /
目录中。
文件组织
假设你已经开发出一种新特性,想包一个插件。第一步是逻辑上组织文件,以便symfony加载机制可以在需要的时候找到它们。ob娱乐下载为此目的,你必须遵循清单17 - 18中给出的结构。清单17-22显示文件结构的一个例子sfSamplePlugin
插件。
清单17-22——示例文件包作为一个插件列表
sfSamplePlugin / README许可配置模式。yml sfSamplePluginConfiguration.class。php数据/工装/夹具。yml lib /模型/ sfSampleFooBar。php sfSampleFooBarPeer。php / sfSampleTask.class任务。php验证器/ sfSampleValidator.class。php模块/ sfSampleModule /动作/ actions.class。php配置/安全。yml lib / BasesfSampleModuleActions.class。/ indexSuccess php模板。php web / css / sfSampleStyle。css图像/ sfSampleImage.png
用于编写插件目录的位置(sfSamplePlugin /
清单17-22)并不重要。它可以在磁盘上的任何地方。
提示
以现有插件的例子和为你的第一个尝试创建一个插件,试图重现他们的命名约定和文件结构。
创建包。xml文件
插件编写的下一步是添加一个包。xml文件的根源插件目录。的package.xml
遵循梨的语法。看一看一个典型的symfony插件ob娱乐下载package.xml
清单17-23。
清单17-23——示例package.xml
Symfonob娱乐下载y的插件
< ? xml版本=“1.0”编码=“utf - 8”? ><包packagerversion=1.4.6”版本=“2.0”xmlns=“http://pear.php.net/dtd/package 2.0”xmlns:任务=“http://pear.php.net/dtd/tasks 1.0”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://pear.php.net/dtd/tasks 2.0 - 1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package http://pear.php.net/dtd/package-2.0.xsd”><名称>sfSamplePlugin< /名称><通道>plugins.ob娱乐下载symfony-project.org< /通道><总结>ob娱乐下载symfony示例插件< /总结><描述>只是一个示例插件说明梨包装< /描述><铅><名称>法比安效力< /名称><用户>fabpot< /用户><电子邮件>fabien.potencier@ob娱乐下载symfony-project.com< /电子邮件><活跃>是的< /活动>< /铅><日期>2006-01-18< /日期><时间>15:54:35< /时间><版本><释放>1.0.0< /释放>< api>1.0.0< / api>< /版本><稳定><释放>稳定的< /释放>< api>稳定的< / api>< /稳定><许可证uri=“/许可证”>麻省理工学院的许可< /许可证><笔记>- - - - - -< /笔记><内容>< dir的名字=“/”><文件角色=“数据”的名字=“自述”/ ><文件角色=“数据”的名字=“许可证”/ >< dir的名字=“配置”>< !- - - - - -- - - - - -model --><文件角色=“数据”的名字=“schema.yml”/ ><文件角色=“数据”的名字=“ProjectConfiguration.class.php”/ >< / dir>< dir的名字=“数据”>< dir的名字=“设备”>< !- - - - - -- - - - - -fixtures --><文件角色=“数据”的名字=“fixtures.yml”/ >< / dir>< / dir>< dir的名字=“自由”>< dir的名字=“模型”>< !- - - - - -- - - - - -model classes --><文件角色=“数据”的名字=“sfSampleFooBar.php”/ ><文件角色=“数据”的名字=“sfSampleFooBarPeer.php”/ >< / dir>< dir的名字=“任务”>< !- - - - - -- - - - - -tasks --><文件角色=“数据”的名字=“sfSampleTask.class.php”/ >< / dir>< dir的名字=“验证”>< !- - - - - -- - - - - -validators --><文件角色=“数据”的名字=“sfSampleValidator.class.php”/ >< / dir>< / dir>< dir的名字=“模块”>< dir的名字=“sfSampleModule”><文件角色=“数据”的名字=“动作/ actions.class.php”/ ><文件角色=“数据”的名字=“配置/ security.yml”/ ><文件角色=“数据”的名字=“lib / BasesfSampleModuleActions.class.php”/ ><文件角色=“数据”的名字=“模板/ indexSuccess.php”/ >< / dir>< / dir>< dir的名字=“网络”>< dir的名字=“css”>< !- - - - - -- - - - - -stylesheets --><文件角色=“数据”的名字=“sfSampleStyle.css”/ >< / dir>< dir的名字=“图片”>< !- - - - - -- - - - - -images --><文件角色=“数据”的名字=“sfSampleImage.png”/ >< / dir>< / dir>< / dir>< /内容><依赖关系><要求>< php><敏>5.2.4< /分钟>< / php>< pearinstaller><敏>1.4.1< /分钟>< / pearinstaller><包><名称>ob娱乐下载< /名称><通道>pear.ob娱乐下载symfony-project.com< /通道><敏>1.3.0< /分钟><马克斯>1.5.0< / max><排除>1.5.0< /排除>< /包>< /要求>< /依赖关系>< phprelease/ ><更新日志/ >< /包>
这是有趣的部分<内容>
和< >的依赖关系
标签、描述。剩下的标签,没有什么特定的symfony,所以你可以在网上参考梨ob娱乐下载手册更多的详细信息package.xml
格式。
内容
的<内容>
标记的地方你必须描述插件文件结构。这将告诉梨哪些文件复制和在哪里。描述文件结构< dir >
和<文件>
标签。所有<文件>
标签必须有一个角色= "数据"
属性。的<内容>
清单的一部分17-23清单17-22描述的目录结构。
请注意
的使用< dir >
标签并非强制性的,因为您可以使用相对路径的名字
中的值<文件>
标签。然而,建议这样package.xml
文件仍然是可读的。
插件依赖关系
插件是一个设计来处理给定的一组版本的PHP,梨,symfony, PEAR包,或其他插件。ob娱乐下载声明这些依赖关系< >的依赖关系
标签告诉梨检查所需的包已经安装,并且如果不是引发一个异常。
你应该声明依赖于PHP,梨,symfony,至少自己对应的安装,作为最低要求。ob娱乐下载如果你不知道该怎么说,添加一个要求PHP 5.2.4,梨1.4和1.3 symfony。ob娱乐下载
还建议添加一个symfony的最大版本号为每个插件。ob娱乐下载这将导致一个错误消息,当试图使用一个插件框架的更高级的版本,这将迫使插件作者确保插件正常工作与这个版本发布前一遍。最好是有一个警报和下载升级而不是默默地插件失败。
如果你指定插件作为依赖项,用户可以安装插件及其所有依赖项和一个命令:
美元php ob娱乐下载symfony插件:安装——install-deps sfSamplePlugin
构建插件
PEAR组件都有一个命令(pear包
),创造了. tgz
包的档案,只要你叫清单所示的命令17-24包含从一个目录package.xml
。
包装清单17-24 -一个插件作为一个梨包
包sfSamplePlugin-1.0.0 cd sfSamplePlugin梨美元包。tgz做
一旦建立您的插件,检查它的工作原理通过安装它自己,如清单17-25所示。
清单17-25 -安装插件
cp sfSamplePlugin-1.0.0美元。tgz /home/production/myproject/ cd /home/production/myproject/ php symfob娱乐下载ony插件:美元安装sfSamplePlugin-1.0.0.tgz
根据他们的描述<内容>
标签的包装文件将会在不同的目录您的项目。清单17-26显示的文件sfSamplePlugin
在安装之后应该结束。
清单17-26 -上安装的插件文件插件/
和web /
目录
插件/ sfSamplePlugin / README许可配置/模式。yml sfSamplePluginConfiguration.class。php数据/工装/夹具。yml lib /模型/ sfSampleFooBar。php sfSampleFooBarPeer。php / sfSampleTask.class任务。php验证器/ sfSampleValidator.class。php模块/ sfSampleModule /动作/ actions.class。php配置/安全。yml lib / BasesfSampleModuleActions.class。/ indexSuccess php模板。php web / sfSamplePlugin / # #复制或符号链接,这取决于系统的css / sfSampleStyle。css图像/ sfSampleImage.png
在应用程序中测试插件的方式表现。如果它工作得很好,你准备分发它跨项目——或者贡献symfony社区。欧宝体育平台怎么样ob娱乐下载
托管您的插件在Symfony项目网站ob娱乐下载
syob娱乐下载mfony插件时最广泛的观众分发的ob娱乐下载symfony-project.org
的网站。甚至你自己的插件可以分布这种方式,只要你遵循这些步骤:
- 确保
自述
文件描述了安装和使用插件的方式,,许可证
文件给出了许可的细节。你的格式自述
与减价格式化语法。 - 创建一个symfoob娱乐下载ny帐户(/ user /新)和创建插件(/插件/新)。
- 为插件创建一个梨包通过调用
pear包
命令,并测试它。PEAR包必须命名sfSamplePlugin-1.0.0.tgz
(插件版本1.0.0)。 - 上传你的梨包(
sfSamplePlugin-1.0.0.tgz
)。 - 现在你的插件必须出现在列表中插件。
如果你遵循这个过程中,用户可以安装插件,只需在项目目录中输入以下命令:
php syob娱乐下载mfony插件:美元安装sfSamplePlugin
命名约定
保持插件/
目录清洁,确保所有的插件名称camelCase和结束插件
(例如,shoppingCartPlugin
,feedPlugin
等等)。命名您的插件之前,检查没有现有的插件名称相同的。
请注意
插件依赖推动应该包含推动
名称(如果你使用原则也是一样)。例如,一个身份验证插件使用推动数据访问对象应该被称为sfPropelAuth
。
插件应该包括一个许可证
文件描述使用的条件和选择的许可。你还建议添加一个自述
文件解释版本变化,插件的目的,其效果,安装和配置说明等。
总结
symfob娱乐下载ony类通知事件,给他们被修改在应用程序级别的能力。事件机制允许多重继承和类覆盖在运行时即使PHP限制禁止它。所以你可以很容易地扩展symfony的特性,即使你必须修改ob娱乐下载,工厂配置的核心类是在这里。
许多这样的扩展已经存在;他们打包为插件,很容易安装,升级,并通过symfony命令行卸载。ob娱乐下载创建一个插件一样容易创建一个梨包,并提供跨应用程序的可重用性。
symfob娱乐下载ony插件部分包含许多插件,你甚至可以添加自己的。所以,现在你已知道如何去做,我们希望你能加强与很多有用的扩展symfony的核心!ob娱乐下载
这项工作是GFDL许可执照。