今年2月,当我在SymfonyLive时,我在一个全天的研讨会上协助StefanKoopmanschap,将ZendFramework集成到Symfony应用程序中。在那次研讨会上,Stefan演示了如何创建Symfony“任务”。这些是绑定到Symfony命令行工具的类——基本上允许您绑定到CLI工具以创建cronjobs、迁移脚本等。
当然,ZendFramework在Zend_Tool组件的“提供者”中有一个类似于Symfony任务的类比。在本文中,我将演示如何创建一个简单的提供程序,它将返回来自RSS或Atom提要的最新条目。
要事第一
警告:整篇文章都假设您使用的是类unix操作系统,例如Linux发行版或MacOSX。大多数说明应该适用于Windows,但我尚未在该平台上进行测试。
首先,进行一些设置。Zend_Tool
需要一些配置。要开始,您需要运行以下命令(如果您尚未运行):
$ zf create config
这将在$HOME/.zf.ini
中创建配置。如果打开该文件,您应该会看到php.include_path
的条目。这是include_path
Zend_Tool
将使用的,应该包括您的ZF安装;您创建的任何提供程序都应该在这条路径上——或者您应该修改它以添加到您的提供程序的路径。
创建提供者
供应商非常简单。创建一个最简单的方法是创建一个扩展Zend_Tool_Framework_Provider_Abstract
的类,然后简单地开始创建方法。
不过,有几条规则还是要知道的:
-
如果您需要抛出异常,抛出一个
Zend_Tool_Project_Exception
。这与CLI工具集成以提供漂亮、丰富多彩的错误消息。 -
虽然您可以直接从您的方法中
回显
,建议的做法是使用响应对象并将内容附加到它。这将确保如果我们稍后向Zend_Tool
编写XML-RPC、SOAP或Web前端,您将不需要对代码进行任何更改。这很简单:$response = $this->_registry->getResponse(); $response->appendContent($content);
在我的提供商中,我想获取给定提要的第一个条目。我不需要记住提要URL,而是想使用助记符;这将是提供者的唯一论点。我将它默认为我自己的提要。代码最终看起来像这样:
class Phly_Tool_Feed extends Zend_Tool_Framework_Provider_Abstract { protected $_feeds = array( 'weierophinney' => 'http://weierophinney.net/matthew/feeds/index.rss1', 'planetphp' => 'http://www.planet-php.net/rdf/', ); /** * Read the first item of a feed * * @param string $feed Named identifier for a feed * @return bool */ public function read($feed = 'weierophinney') { if (!array_key_exists($feed, $this->_feeds)) { throw new Zend_Tool_Project_Exception(sprintf( 'Unknown feed "%s"', $feed )); } $feed = Zend_Feed_Reader::import($this->_feeds[$feed]); $title = $desc = $link = ''; foreach ($feed as $entry) { $title = $entry->getTitle(); $desc = $entry->getDescription(); $link = $entry->getLink(); break; } $content = sprintf("%s\n%s\n\n%s\n", $title, strip_tags($desc), $link); $response = $this->_registry->getResponse(); $response->appendContent($content); return true; } }
我在这里利用Zend_Feed_Reader
,并简单地创建一些格式化的文本输出。
既然创建了提供程序,我需要将其放入文件Phly/Tool/Feed.php
,相对于include_path
中由Zend_Tool
。
将提供者绑定到工具
现在我们已经编写了提供程序并且在某处Zend_Tool
可能会找到它,我们需要将它告诉Zend_Tool
。再次打开$HOME/.zf.ini
文件,并添加以下行:
basicloader.classes.1 = \"Phly_Tool_Feed\"
这告诉Zend_Tool
有一个额外的提供者它应该知道。特别注意密钥的.1
部分;basicloader.classes
是一个数组。我发现的一个问题是,与Zend_Config
不同,您不能使用[]
符号。换句话说,以下不起作用:
basicloader.classes[] = "Phly_Tool_Feed"
您需要手动指定键,并且它们需要是唯一的。
获得帮助
现在,是时候测试它是否一切正常了。如果您已完成上述步骤,您现在可以执行以下操作:
$ zf \? feed
注意:我用的是zsh,需要转义问号;你可能不需要在其他shell中。
如果一切顺利,您将获得以下内容:
Actions supported by provider "Feed" Feed zf read feed feed[=weierophinney]
如果您没有看到这一点,请检查以确保您的提供程序位于.zf.ini
文件中定义的include_path
上;如果您仍有问题,请在fw-general邮件列表或Freenode上的#zftalkIRC频道中询问。
使用提供者
一旦您的提供商开始工作,启动它:
$ zf read feed
或
$ zf read feed planetphp
您应该得到如下所示的内容(实际条目会有所不同):
State of Zend Framework 2.0 The past few months have kept myself and my team quite busy, as we've turned our attentions from maintenance of the Zend Framework 1.X series to Zend Framework 2.0. I've been fielding questions regularly about ZF2 lately, and felt it was time to talk about the roadmap for ZF2, what we've done so far, and how the community can help. Continue reading "State of Zend Framework 2.0" http://weierophinney.net/matthew/archives/241-State-of-Zend-Framework-2.0.html
结束语
您可能会遇到的一个“问题”是,目前不支持在使用Zend_Tool
创建的应用程序中指定特定于项目的提供程序—这一功能对于创建特定于项目的任务非常有用。*
也就是说,Zend_Tool
提供程序是编写基于ZendFramework的CLI工具的非常有用和简单的方法。希望这篇文章将有助于揭开组件及其用法的神秘面纱,并让您思考您想要编写的任务。
*您可以通过在您的项目中创建一个备用配置文件来伪造它,将其告知环境,然后调用zf
commandlinetool—可以在一行中完成的事情:
$ ZF_CONFIG_FILE=./zf.ini; zf <action> <provider> ...