利用命令行的力量
杰弗里·巴切莱特
ob娱乐下载Symfony 1.1引入了一个现代的、强大的、灵活的命令行系统,以取代旧的基于pak的任务系统。从一个版本到另一个版本,任务系统得到了改进,使其成为今天的样子。
许多web开发人员看不到任务中的附加价值。通常,这些开发人员没有意识到命令行的强大功能。在本章中,我们将深入研究任务,从最开始到更高级的用法,看看它如何帮助您的日常工作,以及如何从任务中获得最佳效果。
任务简介
类从命令行运行的一段代码ob娱乐下载
PHP脚本在项目的根。你可能已经遇到过知名的任务缓存:清晰
任务(也称为cc
)通过在shell中运行:
symfonob娱乐下载y cc
ob娱乐下载Symfony为各种用途提供了一组通用的内置任务。命令可以获得可用任务的列表ob娱乐下载
脚本,不带任何参数或选项:
$ PHP ob娱乐下载symfony
输出看起来像这样(内容被截断):
用法:symfob娱乐下载ony [options] task_name [arguments]选项:——help -H显示帮助信息。——quiet -q不将消息记录到标准输出。——trace -t打开调用/执行跟踪,启用完全反向跟踪。——version -V显示程序版本。——color强制ANSI颜色输出。——xml将帮助以xml格式输出可用任务::help显示任务帮助(h):list列出任务app:routes显示应用程序的当前路由cache:clear清除缓存(cc, clear-cache)
您可能已经注意到任务是分组的。任务组称为命名空间,任务名称通常由命名空间和任务名称组成(除了帮助
而且列表
没有名称空间的任务)。这种命名方案允许简单的任务分类,您应该为每个任务选择一个有意义的名称空间。
写自己的任务
开始使用symfony编写任务只需要几分钟。ob娱乐下载您所要做的就是创建您的任务,命名它,在其中放入一些逻辑,然后voilà,您就可以运行您的第一个自定义任务了。让我们创建一个非常简单的你好,世界!任务,例如在lib /任务/ sayHelloTask.class.php
:
类sayHelloTask扩展sfBaseTask{公共函数配置(){这个美元->名称空间=“说”;这个美元->的名字=“你好”;}公共函数执行(美元的参数=数组(),选择美元=数组()){回声“Hello, World !”;}}
现在用下面的命令运行它:
symfonob娱乐下载y说:你好
这个任务只输出你好,世界!,但这只是一个开始!任务实际上并不意味着直接通过回声
或打印
语句。扩展sfBaseTask
允许我们使用一些有用的方法,包括日志()
方法,它只做我们想做的事情,输出内容:
公共函数执行(美元的参数=数组(),选择美元=数组()){这个美元->日志(“Hello, World !”);}
由于单个任务调用可能导致多个任务输出内容,因此实际上可能希望使用logSection ()
方法:
公共函数执行(美元的参数=数组(),选择美元=数组()){这个美元->logSection(“说”,“Hello, World !”);}
现在,您可能已经注意到传递给的两个参数execute ()
方法,美元的参数
而且选择美元
。它们用于保存在运行时传递给任务的所有参数和选项。我们将在后面广泛地讨论参数和选项。现在,让我们为我们的任务添加一点交互性,允许用户指定我们想要向谁打招呼:
公共函数配置(){这个美元->addArgument(“谁”, sfCommandArgument::可选,“跟谁打个招呼?”,“世界”);}公共函数执行(美元的参数=数组(),选择美元=数组()){这个美元->logSection(“说”,“你好,”。美元的参数[“谁”]。“!”);}
现在执行以下命令:
说:你好Geob娱乐下载offrey
应产生以下输出:
说你好,杰弗里!
哇,这很简单。
顺便说一下,您可能希望在任务中包含更多的元数据,例如它所做的事情。可以通过设置briefDescription
而且detailedDescription
属性:
公共函数配置(){这个美元->名称空间=“说”;这个美元->的名字=“你好”;这个美元->briefDescription=“简单的hello world”;这个美元->detailedDescription= <<[说:你好|信息]task是使用symfony的经典Hello World示例的实现ob娱乐下载的任务系统。(。使ob娱乐下载用这个任务来问候你自己,或者使用[——who|COMMENT]参数问候其他人。EOF;$ this - > addArgument ('谁', sfCommandArgument::OPTIONAL, '跟谁打个招呼?”、“世界”);}
如您所见,您可以使用一组基本的标记来修饰您的描述。你可以使用symfony的任务帮助系统检查渲染:ob娱乐下载
symfonob娱乐下载y帮助说:你好
期权系统
symfony任务中的选项ob娱乐下载被组织成两个不同的集合:选项和参数。
选项
选项是使用连字符传递的选项。您可以以任何顺序将它们添加到命令行。它们可以有值,也可以没有值,在这种情况下,它们充当布尔值。期权通常有多头和空头两种形式。长形式通常使用两个连字符来调用,而短形式只需要一个连字符。
常见的选项有帮助开关(——帮助
或- h
),详细度开关(——安静
或q
)或版本切换(——版本
或- v
).
请注意
属性定义选项sfCommandOption
类中存储的sfCommandOptionSet
类。
参数
参数只是附加到命令行的一段数据。它们必须按照定义时的顺序指定,如果想在其中包含空格(或者也可以转义空格),则必须用引号将它们括起来。它们可以是必需的,也可以是可选的,在这种情况下,您应该在参数的定义中指定一个默认值。
请注意
显然,参数是用sfCommandArgument
类中存储的sfCommandArgumentSet
类。
默认设置
每个symfob娱乐下载ony任务都有一组默认选项和参数:
——帮助
(-H
):显示此帮助信息。——安静
(q
):不将消息记录到标准输出。——跟踪
(- t
):打开调用/执行跟踪,启用完全反向跟踪。——版本
(- v
):显示程序版本。——颜色
:强制ANSI颜色输出。
特殊选项
ob娱乐下载Symfony的任务系统理解两个非常特殊的选项,应用程序
而且env
。
的应用程序
选项,当您想访问sfApplicationConfiguration
实例而不仅仅是实例sfProjectConfiguration
。实例。例如,当您想要生成url时,就是这种情况,因为路由通常与特定的应用程序相关联。
当一个应用程序
选项传递给任务时,symfony将自动检测并创建相应的选ob娱乐下载项sfApplicationConfiguration
对象,而不是默认值sfProjectConfiguration
对象。注意,您可以为此选项设置一个默认值,从而避免每次运行任务时手动传递应用程序的麻烦。
的env
选项显然控制任务执行的环境。当没有传递环境时,测验
默认使用。就像应用程序
的默认值env
symfony将自动使用的选项。ob娱乐下载
自应用程序
而且env
不包含在默认选项集中,您必须手动在任务中添加它们:
公共函数配置(){这个美元->使用addoption(数组(新sfCommandOption(“应用程序”,零, sfCommandOption::PARAMETER_REQUIRED,“应用程序名称”,“前端”),新sfCommandOption(“env”,零, sfCommandOption::PARAMETER_REQUIRED,“环境”,“开发”),));}
在本例中,前端
应用程序将自动使用,除非指定了不同的环境,否则任务将在dev
环境。
访问数据库
从symfony任务中访问数据库只是实例化一个ob娱乐下载sfDatabaseManager
实例:
公共函数执行(美元的参数=数组(),选择美元=数组()){databaseManager美元=新sfDatabaseManager(这个美元->配置);}
你也可以直接访问ORM的连接对象:
公共函数执行(美元的参数=数组(),选择美元=数组()){databaseManager美元=新sfDatabaseManager(这个美元->配置);美元的连接=databaseManager美元->getDatabase()->getConnection();}
但是,如果您的databases.yml
?例如,你可以加一个连接
任务选项:
公共函数配置(){这个美元->使用addOption(“连接”, sfCommandOption::PARAMETER_REQUIRED,“连接名”,“原则”);}公共函数执行(美元的参数=数组(),选择美元=数组()){databaseManager美元=新sfDatabaseManager(这个美元->配置);美元的连接=databaseManager美元->getDatabase(收取(选择美元[“连接”])?选择美元[“连接”]:零)->getConnection();}
通常,您可以为该选项设置一个默认值。
瞧!您现在可以像在symfony应用程序中一样操作您的模型。ob娱乐下载
请注意
在使用您喜欢的ORM对象进行批处理时要小心。Propel和Doctrine都有一个众所周知的PHP bug,它与循环引用和垃圾收集器有关,会导致内存泄漏。这在PHP 5.3中得到了部分修复。
发送邮件
任务最常见的用途之一是发送电子邮件。在symfoob娱乐下载ny 1.3之前,发送电子邮件并不简单。但是时代已经改变了:symfony现在具有与ob娱乐下载斯威夫特梅勒,一个功能丰富的PHP邮件库,所以让我们使用它!
ob娱乐下载的任务系统公开邮件对象sfCommandApplicationTask: getMailer ()
方法。这样,您就可以访问邮件器并轻松发送电子邮件:
公共函数执行(美元的参数=数组(),选择美元=数组()){梅勒美元=这个美元->getMailer();梅勒美元->composeAndSend(从美元,接受美元,美元的主题,messageBody美元);}
请注意
由于邮件器的配置是从应用程序配置中读取的,因此任务必须接受应用程序选项才能使用邮件器。
请注意
如果您正在使用spool策略,电子邮件仅在您调用项目:发送电子邮件
的任务。
在大多数情况下,你不会让你的消息内容坐在一个神奇的messageBody美元
变量等待被发送时,您需要以某种方式生成它。在symfony中没有首选的方式来为您的电子邮件生成内容,ob娱乐下载但您可以遵循一些提示,使您的生活更轻松:
委托内容生成
例如,为你的任务创建一个受保护的方法,返回你正在发送的电子邮件的内容:
公共函数执行(美元的参数=数组(),选择美元=数组()){这个美元->getMailer()->composeAndsend(从美元,接受美元,美元的主题,这个美元->getMessageBody());}受保护的函数getMessageBody(){返回“你好,世界”;}
使用Swift Mailer的Decorator插件
Swift Mailer提供了一个名为装饰
这基本上是一个非常简单但高效的模板引擎,可以获取特定于收件人的替换值对,并在发送的所有邮件中应用它们。
看到Swift Mailer的文档欧宝官网下载app获取更多信息。
使用外部模板库
集成第三方模板库很容易。例如,您可以使用作为Symfony Components项目一部分发布的全新模板组件。ob娱乐下载只需将组件代码放到项目的某个位置(lib /供应商/模板/
将是一个好地方),并在你的任务中写下以下代码:
受保护的函数getMessageBody(美元的模板,$ var=数组()){美元的引擎=这个美元->getTemplateEngine();返回美元的引擎->渲染(美元的模板,$ var);}受保护的函数getTemplateEngine(){如果(is_null(这个美元->templateEngine)){美元的装载机=新sfTemplateLoaderFilesystem(sfConfig::得到(“sf_app_dir”)。“/模板/电子邮件/ % s.php”);这个美元->templateEngine=新sfTemplateEngine(美元的装载机);}返回这个美元->templateEngine;}
两全其美
你能做的还有很多。斯威夫特梅勒的装饰
插件非常方便,因为它可以根据特定的接收人管理替换。这意味着您为每个收件人定义了一组替换,Swift Mailer负责根据所发送邮件的收件人将令牌替换为正确的值。让我们看看如何将其与模板组件集成:
公共函数执行(美元的参数=数组(),选择美元=数组()){美元的消息= 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。幸运的是,在symfony 1.3中生成url变得很容易,因为您可以在任务内部通过使用ob娱乐下载sfCommandApplicationTask: getRouting ()
方法:
公共函数执行(美元的参数=数组(),选择美元=数组()){美元的路由=这个美元->getRouting();}
请注意
由于路由依赖于应用程序,所以必须确保应用程序具有可用的应用程序配置,否则将无法使用路由生成url。
看到特殊选项部分,以了解如何在任务中自动获取应用程序配置。
方法生成URL非常简单,现在我们已经有了一个路由实例生成()
方法:
公共函数执行(美元的参数=数组(),选择美元=数组()){$ url=这个美元->getRouting()->生成(“默认”,数组(“模块”= >“foo”,“行动”= >“酒吧”));}
第一个参数是路由的名称,第二个参数是路由的参数数组。此时,我们已经生成了一个相对URL,这很可能不是我们想要的。不幸的是,在任务中生成绝对url将不起作用,因为我们没有sfWebRequest
对象来获取HTTP主机。
解决这个问题的一个简单方法是在您的factories.yml
配置文件:
all: routing: class: sfPatternRouting param: generate_shortest_url: true extra_parameters_as_query_string: true context: host: example.org
看到context_host
设置?这是当请求一个绝对URL时路由将使用的:
公共函数执行(美元的参数=数组(),选择美元=数组()){$ url=这个美元->getRouting()->生成(“my_route”,数组(),真正的);}
接入I18N系统
并不是所有的工厂都像邮件和路由一样容易到达。如果您需要访问其中一个,实例化它们并不难。例如,假设您希望国际化您的任务,那么您将希望访问symfony的i18n子系统。ob娱乐下载这很容易使用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(美元的任务作为美元的任务){这个美元->运行(美元的任务);}
操作文件系统
ob娱乐下载Symfony带有内置的简单文件系统抽象(sfFilesystem
),允许对文件和目录执行简单操作。可以在任务中访问$ this - > getFilesystem ()
。这个抽象公开了以下方法:
sfFilesystem:复制()
,复制文件sfFilesystem: mkdir ()
,创建递归目录sfFilesystem:触摸()
,以创建文件sfFilesystem: remove ()
,删除文件或目录sfFilesystem: chmod ()
,以更改文件或目录的权限sfFilesystem:重命名()
,以重命名文件或目录sfFilesystem:符号链接()
,以创建到目录的链接sfFilesystem: relativeSymlink ()
,以创建到目录的相对链接sfFilesystem:镜子()
,以镜像一个完整的文件树sfFilesystem: execute ()
,执行任意shell命令
它还揭示了一个非常方便的方法,我们将在下一节中介绍:replaceTokens ()
。
使用skeleton生成文件
任务的另一个常见用途是生成文件。使用框架和前面提到的方法可以很容易地生成文件sfFilesystem: replaceTokens ()
。顾名思义,这个方法替换一组文件中的标记。也就是说,你传递给它一个文件数组,一个令牌列表它用赋值替换数组中每个文件的每一个令牌。
为了更好地理解这是如何有用的,我们将部分重写现有的任务:生成:模块
。为了简洁明了,我们将只看执行
这是该任务的一部分,假设已经正确地配置了所有所需的选项。我们还将跳过验证。
甚至在开始编写任务之前,我们需要为将要创建的目录和文件创建一个框架,并将其存储在如下的地方数据/框架/
:
Data /skeleton/ module/ actions/ actions.class.php templates/
的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美元),“%”,“%”,美元的符号);
就是这样,我们生成了我们的新模块,使用令牌替换来定制它。
请注意
内置的生成:模块
实际上是在调查数据/框架/
要使用替代骨架而不是默认骨架,所以请注意您的步骤!
使用演练选项
通常,您希望能够在实际运行任务之前预览任务的结果。这里有一些关于如何做到这一点的建议。
首先,您应该使用标准名称,例如管制
。每个人都知道这是什么。直到symfob娱乐下载ony 1.3,sfCommandApplication
做了添加默认值管制
选项,但现在应该手动添加它(可能是在基类中,如上所示):
这个美元->使用addOption(新sfCommandOption(“管制”,零, sfCommandOption::PARAMETER_NONE,“执行一次演练”);
然后像这样调用你的任务:
./ob娱乐下载symfony my:任务——演练
的管制
选项指示任务不应进行任何更改。
不应该做任何改变吗记住这一点,它们是关键词。磨合时管制
模式下,你的任务必须离开之前的环境,包括(但不限于):
- 数据库:不要从表中插入、更新或删除记录。您可以使用事务来实现这一点。
- 文件系统:不要从文件系统中创建、修改或删除文件。
- 邮件发送:不发送邮件,或发送到调试地址。
的一个简单示例管制
选择:
美元的连接->beginTransaction();//修改数据库如果(选择美元[“管制”]){美元的连接->回滚();}其他的{美元的连接->提交();}
编写单元测试
由于任务可以实现各种各样的目标,单元测试并不是一件容易的事情。因此,没有一种方法可以测试任务,但是有一些原则可以帮助您的任务更具可测试性。
首先,把你的任务想象成一个控制器。还记得关于控制器的规则吗?瘦控制器,胖模型。也就是说,将所有业务逻辑移到您的模型中,这样您就可以测试您的模型而不是任务,这要容易得多。
一旦你认为你不能在模型中加入更多的逻辑,那就拆分你的模型execute ()
方法分解为易于测试的代码块,每个代码块都驻留在自己易于访问(即公共)的方法中。拆分代码有几个好处:
- 它使你的任务变得简单
执行
更具可读性 - 它使您的任务更具可测试性
- 它使您的任务更具可扩展性
要有创造力,不要犹豫,为您的测试需求构建一个小型的特定环境。如果你找不到任何方法来测试你刚刚写的那个很棒的任务,有两种可能:要么你写得不好,要么你应该征求别人的意见。此外,您还可以深入研究其他人的代码,了解他们是如何进行测试的(例如,symfony的任务就经过了很好的测试,甚至生成器也是如此)。ob娱乐下载
辅助方法:日志记录
ob娱乐下载Symfony的任务系统努力使开发人员的工作更轻松,为常见操作(如日志记录和用户交互)提供了方便的辅助方法。
可以很容易地将消息记录到STDOUT
使用日志
方法族:
日志
,接收一个消息数组logSection
,更详细一点,它使用前缀(第一个参数)和消息类型(第四个参数)格式化消息。当你记录一些太长的东西时,比如文件路径,logSection
通常会缩短你的信息,这很烦人。使用第三个参数指定适合您的消息的最大消息大小logBlock
,是用于异常的日志记录样式。在这里,同样可以传递格式化样式
可用的日志格式有错误
,信息
,评论
而且问题
。不要犹豫,试一试,看看它们是什么样子。
使用示例:
这个美元->logSection(“文件+”,aVeryLongFileName美元,这个美元->strlen(aVeryLongFileName美元));这个美元->logBlock(“恭喜你!你成功地完成了任务!”,“信息”);
辅助方法:用户交互
提供了另外三个帮助程序来简化用户交互:
问()
,基本上打印一个问题并返回任何用户输入askConfirmation ()
,我们要求用户确认,允许y
(是的),n
(no)作为用户输入askAndValidate ()
,这是一种非常有用的方法,它打印一个问题并验证用户输入sfValidator
作为第二个参数传递。第三个参数是一个选项数组,您可以在其中传递一个默认值(价值
),表示最大尝试次数(尝试
)和格式化样式(风格
).
例如,你可以问一个用户他的电子邮件地址,并在运行中验证它:
美元的电子邮件=这个美元->askAndValidate(“你的电子邮件地址是什么?”,新sfValidatorEmail());
奖励回合:使用Crontab的任务
大多数UNIX和GNU/Linux系统允许通过一种称为cron。的cron检查配置文件(a定时任务),以便在特定时间运行命令。ob娱乐下载Symfony任务可以很容易地集成到crontab中项目:发送电子邮件
Task就是一个很好的例子:
MAILTO="you@example.org" 0 3 * * * /usr/bin/php /var/www/yourproject/ob娱乐下载symfony项目:send-email
这个构型告诉我们cron运行项目:发送电子邮件
每天凌晨3点,将所有可能的输出(即日志、错误等)发送到该地址you@example.org。
请注意
有关crontab配置文件格式的详细信息,请键入男人5克朗塔布
在一个终端。
你可以,也应该传递参数和选项:
MAILTO="you@example.org" 0 3 * * * /usr/bin/php /var/www/yourproject/ob娱乐下载symfony项目:send-电子邮件——env=prod——application=frontend
请注意
你应该替换/usr/bin/php
PHP CLI二进制文件的位置。如果你没有这些信息,你可以试试php
在Linux系统或php的思想在何处
在大多数其他UNIX系统上。
奖励回合:使用STDIN
由于任务是在命令行环境中运行的,所以您可以访问标准输入流(STDIN)。UNIX命令行允许应用程序通过各种方式相互交互,其中之一是管,用汉字来象征|。的管允许您传递应用程序的输出(称为STDOUT)到另一个应用程序的标准输入(称为STDIN).可以通过PHP的特殊常量在任务中访问这些常量STDIN
而且STDOUT
。还有第三种标准流,STDERR,可经由STDERR
,用于携带应用程序的错误消息。
那么我们可以用标准输入做什么呢?假设您的服务器上运行一个应用程序,它希望与您的symfony应用程序通信。ob娱乐下载当然,您可以让它通过HTTP进行通信,但更有效的方法是将其输出输送到symfony任务。ob娱乐下载假设应用程序可以发送结构化数据(例如PHP数组序列化),描述您希望包含到数据库中的领域对象。你可以写下面的任务:
而(美元的内容=修剪(函数可以(STDIN))){如果(元数据=非系列化(美元的内容)= = !假){美元的对象=新对象();美元的对象->fromArray(元数据);美元的对象->保存();}}
然后你可以这样使用它:
/usr/bin/data_provider | ./ob娱乐下载symfony data:导入
data_provider
作为提供新域对象的应用程序,以及数据:进口
就是你刚刚写的任务。
最终的想法
你能完成的任务只受限于你的想象力。ob娱乐下载Symfony的任务系统非常强大和灵活,你可以做任何你能想到的事情。再加上UNIX shell的强大功能,您一定会爱上任务的。
本作品在创作共用署名相似共享3.0未移植许可许可下获得许可。