20天:插件
昨天,您学习了如何symfony应用程序国际化和本地化。ob娱乐下载再一次,多亏了ICU标准和很多帮手,symfony使这一切变得简单。ob娱乐下载直到这些线,我们将讨论插件:它们是什么,你可以在一个插件包,他们可以使用。
插件
一个ob娱乐下载symfony插件
一个ob娱乐下载symfony插件提供了打包和分发你的项目文件的一个子集。像一个项目,一个插件可以包含类、助手、配置、任务、模块、模式,甚至网络资产。
私人的插件
第一个使用插件是缓解您的应用程序之间共享代码,甚至在不同的项目之间。回想一下,symfonyob娱乐下载应用程序只共享模型。插件提供了一种方法之间共享多个组件的应用程序。
如果你需要为不同的项目重用相同的模式,或相同的模块,把它们移到插件。作为一个插件是一个目录,您可以移动它很容易通过创建一个SVN库和使用svn:外部
,或只是复制文件从一个项目到另一个地方。
我们称之为“私人插件”,因为它们的使用仅限于单个开发人员或公司。他们不公开。
提示
你甚至可以创建一个包从你的私有插件,创建自己的插件symfony通道,并通过安装它们ob娱乐下载插件:安装
的任务。
公共插件
社区公共插件可用于下载和安装。欧宝体育平台怎么样在本教程中,我们使用两个公共插件:sfGuardPlugin
和sfFormExtraPlugin
。
他们是一模一样的私人插件。唯一的区别是,任何人都可以安装他们的项目。稍后您将了解如何发布和主机一个公共插件在symfony的网站上。ob娱乐下载
一种不同的方式来组织代码
还有一个方法插件和如何使用它们。忘记的可重用性和共享。插件可以用作一种不同的方式来组织你的代码。而不是组织的文件层:所有模型lib /模型/
在目录中,模板模板/
目录,……;文件是由功能:一起工作文件(模型、模块和模板),CMS所有文件一起,等等。
插件文件结构
一个插件是一个目录结构和文件组织在一个预定义的结构,根据文件的性质。在这里,我们将大部分代码为Jobeet写的sfJobeetPlugin
。我们将使用的基本布局如下:
sfJobeetPlugin / config / sfJobeetPluginConfiguration.class。php / /插件初始化模式。yml / /数据库模式路由。yml / / lib / Jobeet.class路由。php / /类辅助/ / /帮手过滤器/ / /过滤器类表单/ / /表单类模型/ / /模型类任务/工作/ / / / / /任务模块模块操作/ config /模板/ web / / / JS等资产、CSS和图像
Jobeet插件
引导一个插件,只需创建一个新的目录下插件/
。Jobeet,让我们创建一个sfJobeetPlugin
目录:
mkdir插件/ sfJobeetPlugin美元
然后,激活sfJobeetPlugin
在配置/ ProjectConfiguration.class.php
文件。
公共函数设置(){这个美元- >enablePlugins(数组(“sfPropelPlugin”,“sfGuardPlugin”,“sfFormExtraPlugin”,“sfJobeetPlugin”));}
请注意
所有插件都必须结束了插件
后缀。这也是一个好习惯与前缀科幻小说
,尽管它不是强制性的。
该模型
首先,移动配置/ schema.yml
文件插件/ sfJobeetPlugin / config /
:
mkdir插件/ sfJobeetPlugin / config / mv美元配置/模式。yml插件/ sfJobeetPlugin / config / schema.yml
请注意
所有命令都等Unix环境。如果你使用Windows,你可以拖拽文件浏览器。如果你使用Subversion,或任何其他的工具来管理您的代码,他们提供(如使用内置的工具svn mv
移动文件)。
移动模型,形式,和过滤器文件插件/ sfJobeetPlugin / lib /
:
mkdir插件/ sfJobeetPlugin / lib / mv美元lib /模型/ plugins / sfJobeetPlugin / lib /美元mv lib /形式/插件/ sfJobeetPlugin / lib /美元mv lib /过滤器/插件/ sfJobeetPlugin / lib /美元rm射频插件/ sfJobeetPlugin / lib /模型/美元sfPropelGuardPlugin rm射频插件/ sfJobeetPlugin / lib /形式/ sfPropelGuardPlugin $ rm射频插件/ sfJobeetPlugin / lib /过滤器/ sfPropelGuardPlugin
删除插件/ sfJobeetPlugin / lib /形式/ BaseForm.class.php
文件。
$ rm插件/ sfJobeetPlugin / lib /形式/ BaseForm.class.php
如果你运行推动:构建——模型
任务现在,symfoob娱乐下载ny仍将生成的文件lib /模型/
,这不是我们想要的。推动输出目录可以通过添加一个配置包
选择。打开schema.yml
,并添加以下配置:
#插件/ sfJobeetPlugin / config /模式。yml推动:_attributes:{包:plugins.sfJobeetPlugin.lib。模型}
现在syob娱乐下载mfony将生成的文件下插件/ sfJobeetPlugin / lib /模型/
目录中。形式和过滤器建筑商还考虑这个配置时生成文件。
的推动:构建——sql
任务生成一个SQL文件创建表。作为命名的文件包,删除当前一:
rm数据/ sql / lib.model.schema.sql美元
现在,如果你运行推动:构建————和负载
下,ob娱乐下载symfony将生成文件插件lib /模型/
目录按预期:
php syob娱乐下载mfony推动美元:构建————和负载——无法得到确认
运行的任务后,检查没有lib /模型/
创建了目录。这个任务了lib /形式/
和lib /过滤器/
然而,目录。他们都包含基类为所有推动形式在您的项目中。
作为一个项目,这些文件是全球性的删除它们从插件:
$ rm插件/ sfJobeetPlugin / lib /形式/ BaseFormPropel.class。php $ rm插件/ sfJobeetPlugin / lib /过滤器/ BaseFormFilterPropel.class.php
你也可以移动Jobeet.class.php
对插件文件:
mv lib / Jobeet.class美元。php插件/ sfJobeetPlugin / lib /
移动文件,清除缓存:
php syob娱乐下载mfony cc美元
提示
如果你使用一个PHP加速器APC和事情变得奇怪的在这一点上,重新启动Apache。
现在,所有的模型文件被移到插件,运行测试来检查一切仍然工作正常:
php syob娱乐下载mfony测试:美元
控制器和视图
下一个逻辑步骤是将模块插件。为了避免模块名称冲突,它总是一个好习惯与插件插件模块的名称的前缀名称:
mkdir插件/ sfJobeetPlugin /模块/ mv美元应用/前端/模块/从属插件/ sfJobeetPlugin /模块/美元sfJobeetAffiliate mv api应用程序/前端/模块/插件/ sfJobeetPlugin /模块/ sfJobeetApi mv应用美元/前端/模块/类别/ sfJobeetPlugin /模块/插件sfJobeetCategory $ mv应用/前端/模块/插件工作/ sfJobeetPlugin /模块/ sfJobeetJob mv应用美元/语言前端/模块/插件/ sfJobeetPlugin /模块/ sfJobeetLanguage
对于每一个模块,您还需要更改类名actions.class.php
和components.class.php
文件(例如,affiliateActions
类需要重新命名sfJobeetAffiliateActions
)。
的include_partial ()
和include_component ()
电话也必须改变在以下模板:
sfJobeetAffiliate /模板/ _form.php
(改变下属
来sfJobeetAffiliate
)sfJobeetCategory /模板/ showSuccess.atom.php
sfJobeetCategory /模板/ showSuccess.php
sfJobeetJob /模板/ indexSuccess.atom.php
sfJobeetJob /模板/ indexSuccess.php
sfJobeetJob /模板/ searchSuccess.php
sfJobeetJob /模板/ showSuccess.php
应用程序/前端/模板/ layout.php
更新搜索
和删除
行动:
/ /插件/ sfJobeetPlugin /模块/ sfJobeetJob /行动/ actions.class.php类sfJobeetJobActions扩展sfActions{公共函数executeSearch(sfWebRequest美元的请求){这个美元- >forwardUnless(美元的查询=美元的请求- >getParameter(“查询”),“sfJobeetJob”,“指数”);这个美元- >工作= JobeetJobPeer::getForLuceneQuery(美元的查询);如果(美元的请求- >isXmlHttpRequest()){如果(‘*’= =美元的查询| | !这个美元- >工作){返回这个美元- >renderText(“没有结果。”);}返回这个美元- >renderPartial方法(“sfJobeetJob /列表”,数组(“工作”= >这个美元- >工作));}}公共函数executeDelete(sfWebRequest美元的请求){美元的请求- >checkCSRFProtection();jobeet_job美元=这个美元- >getRoute()- >getObject();jobeet_job美元- >删除();这个美元- >重定向(“sfJobeetJob /指数”);}/ /……}
现在,修改routing.yml
考虑到这些变化的文件:
#应用/前端/ config /路由。yml从属类:sfPropelRouteCollection选项:模型:JobeetAffiliate行动:[新,创造]object_actions:{等待:}prefix_path: /: sf_culture /附属模块:sfJobeetAffiliate要求:sf_culture: (?: fr | en) api_jobs: url: / api /:令牌/工作。:sf_format类:sfPropelRoute参数:{模块:sfJobeetApi,行动:列表}选项:{模型:JobeetJob、类型:列表方法:getForToken}要求:sf_format: json (?: xml | | yaml)类别:url: /: sf_culture /类别/:蛞蝓。:科幻小说_format class: sfPropelRoute param: { module: sfJobeetCategory, action: show, sf_format: html } options: { model: JobeetCategory, type: object, method: doSelectForSlug } requirements: sf_format: (?:html|atom) sf_culture: (?:fr|en) job_search: url: /:sf_culture/search param: { module: sfJobeetJob, action: search } requirements: sf_culture: (?:fr|en) job: class: sfPropelRouteCollection options: model: JobeetJob column: token object_actions: { publish: PUT, extend: PUT } prefix_path: /:sf_culture/job module: sfJobeetJob requirements: token: \w+ sf_culture: (?:fr|en) job_show_user: url: /:sf_culture/job/:company_slug/:location_slug/:id/:position_slug class: sfPropelRoute options: model: JobeetJob type: object method_for_criteria: doSelectActive param: { module: sfJobeetJob, action: show } requirements: id: \d+ sf_method: GET sf_culture: (?:fr|en) change_language: url: /change_language param: { module: sfJobeetLanguage, action: changeLanguage } localized_homepage: url: /:sf_culture/ param: { module: sfJobeetJob, action: index } requirements: sf_culture: (?:fr|en) homepage: url: / param: { module: sfJobeetJob, action: index }
如果你试图浏览Jobeet网站现在,告诉你,你会有异常模块不启用。在所有应用程序之间共享插件一个项目,需要专门为给定应用程序启用这个模块你需要它settings.yml
配置文件:
#应用/前端/ config /设置。yml: .settings: enabled_modules:默认- sfJobeetAffiliate sfJobeetApi - sfJobeetCategory sfJobeetJob sfJobeetLanguage
迁移的最后一步是修复模块的功能测试,测试名称。
的任务
任务可以搬到插件很容易:
美元mv插件/ sfJobeetPlugin / lib / lib /任务
i18n文件
一个插件也可以包含XLIFF文件:
美元mv应用前端/ i18n插件/ sfJobeetPlugin /
路由
一个插件也可以包含路由规则:
美元mv应用/前端/ config /路由。yml插件/ sfJobeetPlugin / config /
的资产
即使它有点反直觉的,插件也可以包含web图像等资产,样式表和javascript。当我们不想分发Jobeet插件,它并不真的有意义,但可以通过创建一个插件/ sfJobeetPlugin / web /
目录中。
一个插件项目的资产必须是可访问的web /
目录可以从浏览器。的插件:发布资产
地址这Unix系统下创建符号链接,通过复制Windows平台上的文件:
美元php ob娱乐下载symfony插件:发布资产
用户
移动myUser
类方法处理工作的历史是稍微复杂一些。我们可以创建一个JobeetUser
类和使myUser
继承它。但是有一个更好的办法,尤其是如果几个插件想添加新方法的类。
核心symob娱乐下载fony对象通知事件在他们的生命周期,你可以听。在我们的例子中,我们需要倾听user.method_not_found
事件,发生在一个未定义的方法被调用的sfUser
对象。
symfoob娱乐下载ny初始化时,所有的插件都还初始化,如果他们有一个插件配置类:
/ /插件/ sfJobeetPlugin /配置/ sfJobeetPluginConfiguration.class.php类sfJobeetPluginConfiguration扩展sfPluginConfiguration{公共函数初始化(){这个美元- >调度程序- >连接(“user.method_not_found”,数组(“JobeetUser”,“methodNotFound”));}}
事件通知管理sfEventDispatcher
事件调度器对象。注册一个监听器调用一样简单connect ()
方法。的connect ()
一个PHP可调用的方法连接事件名称。
请注意
一个PHP调用是一个PHP变量,可以使用的吗call_user_func ()
函数并返回真正的
当传递给is_callable ()
函数。一个字符串代表一个函数,可以代表一个对象数组方法或类方法。
有了上面的代码,myUser
将调用静态对象methodNotFound ()
的方法JobeetUser
类时无法找到一个方法。然后到methodNotFound ()
方法处理丢失的方法。
删除所有的方法myUser
类和创建JobeetUser
类:
/ /应用程序/前端/ lib / myUser.class.php类myUser扩展sfBasicSecurityUser{}/ /插件/ sfJobeetPlugin / lib / JobeetUser.class.php类JobeetUser{静态公共函数methodNotFound(sfEvent美元的事件){如果(method_exists(“JobeetUser”,美元的事件(“方法”])){美元的事件- >setReturnValue(中的call_user_func_array(数组(“JobeetUser”,美元的事件(“方法”]),array_merge(数组(美元的事件- >getSubject()),美元的事件(“参数”])));返回真正的;}}静态公共函数isFirstRequest(sfUser$ user,美元的布尔=零){如果(is_null(美元的布尔)){返回$ user- >getAttribute(“first_request”,真正的);}其他的{$ user- >setAttribute(“first_request”,美元的布尔);}}静态公共函数addJobToHistory(sfUser$ user,JobeetJob美元的工作){$ id=$ user- >getAttribute(“job_history”,数组());如果(!in_array(美元的工作- >getId(),$ id)){函数($ id,美元的工作- >getId());$ user- >setAttribute(“job_history”,array_slice($ id,0,3));}}静态公共函数getJobHistory(sfUser$ user){返回JobeetJobPeer::retrieveByPks($ user- >getAttribute(“job_history”,数组()));}静态公共函数resetJobHistory(sfUser$ user){$ user- >getAttributeHolder()- >删除(“job_history”);}}
当调度程序调用methodNotFound ()
方法,它通过sfEvent
对象。
如果方法中存在JobeetUser
类,它被称为及其返回值随后被返回给通知。如果不是,symob娱乐下载fony会尝试下一个注册侦听器或者抛出一个异常。
的getSubject ()
方法返回事件的通知,这在本例中是当前myUser
对象。
默认的结构与插件架构
使用插件架构允许您以不同的方式组织代码:
使用插件
当你开始实施一项新特性,或者如果你试图解决一个典型的网络问题,可能有人已经解决了相同的问题,可能包装解决方案作为一个symfony插件。ob娱乐下载你寻找一个公共symfony插件,去ob娱乐下载插件部分symfonyob娱乐下载的网站。
作为一个插件都包含在一个目录,安装有几种方式:
- 使用
插件:安装
任务(它只能如果插件开发人员创建了一个插件包上传在symfony网站)ob娱乐下载 - 下载包和手动un-archive它
插件/
目录(它还需要开发人员上传包) - 创建一个
svn:外部
在插件/
插件(它只能如果插件开发者主机插件在Subversion)
最后两种方式容易,但缺少一些灵活性。第一种方法允许您安装最新版本根据项目symfony的版本,容易升级到最新的稳定版本,轻松地管理插件之间的依赖关系。ob娱乐下载
贡献一个插件
包装一个插件
创建一个插件包,你需要一些强制性的文件添加到插件目录结构。首先,创建一个自述
插件文件的根目录,并解释如何安装插件,它提供了什么,不是什么。的自述
文件必须被格式化减价的格式。这个文件将使用symfony网站作为主要的文档。欧宝官网下载appob娱乐下载你可以测试你的自述文件的转换HTML使用ob娱乐下载symfony插件新玩意儿。
侧边栏
插件开发任务
如果你发现自己经常创建私人和/或公共插件,考虑利用的一些任务sfTaskExtraPlugin。这个插件,维护的核心团队,包括一个数量的任务,帮助您简化插件生命周期:
生成:插件
插件:包
您还需要创建一个许可证
文件。选择一个许可不是一项容易的任务,但是symfony插件部分只列出的插件是在许可证下发布的类似于sob娱乐下载ymfony的(麻省理工学院、BSD、LGPL和PHP)。的内容许可证
文件的许可选项卡将显示在你的插件的公共页面。
最后一步是创建一个package.xml
文件在插件目录的根。这package.xml
文件之前,PEAR包语法。
请注意
最好的学习方式package.xml
语法肯定是复制使用现有的插件。
的package.xml
文件是由几个部分可以看到在这个模板示例:
< !——插件/ sfJobeetPlugin /包。xml - - >< ? xml版本=“1.0”编码=“utf - 8”? ><包packagerversion=“1.4.1”版本=“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”><名称>sfJobeetPlugin< /名称><通道>plugins.ob娱乐下载symfony-project.org< /通道><总结>一个工作职位版块插件。< /总结><描述>一个工作职位版块插件。< /描述><铅><名称>法比安效力< /名称><用户>fabpot< /用户><电子邮件>fabien.potencier@ob娱乐下载symfony-project.com< /电子邮件><活跃>是的< /活动>< /铅><日期>2008-12-20< /日期><版本><释放>1.0.0< /释放>< api>1.0.0< / api>< /版本><稳定><释放>稳定的< /释放>< api>稳定的< / api>< /稳定><许可证uri=“http://www.ob娱乐下载symfony-project.com/license”>麻省理工学院的许可< /许可证><笔记/ ><内容>< !——内容- - >< /内容><依赖关系>< !——依赖项- - >< /依赖关系>< phprelease>< / phprelease><更新日志>< !——更新日志- - >< /更新日志>< /包>
的<内容>
标记包含需要的文件放入包:
<内容>< dir的名字=“/”><文件角色=“数据”的名字=“自述”/ ><文件角色=“数据”的名字=“许可证”/ >< dir的名字=“配置”><文件角色=“数据”的名字=“config . php”/ ><文件角色=“数据”的名字=“schema.yml”/ >< / dir>< !——……- - >< / dir>< /内容>
的< >的依赖关系
标签引用所有插件的依赖性可能:PHP, symfony和其他插件。ob娱乐下载使用这些信息插件:安装
安装任务最好的插件版本项目环境,也需要安装插件依赖关系。
<依赖关系><要求>< php><敏>5.0.0< /分钟>< / php>< pearinstaller><敏>1.4.1< /分钟>< / pearinstaller><包><名称>ob娱乐下载< /名称><通道>pear.ob娱乐下载symfony-project.com< /通道><敏>1.3.0< /分钟><马克斯>1.5.0< / max><排除>1.5.0< /排除>< /包>< /要求>< /依赖关系>
你应该总是声明一个symfony的依赖,因为我们已经在那里了。ob娱乐下载宣布允许最小和最大的版本插件:安装
知道symfony版本是强ob娱乐下载制性的symfony版本可以有稍微不同的api。
声明一个与另一个插件的依赖也是可能的:
<包><名称>sfFooPlugin< /名称><通道>plugins.ob娱乐下载symfony-project.org< /通道><敏>1.0.0< /分钟><马克斯>1.2.0< / max><排除>1.2.0< /排除>< /包>
的<、>
标签是可选的但是有用的信息关于版本之间的变化。这些信息可以在“变更”选项卡并还在插件饲料。
<更新日志><释放><版本><释放>1.0.0< /释放>< api>1.0.0< / api>< /版本><稳定><释放>稳定的< /释放>< api>稳定的< / api>< /稳定><许可证uri=“http://www.ob娱乐下载symfony-project.com/license”>麻省理工学院的许可< /许可证><日期>2008-12-20< /日期><许可证>麻省理工学院< /许可证><笔记>*法:第一个版本的插件< /笔记>< /释放>< /更新日志>
在symfony网站上托管一个插件ob娱乐下载
如果你开发一个有用的插件和你想与symfony社区分享,欧宝体育平台怎么样ob娱乐下载创建一个symfoob娱乐下载ny帐户如果你不已经有一个,然后创建一个新插件。
你将自动成为管理员的插件,您将看到一个“admin”选项卡的接口。在该选项卡中,你会发现所有你需要管理你的插件和上传你的包。
请注意
的插件常见问题解答插件开发人员包含很多有用的信息。
最终的想法
创建插件,并与社区共享是最好的方法之一回symfony项目作出贡献。欧宝体育平台怎么样ob娱乐下载它是那么容易,symfony插件库满有用的,有趣ob娱乐下载,但是也可笑的插件。
这项工作在Creative Commons许可Attribution-Share都3.0 Unported许可执照。