CodeIgniter 英文官方网站

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 根目录下创建一个新目录,进入这个目录,然后运行:

git clone -b feature/sparks --depth 1 git://github.com/EllisLab/CodeIgniter.git 

这样做将克隆一个 CodeIgniter Reactor 代码库的副本,并切换到 sparks 分支上。如果你通过浏览器浏览刚才自动创建的 CodeIgniter 目录,你应该看到 CodeIgniter 的欢迎页面。

接下来,让我们找到我们的第一个 Spark(译注:一个 Spark 可以理解为一个第三方类库,后面的 spark 都是这个意思)。在我们刚才创建的 CodeIgniter 目录中打开命令行,运行类似这样的命令:

php index.php --spark <command[arguments] 

例如,显示一个所有命令的列表可以这样:

php index.php --spark help 

如果你觉得很繁琐,那么可以用 -s 替换 --spark。

为了创建这个演示站点,我们需要访问 Github 的 API。我们知道,GitHub 的 API 是​​一个 RESTful API,所以,可以先用 search 命令搜索一些对我们有用的东西:

php index.php --spark search rest 

你会看到一个包的列表。restclient 这个包看起来符合要求。安装这个包也很容易:

php index.php --spark install restclient 

屏幕上会显示一大堆内容。重要的内容在尾部。我们会看到 Sparks 为我们安装了 restclient 需要的 curl 库。也告诉我们刚刚安装了哪个版本。Sparks 支持 spark 的多版本共存,所以我们可以同时安装一个 spark 的多个版本。

让我们尝试一下。编辑 application/controllers/welcome.php 文件,在 index 方法的最上面加载这个 spark:

$this->load->spark('restclient/2.0.0'); 

加载这个 spark 后,我们将会给 GitHub 发一个测试请求。

$user 'github';

$this->rest->initialize(array('server' => 'https://api.github.com/'));
$repos $this->rest->get('users/'.$user.'/repos');

var_dump($repos); 

注意:可能返回 false。这可能会发生在一些本地环境中,特别是 MAMP,可能的原因是 SSL 证书问题。如果你碰到这个问题,你可以在上面代码中的 get 调用前添加以下内容:

$this->rest->option(CURLOPT_SSL_VERIFYPEERFALSE); 

现在我们可以得到返回数据了,但输出内容还比较凌乱。所以,我们将用视图替代 var_dump。重新命名现有视图为一个更合适的名字(比如“home”)。然后加载这个视图,并传递返回的数据给视图:

$this->load->view('home', array('repos' => $repos)); 

在这个视图中,通过循环 $repos 变量,我们可以让输出更美观。然后,我观察了一下前面的 dump 结果,我决定在输出中包括标题、描述和一个链到 GitHub 的链接。

<?php foreach ($repos as $repo):?>
<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;?> 

我们现在已经取得了一些成果。但是还不能满足,一个产品没有好的文档怎么能行?当然文档肯定会写的。我们先给文档添加个链接吧。在视图的循环中添加:

<?php echo anchor('/welcome/docs/'.$repo->name'Documentation')?> 

我们在这里使用了 URL 辅助函数,所以请先在控制器中载入它:

$this->load->helper('url'); 

为实现这个功能,我们要在刚才的控制器(application/controllers/welcome.php)中创建一个方法:

public function docs($which{} 

GitHub 上有一个很好的约定,任何项目的根目录中的 README 文件将显示为文档。它们很多都是以 markdown 格式写成的,所以这个例子中我们尝试编写一个“README.md”文件。我们需要的功能都可以通过 GitHub 的 API 实现。

$trees $this->rest->get('repos/'.$this->user.'/'.$which.'/git/trees/HEAD'); 

调用 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,我们可以随时读取文件内容。注意,文件内容已被编码,所以我们需要一个额外的步骤:

$readme $this->rest->get($doc_url);
$content base64_decode($readme->content); 

我们就快成功了!我们可以传递文件内容到视图中,看起来还不错:

$this->load->view('docs', array('content' => $content));
// view:
<?php echo $content?> 

然而,我们不应该让我们的用户看到原始的 markdown 内容。让我们回到命令行,看看我们可以找到些什么:

php index.php --spark search markdown 

markdown Spark 看起来很棒!让我们继续安装它。

php index.php --spark install markdown 

有了这个新工具,我们可以渲染 markdown 内容:

$this->load->spark('markdown/1.2.0');
// in the view
<?php echo parse_markdown($content)?> 

现在你已经成功了!

当然,在这个网站上线后,我们不希望每个请求都访问 API,否则我们很快将遇到麻烦。因此,作为最后一步,你应该缓存这些页面:

$this->output->cache(60*24); // cache for a day 

我们编写完成的控制器应该类似于:https://gist.github.com/2029827

最后,感谢 Reactor 和 Sparks 团队开发了这么牛X的工具!

发布人: Hex, 日期: 2012年3月13日