Laravel 4 Artisan 命令行实战

Laravel 4 Artisan 命令行实战

需求

有一个需求, 需要把已有的老数据做整理, 为每篇 Topic 生成一个摘要信息, 并放到数据库里面, 方便以后的读取.

对于这个需求我们通过扩展 Laravel 4 的 Artisan 命令来实现.

创建命令

1. 命令行生成文件

以下命令会在 app/commands 文件夹中生成 TopicMakeExcerptCommand.php 文件

$ php artisan command:make TopicMakeExcerptCommand
Command created successfully.

2. 激活 Artisan 命令行

app/start/artisan.php 文件里面, 添加以下

Artisan::add(new TopicMakeExcerptCommand);

3. 加入业务逻辑代码

第一步生成的 TopicMakeExcerptCommand.php 文件, 修改以下区域

<?php

use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;

class TopicMakeExcerptCommand extends Command {

  /**
   * 1. 这里是命令行调用的名字, 如这里的: `topic:excerpt`, 
   * 命令行调用的时候就是 `php artisan topic:excerpt`
   *
   * @var string
   */
  protected $name = 'topic:excerpt';

  /**
   * 2. 这里填写命令行的描述, 当执行 `php artisan` 时
   *   可以看得见.
   *
   * @var string
   */
  protected $description = '这里修改为命令行的描述';

  /**
   * Create a new command instance.
   *
   * @return void
   */
  public function __construct()
  {
    parent::__construct();
  }

  /**
   * 3. 这里是放要执行的代码, 如在我这个例子里面,
   *   生成摘要, 并保持.
   *
   * @return mixed
   */
  public function fire()
  {
        $topics = Topic::all();
        $transfer_count = 0;

        foreach ($topics as $topic) {
          if (empty($topic->excerpt))
          {
              $topic->excerpt = Topic::makeExcerpt($topic->body);
              $topic->save();
              $transfer_count++;
          }
        }
        $this->info("Transfer old data count: " . $transfer_count);
        $this->info("It's Done, have a good day.");
  }
}
?>

4. 命令行调用

先查看下是否注册成功, 直接运行:

php artisan

如以下图片:

开始执行命令

执行结果如下图:

搞定 :dancer:

最终的代码以这里为准 TopicMakeExcerptCommand.php


欢迎关注 LaravelTips, 这是一个专注于为 Laravel 开发者服务, 致力于帮助开发者更好的掌握 Laravel 框架, 提升开发效率的微信公众号.

摈弃世俗浮躁,追求技术精湛
本帖已被设为精华帖!
Summer
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 10
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!