利用命令行
由杰弗里·巴切莱特
欧宝娱乐app下载地址Symfony 1.1引入了一个现代的、强大、灵活的命令行系统替换旧pake-based任务系统。在版本之间,任务系统已得到改进使它今天。
许多web开发人员不会看到任务的附加值。通常,这些开发人员没有意识到的力量命令行。在本章中,我们将深入的任务,从一开始到更高级的用法,看它如何帮助你的日常工作,以及如何得到最好的任务。
任务一目了然
一个任务是一段代码,从命令行运行使用欧宝娱乐app下载地址
php脚本项目的根源。您可能已经遇到任务通过众所周知的缓存:清晰
任务(也称为cc
)通过运行在一个壳:
php sy欧宝娱乐app下载地址mfony cc美元
欧宝娱乐app下载地址Symfony提供了一组通用为各种不同的使用内置的任务。你可以通过运行可用的任务列表欧宝娱乐app下载地址
脚本不带任何参数或选项:
php sy欧宝娱乐app下载地址mfony美元
截断输出是这样的(内容):
用法:symf欧宝娱乐app下载地址ony[选项]task_name【参数】选项:——帮助- h显示帮助消息。——安静- q不日志消息到标准输出。——跟踪- t打开调用/执行跟踪,使完整的回溯。——版本- v显示程序的版本。——部队ANSI颜色输出。——可用的xml输出帮助xml任务::帮助显示为任务(h):列出任务列表应用程序:路线显示当前路线为应用程序缓存:明确清空缓存(cc clear-cache)
您可能已经注意到,任务分组。组织的任务被称为名称空间和任务名称通常由一个名称空间和任务名称(除了帮助
和列表
任务没有名称空间)。这个分类命名方案允许简单的任务,你应该选择一个有意义的名称空间为每个任务。
编写自己的任务
开始用symfony写作任务只需要几分钟。欧宝娱乐app下载地址你所要做的是创建您的任务,,把一些逻辑,瞧,你可以运行你的第一个自定义的任务。让我们创建一个非常简单的你好,世界!任务,例如在lib /任务/ sayHelloTask.class.php
:
类sayHelloTask扩展sfBaseTask{公共函数配置(){这个美元- >名称空间=“说”;这个美元- >的名字=“你好”;}公共函数执行(美元的参数=数组(),选择美元=数组()){回声“Hello, World !”;}}
现在运行以下命令:
美元php 欧宝娱乐app下载地址symfony说:你好
这个任务只会输出你好,世界!,但这只是一个开始!任务不是为了直接通过输出内容回声
或打印
语句。扩展sfBaseTask
允许我们使用一些有用的方法,包括日志()
方法,做我们想做的,输出内容:
公共函数执行(美元的参数=数组(),选择美元=数组()){这个美元- >日志(“Hello, World !”);}
因为一个任务调用会导致多个任务输出内容,你可能会想要使用logSection ()
方法:
公共函数执行(美元的参数=数组(),选择美元=数组()){这个美元- >logSection(“说”,“Hello, World !”);}
现在,你可能已经注意到两个参数传递到execute ()
方法,美元的参数
和选择美元
。这些是为了保存所有参数和选项在运行时传递给你的任务。稍后我们将广泛覆盖参数和选项。现在,让我们添加一些互动任务,允许用户指定我们想打个招呼:
公共函数配置(){这个美元- >addArgument(“谁”,sfCommandArgument::可选,“谁说你好?”,“世界”);}公共函数执行(美元的参数=数组(),选择美元=数组()){这个美元- >logSection(“说”,“你好,”。美元的参数(“谁”]。“!”);}
现在下面的命令:
美元php 欧宝娱乐app下载地址symfony说:你好,杰弗里
将产生以下输出:
> >说你好,杰弗里!
哇,那很容易。
顺便说一句,您可能想要包括更多的元数据的任务,比如它。你可以通过设置briefDescription
和detailedDescription
属性:
公共函数配置(){这个美元- >名称空间=“说”;这个美元- >的名字=“你好”;这个美元- >briefDescription=“简单的hello world”;这个美元- >detailedDescription= < < < EOF(说:你好|信息]任务是古典的实现使用symfony的Hello World示例欧宝娱乐app下载地址的任务系统。(。/欧宝娱乐app下载地址 symfony说:你好|信息)使用这个任务来迎接自己,或别人使用[——谁|评论]参数。EOF;$ this - > addArgument ('谁的,sfCommandArgument::可选的,谁说你好?”、“世界”);}
正如您可以看到的,您可以使用一组基本的标记来装饰你的描述。你可以检查渲染使用symfony的任务帮助系统:欧宝娱乐app下载地址
php sy欧宝娱乐app下载地址mfony美元帮助说:你好
选择系统
选项在symfony的任务欧宝娱乐app下载地址是组织成两个截然不同的设置,选项和参数。
选项
选择那些你通过使用连字符。你可以按照任何顺序将它们添加到您的命令行。他们可以有一个值,在这种情况下,他们作为一个布尔值。往往选择有长期和短期的形式。长形式通常是使用两个连字符而短形式只需要调用一个连字符。
常见的选项的例子帮助开关(——帮助
或- h
)、冗长开关(——安静
或q
)或版本开关(——版本
或- v
)。
请注意
选项的定义sfCommandOption
类和存储在一个sfCommandOptionSet
类。
参数
参数的数据只是一块你添加到命令行中。他们必须指定他们定义,在相同的顺序,你必须将它们包含在引号中如果你想包括空间(或你也可以摆脱空间)。他们可以是必需的或可选的,在这种情况下你应该指定一个默认值的参数的定义。
请注意
显然,参数的定义sfCommandArgument
类和存储在一个sfCommandArgumentSet
类。
默认设置
每一个sym欧宝娱乐app下载地址fony任务附带了一组默认的选项和参数:
——帮助
(-H
):显示帮助消息。——安静
(q
):不要日志消息到标准输出。——跟踪
(- t
):打开调用/执行跟踪,使完整的回溯。——版本
(- v
):显示程序版本。——颜色
:部队ANSI颜色输出。
特殊选项
欧宝娱乐app下载地址Symfony的任务系统理解两个非常特殊的选项,应用程序
和env
。
的应用程序
选择是必要的,当你想要访问一个sfApplicationConfiguration
而不仅仅是一个实例sfProjectConfiguration
。实例。这种情况下,例如,当你想生成url,因为路由通常关联到一个特定的应用程序。
当一个应用程序
选项传递给一个任务,symfony会自动检测并创建相应的欧宝娱乐app下载地址sfApplicationConfiguration
对象而不是默认的sfProjectConfiguration
对象。注意,您可以设置这个选项的默认值,因此节省你的麻烦通过手工应用程序每次运行该任务。
的env
选择控制,显然,任务执行的环境。当没有环境是通过,测试
在默认情况下使用。就像应用程序
,你可以设置一个默认值env
选项,将自动使用symfony。欧宝娱乐app下载地址
自应用程序
和env
并不包含在默认选项,你必须用手将它们添加在你的任务:
公共函数配置(){这个美元- >使用addoption(数组(新sfCommandOption(“应用程序”,零,sfCommandOption::PARAMETER_REQUIRED,“应用程序名”,“前端”),新sfCommandOption(“env”,零,sfCommandOption::PARAMETER_REQUIRED,“环境”,“开发”),));}
在这个例子中,前端
应用程序将自动使用,除非指定一个不同的环境,任务将运行dev
环境。
访问数据库
获得您的数据库从一个symfony的任务只是一个实例化的问题欧宝娱乐app下载地址sfDatabaseManager
实例:
公共函数执行(美元的参数=数组(),选择美元=数组()){databaseManager美元=新sfDatabaseManager(这个美元- >配置);}
您也可以直接访问ORM的连接对象:
公共函数执行(美元的参数=数组(),选择美元=数组()){databaseManager美元=新sfDatabaseManager(这个美元- >配置);美元的连接=databaseManager美元- >getDatabase()- >getConnection();}
但是如果你有几个连接中定义databases.yml
吗?例如,您可以添加一个连接
选择你的任务:
公共函数配置(){这个美元- >使用addOption(“连接”,sfCommandOption::PARAMETER_REQUIRED,“连接名称”,“原则”);}公共函数执行(美元的参数=数组(),选择美元=数组()){databaseManager美元=新sfDatabaseManager(这个美元- >配置);美元的连接=databaseManager美元- >getDatabase(收取(选择美元(“连接”])吗?选择美元(“连接”]:零)- >getConnection();}
像往常一样,您可以设置这个选项的默认值。
瞧!你现在可以操纵你的模型就像如果你在symfony应用程序。欧宝娱乐app下载地址
请注意
批处理时要小心使用您喜欢的ORM的对象。推动和教义遭受一个众所周知的PHP错误相关的循环引用和垃圾收集器,导致内存泄漏。这是部分固定在PHP 5.3。
发送邮件
最常用的任务之一就是发送电子邮件。symfon欧宝娱乐app下载地址y 1.3之前,发送电子邮件并不是很简单。但时代变了:现在symfony功能完全集成欧宝娱乐app下载地址斯威夫特梅勒一个功能丰富的PHP梅勒库,所以我们使用它吧!
欧宝娱乐app下载地址Symfony的任务系统暴露了梅勒对象通过sfCommandApplicationTask: getMailer ()
方法。这样,您可以轻松地访问梅勒和发送电子邮件:
公共函数执行(美元的参数=数组(),选择美元=数组()){梅勒美元=这个美元- >getMailer();梅勒美元- >composeAndSend(从美元,接受美元,美元的主题,messageBody美元);}
请注意
自从梅勒从应用程序配置读取的配置,你的任务必须接受应用程序选项才能使用梅勒。
请注意
如果您正在使用线轴策略、电子邮件只发送当你调用项目:发送电子邮件
的任务。
在大多数情况下,你不会有你坐在一个神奇的消息的内容messageBody美元
变量只是等待发送,你会想在某种程度上产生的。没有首选方法symfony生成内容为您的电子邮件,但有一些欧宝娱乐app下载地址建议你可以让你的生活更轻松:
委托内容生成
例如,创建一个受保护的方法为你的任务,返回为你发送的邮件内容:
公共函数执行(美元的参数=数组(),选择美元=数组()){这个美元- >getMailer()- >composeAndsend(从美元,接受美元,美元的主题,这个美元- >getMessageBody());}受保护的函数getMessageBody(){返回“你好,世界”;}
使用快速梅勒的装饰插件
一个插件称为迅速梅勒特性装饰
,基本上是一个非常简单,高效,模板引擎,可以采取recipient-specific替换值对,并将它们应用在所有邮件发送。
看到斯威夫特梅勒的文档欧宝体育电话为更多的信息。
使用一个外部模板库
集成第三方模板库是很容易的。例如,您可以使用新的模板组件的一部分发布Symfony项目组件。欧宝娱乐app下载地址只是下降的组件代码在您的项目(lib /供应商/模板/
将会是一个好地方),放下下面的代码在你的任务:
受保护的函数getMessageBody(美元的模板,$ var=数组()){美元的引擎=这个美元- >getTemplateEngine();返回美元的引擎- >渲染(美元的模板,$ var);}受保护的函数getTemplateEngine(){如果(is_null(这个美元- >templateEngine)){美元的装载机=新sfTemplateLoaderFilesystem(sfConfig::得到(“sf_app_dir”)。“/模板/电子邮件/ % s.php”);这个美元- >templateEngine=新sfTemplateEngine(美元的装载机);}返回这个美元- >templateEngine;}
得到两全其美
还有更多的,你可以做。斯威夫特梅勒的装饰
插件是非常方便的,因为它可以管理recipient-specific基础上更换。这意味着你定义一组置换为每个收件人,并迅速梅勒负责标记替换为正确的值基于接收者的邮件发送。让我们看看我们如何集成这个模板组件:
公共函数执行(美元的参数=数组(),选择美元=数组()){美元的消息= Swift_Message::newInstance();/ /获取用户的列表foreach(美元的用户作为$ user){美元替代品($ user- >getEmail()]=数组(“{username}”= >$ user- >getEmail(),“{specific_data}”= >$ user- >getSomeUserSpecificData(),);美元的消息- >遭受($ user- >getEmail());}这个美元- >registerDecorator(美元替代品);美元的消息- >setSubject(“{username}特定于用户的数据!”)- >setBody(这个美元- >getMessageBody(“user_specific_data”));这个美元- >getMailer()- >发送(美元的消息);}受保护的函数registerDecorator(美元替代品){这个美元- >getMailer()- >registerPlugin(新Swift_Plugins_DecoratorPlugin(美元替代品));}受保护的函数getMessageBody(美元的模板,$ var=数组()){美元的引擎=这个美元- >getTemplateEngine();返回美元的引擎- >渲染(美元的模板,$ var);}受保护的函数getTemplateEngine(美元替代品=数组()){如果(is_null(这个美元- >templateEngine)){美元的装载机=新sfTemplateLoaderFilesystem(sfConfig::得到(“sf_app_template_dir”)。“/电子邮件/ % s.php”);这个美元- >templateEngine=新sfTemplateEngine(美元的装载机);}返回这个美元- >templateEngine;}
与应用程序/前端/模板/电子邮件/ user_specific_data.php
包含以下代码:
嗨{username} !我们只是想让你知道你的具体数据:{specific_data}
这是它!你现在有一个功能齐全的模板引擎来构建你的电子邮件内容。
生成的url
写电子邮件通常需要你生成url基于路由配置。足够幸运的是,生成的url以来一直很容易在symfony 1.3可以直接访问当前的路由应用程序从一个任务通过使用欧宝娱乐app下载地址sfCommandApplicationTask: getRouting ()
方法:
公共函数执行(美元的参数=数组(),选择美元=数组()){美元的路由=这个美元- >getRouting();}
请注意
由于路由是依赖于应用程序,您必须确保您的应用程序有一个可用的应用程序配置,否则你将无法使用路由生成的url。
看到特殊选项部分自动学习如何获得你的任务的应用程序配置。
现在我们有一个路由实例,很容易生成一个URL使用生成()
方法:
公共函数执行(美元的参数=数组(),选择美元=数组()){$ url=这个美元- >getRouting()- >生成(“默认”,数组(“模块”= >“foo”,“行动”= >“酒吧”));}
第一个参数是路线的名称,第二个参数是一个数组的路线。在这一点上,我们已经生成一个相对URL,这很可能不是我们想要的。不幸的是,在一个任务生成绝对url不会因为我们没有一个工作sfWebRequest
对象依赖于HTTP获取主机。
一个简单的方法来解决这个是设置HTTP主机中factories.yml
配置文件:
所有:路由:类:sfPatternRouting参数:generate_shortest_url:真正的extra_parameters_as_query_string:真正的上下文:主持人:example.org
看到context_host
设置?这就是路由要求绝对URL时将使用:
公共函数执行(美元的参数=数组(),选择美元=数组()){$ url=这个美元- >getRouting()- >生成(“my_route”,数组(),真正的);}
访问I18N系统
并不是所有的工厂都是一样容易梅勒和路由。如果你需要访问其中一个,这真的不是太难实例化它们。例如,假设你想国际化的任务,你就会想访问symfony的i18n子系统。欧宝娱乐app下载地址这是很容易使用sfFactoryConfigHandler
:
受保护的函数getI18N(美元的文化=“en”){如果(!这个美元- >i18n){美元配置= sfFactoryConfigHandler::getConfiguration(这个美元- >配置- >getConfigPaths(“配置/ factories.yml”));美元的类=美元配置(“国际化”](“类”];这个美元- >i18n=新美元的类(这个美元- >配置,零,美元配置(“国际化”](“参数”]);}这个美元- >i18n- >setCulture(美元的文化);返回这个美元- >i18n;}
让我们看看这是怎么回事。首先,我们使用一个简单的缓存技术来避免在每次调用重建i18n组件。然后,使用sfFactoryConfigHandler
,我们检索组件的配置来实例化它。我们通过设置完成文化配置。现在的任务可以访问国际化:
公共函数执行(美元的参数=数组(),选择美元=数组()){这个美元- >日志(这个美元- >getI18N(“fr”)- > __(“一些翻译的文本!”));}
当然,总是通过文化不是很方便,尤其是如果你不需要改变文化经常在你的任务。我们将看到如何安排在下一节。
重构你的任务
因为发送邮件(并为其生成内容)并生成url是两个非常常见的任务,它可能是一个好主意来创建一个基本任务,提供了这两个特性自动为每个任务。这是很容易做的。项目内创建一个基类,例如lib /任务/ sfBaseEmailTask.class.php
。
类sfBaseEmailTask扩展sfBaseTask{受保护的函数registerDecorator(美元替代品){这个美元- >getMailer()- >registerPlugin(新Swift_Plugins_DecoratorPlugin(美元替代品));}受保护的函数getMessageBody(美元的模板,$ var=数组()){美元的引擎=这个美元- >getTemplateEngine();返回美元的引擎- >渲染(美元的模板,$ var);}受保护的函数getTemplateEngine(美元替代品=数组()){如果(is_null(这个美元- >templateEngine)){美元的装载机=新sfTemplateLoaderFilesystem(sfConfig::得到(“sf_app_template_dir”)。“/模板/电子邮件/ % s.php”);这个美元- >templateEngine=新sfTemplateEngine(美元的装载机);}返回这个美元- >templateEngine;}}
当我们,我们要自动化任务的选项设置。将这些方法添加到sfBaseEmailTask
类:
公共函数配置(){这个美元- >使用addOption(“应用程序”,零,sfCommandOption::PARAMETER_REQUIRED,“应用程序”,“前端”);}受保护的函数generateUrl(美元的路线,美元的参数=数组()){返回这个美元- >getRouting()- >生成(美元的路线,美元的参数,真正的);}
我们使用配置()
方法将常见的选项添加到所有扩展任务。不幸的是,任何类扩展sfBaseEmailTask
现在必须电话吗父:配置
在自己的配置()
方法,但这真的是一个小烦恼的附加值。
现在让我们重构I18N访问代码与前一节:
公共函数配置(){这个美元- >使用addOption(“应用程序”,零,sfCommandOption::PARAMETER_REQUIRED,“应用程序”,“前端”);这个美元- >使用addOption(“文化”,零,sfCommandOption::PARAMETER_REQUIRED,“文化”,“en”);}受保护的函数getI18N(){如果(!这个美元- >i18n){美元配置= sfFactoryConfigHandler::getConfiguration(这个美元- >配置- >getConfigPaths(“配置/ factories.yml”));美元的类=美元配置(“国际化”](“类”];这个美元- >i18n=新美元的类(这个美元- >配置,零,美元配置(“国际化”](“参数”]);这个美元- >i18n- >setCulture(这个美元- >commandManager- >getOptionValue(“文化”));}返回这个美元- >i18n;}受保护的函数changeCulture(美元的文化){这个美元- >getI18N()- >setCulture(美元的文化);}受保护的函数过程(sfCommandManagercommandManager美元,选择美元){父::过程(commandManager美元,选择美元);这个美元- >commandManager=commandManager美元;}
我们有一个问题要解决:不可能访问外部参数和选项值execute ()
的范围。为了解决这个问题,我们只是超载过程()
方法选择管理器附加到类。选择管理器,正如它的名字所说,当前任务的管理参数和选项。例如,您可以通过访问选项值getOptionValue ()
方法。
在一个任务执行一个任务
另一种方法来重构你的任务是将一个任务嵌入另一个任务。这是特别容易通过sfCommandApplicationTask: createTask ()
和sfCommandApplicationTask: runTask ()
方法。
的createTask ()
方法将为您创建一个任务的实例。只是通过一个任务名称,就像如果你是在命令行上,它会返回您的实例所需的任务,准备好运行:
美元的任务=这个美元- >createTask(“缓存:明确”的);美元的任务- >运行();
但是因为我们懒惰,runTask
为我们做的一切:
这个美元- >runTask(“缓存:明确”的);
当然,您可以传递参数和选项(按此顺序):
这个美元- >runTask(“插件:安装”,数组(“sfGuardPlugin”),数组(“install_deps”= >真正的));
嵌入任务有助于构成强大的任务更简单的任务。例如,您可以将多个任务项目:清洁
任务后,您将运行每个部署:
美元的任务=数组(“缓存:明确”的,“项目:权限”,的日志:旋转,“插件:发布资产”,“教义:建造模式”,“教义:构建表单”,“教义:build-filters”,“项目:优化”,“项目:启用”,);foreach(美元的任务作为美元的任务){这个美元- >运行(美元的任务);}
操作文件系统
欧宝娱乐app下载地址Symfony提供了一个内置的简单文件系统抽象(sfFilesystem
),允许对文件和目录执行简单的操作。它可以在一个任务$ this - > getFilesystem ()
。这种抽象暴露了以下方法:
sfFilesystem:复制()
复制一个文件sfFilesystem: mkdir ()
,创建递归目录sfFilesystem:触摸()
创建一个文件sfFilesystem: remove ()
删除一个文件或目录sfFilesystem: chmod ()
改变文件或目录的权限sfFilesystem:重命名()
重命名一个文件或目录sfFilesystem:符号链接()
创建一个链接到一个目录sfFilesystem: relativeSymlink ()
创建一个相对链接到一个目录sfFilesystem:镜子()
镜子,一个完整的文件树sfFilesystem: execute ()
执行任意shell命令
也暴露了一个非常方便的方法,我们将在下一节:replaceTokens ()
。
使用骨架生成文件
另一个常见任务是生成文件使用。生成文件可以很容易使用骨架和前面提到的方法sfFilesystem: replaceTokens ()
。顾名思义,这个方法替换标记在一组文件。,你通过它的一系列文件,令牌的列表,它将取代所有发生的每个令牌分配值,数组中的每个文件。
为了更好地理解这是如何有用,我们将部分重写现有的任务:生成:模块
。为了清晰和简洁,我们只会看执行
这个任务的一部分,假设已经正确配置和所有需要的选择。我们还将跳过验证。
甚至在开始编写任务之前,我们需要创建一个框架为我们将要创建的目录和文件,并存储在某个地方数据/框架/
:
数据/框架/模块/动作/ actions.class。php模板/
的actions.class.php
骨架可能看起来像这样:
类% moduleName %的行为扩展% baseActionsClass %{}
我们的任务的第一步将是镜像文件树在正确的地点:
moduleDir美元= sfConfig::得到(“sf_app_module_dir”)。选择美元(“模块”];美元的仪= sfFinder::类型(“任何”);这个美元- >getFilesystem()- >镜子(sfConfig::得到(“sf_data_dir”)。/框架/模块的,moduleDir美元,美元的仪);
现在,让我们在替换标记actions.class.php
:
美元的符号=数组(“moduleName”= >选择美元(“模块”],“baseActionsClass”= >选择美元(“基类”],);美元的仪= sfFinder::类型(“文件”);这个美元- >getFilesystem()- >replaceTokens(美元的仪- >在(moduleDir美元),“%”,“%”,美元的符号);
就是这样,我们生成的新模块,利用令牌替换定制它。
请注意
内置的生成:模块
其实看着数据/框架/
替代框架使用而不是默认的,所以小心台阶!
使用管制选项
你经常希望能够预览一个任务在实际运行的结果。这里有几个技巧。
首先,你应该使用一个标准的名称,如管制
。每个人都会认出这是什么。直到symf欧宝娱乐app下载地址ony 1.3,sfCommandApplication
做了添加一个默认管制
手工选择,但现在它应该添加(可能在一个基类,如上所述):
这个美元- >使用addOption(新sfCommandOption(“管制”,零,sfCommandOption::PARAMETER_NONE,“执行演习”);
然后您将调用你的任务是这样的:
我。欧宝娱乐app下载地址/ symfony:任务——管制
的管制
选项表明任务不应该做出任何改变。
不应该做任何改变吗记住这一点,他们是关键字。当运行在管制
模式中,你的任务必须离开这个环境之前,包括(但不限于):
- 数据库:不要插入、更新或删除表中的记录。您可以使用事务来实现这一点。
- 文件系统:不要创建、修改或删除文件从你的文件系统。
- 电子邮件发送:不发送电子邮件,或者给他们一个调试地址。
这里使用的是一个简单的例子管制
选择:
美元的连接- >beginTransaction();/ /修改数据库如果(选择美元(“管制”]){美元的连接- >回滚();}其他的{美元的连接- >提交();}
编写单元测试
由于任务可以实现各种目标,单元测试不是一件容易的事情。因此,没有一种方法测试任务,但也有一些原则,遵循,可以帮助使你的任务更可测试的。
首先,把你的任务就像一个控制器。记住规则控制器呢?薄的控制器,脂肪模型。内,将所有的业务逻辑模型,这样,您可以测试您的模型,而不是任务,是容易多了。
一旦你认为你不能得到更多的逻辑模型,把你的execute ()
方法成大块的容易可测试的代码,每个居住在自己的便利(公共)方法。将你的代码有几个好处:
- 它使得你的任务的
执行
更具可读性 - 它让你的任务更可测试的
- 它让你的任务更可扩展
要有创造力,不要犹豫地构建一个小型的特定环境为您的测试需求。如果你找不到任何方法来测试这一令人生畏的任务,你只写了,有两种可能:要么你写的不好或者你应该向别人问问他的意见。同样,你可以深入别人的代码,看看他们测试(例如,symfony的任务测试甚至发电机)。欧宝娱乐app下载地址
辅助方法:日志记录
欧宝娱乐app下载地址Symfony的任务系统努力简化开发人员的天,提供方便的助手方法等常用操作日志和用户交互。
人们很容易日志消息STDOUT
使用日志
家庭的方法:
日志
,接受信息的数组logSection
更复杂的,有一个前缀格式(第一个参数)和消息类型(第四个参数)。当你的日志太长,像一个文件路径,logSection
通常会缩小你的信息,这可以证明烦人。使用第三个参数指定一个消息最大大小适合你的信息logBlock
用于异常的日志风格。在这里,您可以通过格式化风格
可用的日志格式错误
,信息
,评论
和问题
。不要犹豫去尝试,看看他们的样子。
使用示例:
这个美元- >logSection(“文件+”,aVeryLongFileName美元,这个美元- >strlen(aVeryLongFileName美元));这个美元- >logBlock(“恭喜你!你跑任务是否成功!”,“信息”);
辅助方法:用户交互
提供三个帮手来缓解用户交互:
问()
基本上,打印一个问题并返回任何用户输入askConfirmation ()
,我们要求用户确认,允许y
(是的),n
(没有)作为用户输入askAndValidate ()
,一个非常有用的方法,输出一个问题,通过一个验证用户输入sfValidator
作为第二个参数传递。第三个参数是一个数组的选项,你可以通过一个默认值(价值
),尝试的最大数量(尝试
)和一个格式化风格(风格
)。
例如,你可以问一个用户的电子邮件地址和验证它在飞:
美元的电子邮件=这个美元- >askAndValidate(“你的电子邮件地址是什么?”,新sfValidatorEmail());
奖金轮:使用Crontab的任务
大多数UNIX和GNU / Linux系统允许通过一个机制被称为任务计划cron。的cron检查配置文件(定时任务)命令来运行在特定的时间。欧宝娱乐app下载地址Symfony的任务可以很容易地集成到一个定时任务,和项目:发送电子邮件
任务是一个完美的候选人的一个例子:
MAILTO =“you@example.org”0 3 * * * /usr/bin/php /var/www/yourproject 欧宝娱乐app下载地址/ symfony项目:发送电子邮件
这个配置告诉cron运行项目:发送电子邮件
每天凌晨3点和发送所有可能的输出(即日志、错误等)的地址you@example.org。
请注意
在定时任务配置文件格式的更多信息,类型男人5 crontab
在一个终端。
实际上你可以,也应该,传递参数和选项:
MAILTO =“you@example.org”0 3 * * * /usr/bin/php /var/www/yourproject 欧宝娱乐app下载地址/ symfony项目:发送电子邮件——env =刺激=前端应用程序
请注意
你应该更换/usr/bin/php
与PHP CLI二进制文件的位置。如果你没有这些信息,你可以试一试php
在linux系统或php的思想在何处
在大多数其他UNIX系统。
奖金轮:使用STDIN
由于任务运行在命令行环境中,您可以访问标准输入(STDIN)。UNIX命令行允许应用程序之间的交互通过各种各样的手段,其中一个是管象征的角色|。的管允许您通过一个应用程序的输出(知道的STDOUT)到另一个应用程序的标准输入(称为STDIN)。这些都是可以在你的任务通过PHP的特殊的常量STDIN
和STDOUT
。还有第三个标准流,STDERR,可以通过STDERR
,意味着一个应用程序的错误消息。
所以我们能做什么完全标准输入?嗯,想象你在服务器上运行的应用程序,想与symfony应用程序通信。欧宝娱乐app下载地址当然你可以通过HTTP进行通信,但是一个更有效的方式是管输出一个symfony的任务。欧宝娱乐app下载地址说,应用程序可以发送结构化数据(例如一个PHP数组序列化)描述域对象,你想要包含到您的数据库。您可以编写以下任务:
而(美元的内容=修剪(函数可以(STDIN))){如果(元数据=非系列化(美元的内容)= = !假){美元的对象=新对象();美元的对象- >fromArray(元数据);美元的对象- >保存();}}
您将使用它是这样的:
/usr/bin/data_provider |。/ 欧宝娱乐app下载地址symfony数据:导入
data_provider
应用程序提供新的域对象,数据:进口
您刚刚编写的任务。
最终的想法
哪些任务是有限的,只有你的想象力所能达到的水平。欧宝娱乐app下载地址Symfony的任务系统是仅仅足够强大和灵活的,你可以做任何你能想到。再加上一个UNIX shell的力量,和你真的会喜欢任务。
这项工作在Creative Commons许可Attribution-Share都3.0 Unported许可执照。