CodeIgniter 新闻
介绍 Sparks
上个月刚刚在伦敦召开 CIConf 后,我想深入的了解一些 CodeIgniter 开发者中的共同话题。我发现他们在谈论如何通过简单的自动化工具提高开发效率。要做到这一点,我们要看看 CodeIgniter Sparks 项目是如何提高你的开发效率的。下面,我将通过创建一个演示站点,来演示如何访问 GitHub 的 API。
首先,什么是 Sparks?
Sparks 是一个 CodeIgniter 的包管理系统。Sparks 托管用户贡献的代码,你可以拉取到你的项目中。如果你通过 Steam 下载过游戏;通过 Homebrew 安装过软件;或使用 Ruby Gem 提高过工作效率,那么,你应该了解一个包管理系统都能为你做些什么。
为什么不是 PEAR?
PHP 有一个现成的包管理系统——PEAR。理论上,一个框架相应的包管理器应该是用该语言进行简单的封装。不幸的是,PEAR 诡异的打包方式并不是很合适。令人遗憾的是,在看到 gems、easy_install 和 npm 的成功后,PHP 标准也没有引入这些特性。
怎样获取 Sparks?
在 getsparks 网站上有安装指南。为了演示目的,我将使用安装指南中没有列出的选项:CodeIgniter Reactor 团队正在努力开发,让 Sparks 成为 CodeIgniter 的一部分,所以,我将从 GitHub 上的 sparks 分支开始。
让我们开始吧!
在你的 Web 根目录下创建一个新目录,进入这个目录,然后运行:
这样做将克隆一个 CodeIgniter Reactor 代码库的副本,并切换到 sparks 分支上。如果你通过浏览器浏览刚才自动创建的 CodeIgniter 目录,你应该看到 CodeIgniter 的欢迎页面。
接下来,让我们找到我们的第一个 Spark(译注:一个 Spark 可以理解为一个第三方类库,后面的 spark 都是这个意思)。在我们刚才创建的 CodeIgniter 目录中打开命令行,运行类似这样的命令:
例如,显示一个所有命令的列表可以这样:
如果你觉得很繁琐,那么可以用 -s 替换 --spark。
为了创建这个演示站点,我们需要访问 Github 的 API。我们知道,GitHub 的 API 是一个 RESTful API,所以,可以先用 search 命令搜索一些对我们有用的东西:
你会看到一个包的列表。restclient 这个包看起来符合要求。安装这个包也很容易:
屏幕上会显示一大堆内容。重要的内容在尾部。我们会看到 Sparks 为我们安装了 restclient 需要的 curl 库。也告诉我们刚刚安装了哪个版本。Sparks 支持 spark 的多版本共存,所以我们可以同时安装一个 spark 的多个版本。
让我们尝试一下。编辑 application/controllers/welcome.php 文件,在 index 方法的最上面加载这个 spark:
加载这个 spark 后,我们将会给 GitHub 发一个测试请求。
$this->rest->initialize(array('server' => 'https://api.github.com/'));
$repos = $this->rest->get('users/'.$user.'/repos');
var_dump($repos);
注意:可能返回 false。这可能会发生在一些本地环境中,特别是 MAMP,可能的原因是 SSL 证书问题。如果你碰到这个问题,你可以在上面代码中的 get 调用前添加以下内容:
现在我们可以得到返回数据了,但输出内容还比较凌乱。所以,我们将用视图替代 var_dump。重新命名现有视图为一个更合适的名字(比如“home”)。然后加载这个视图,并传递返回的数据给视图:
在这个视图中,通过循环 $repos 变量,我们可以让输出更美观。然后,我观察了一下前面的 dump 结果,我决定在输出中包括标题、描述和一个链到 GitHub 的链接。
<div class="project">
<h2><?php echo $repo->name?></h2>
<p><?php echo $repo->description?></p>
<a href="<?php echo $repo->html_url?>">View on Github</a>
</div>
<?php endforeach;?>
我们现在已经取得了一些成果。但是还不能满足,一个产品没有好的文档怎么能行?当然文档肯定会写的。我们先给文档添加个链接吧。在视图的循环中添加:
我们在这里使用了 URL 辅助函数,所以请先在控制器中载入它:
为实现这个功能,我们要在刚才的控制器(application/controllers/welcome.php)中创建一个方法:
GitHub 上有一个很好的约定,任何项目的根目录中的 README 文件将显示为文档。它们很多都是以 markdown 格式写成的,所以这个例子中我们尝试编写一个“README.md”文件。我们需要的功能都可以通过 GitHub 的 API 实现。
调用 rest->get() 方法时,需要运行前面的那些初始化代码,所以,我决定把这些初始化代码放到构造函数中。
我们与 git 进行交互,它本身不是文件系统,所以命名上有些奇怪,基本来说,我们可以将 tree 当作一个文件。(译注:这里如果读者不了解 git 可能会比较难理解,请先阅读一些 git 资料,这里提供一个维基百科关于 git 的链接:http://zh.wikipedia.org/wiki/Git)我们需要遍历所有文件来寻找 README.md。记住,你总是可以用 var_dump 来查看你的数据。当遍历文件的时候,我注意到 API 返回的对象结果中出现了一个新的 API URL,后面我们会用到它。
$doc_url = ‘’; foreach ($trees->tree as $info) { if ($info->path == 'README.md') { $doc_url = str_replace('https://api.github.com/', '', $info->url); break; } }
现在我们的 readme 文件有了新的 URL,我们可以随时读取文件内容。注意,文件内容已被编码,所以我们需要一个额外的步骤:
$content = base64_decode($readme->content);
我们就快成功了!我们可以传递文件内容到视图中,看起来还不错:
// view:
<?php echo $content?>
然而,我们不应该让我们的用户看到原始的 markdown 内容。让我们回到命令行,看看我们可以找到些什么:
markdown Spark 看起来很棒!让我们继续安装它。
有了这个新工具,我们可以渲染 markdown 内容:
// in the view
<?php echo parse_markdown($content)?>
现在你已经成功了!
当然,在这个网站上线后,我们不希望每个请求都访问 API,否则我们很快将遇到麻烦。因此,作为最后一步,你应该缓存这些页面:
我们编写完成的控制器应该类似于:https://gist.github.com/2029827
最后,感谢 Reactor 和 Sparks 团队开发了这么牛X的工具!
发布人: Hex, 日期: 2012年3月13日