最近想要弄点东西,不想用 laravel 这种框架了,因为想要更细致的了解一些底层框架相关的东西,所以采用了 slim 框架,首先这个框架比较轻便,看源码也比较快捷,当然现在更细以后有很多东西也都不熟悉了,正好可以再次看看。

不过 slim 这个框架因为比较轻便,所以周边也都比较少,我有个需求是定时任务,这个时候 slim 就不支持了,所以得需要自己搞定。

做这个的时候想到了以前看 symfony 的时候有个 console 模块,正好可以用到,google 了一下发现也有人是这么实现的,所以我也就参考着弄了下来。

先从 composer 引入 console

1
composer require symfony/console

接下来我们创建了一个 application.php 的文件,这个文件主要是初始化 symfony/console 的任务,代码类似下面的

1
2
3
4
5
6
7
8
require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/bootstrap.php'; // 这个是初始化 slim

use Symfony\Component\Console\Application;

$application = new Application();
// TODO 这块等待注册各种 Command
$application->run();

上面的代码可以看到有个 bootstrap.php 的引入,这块使我们初始化 slim 用的,代码类似下面的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
if (PHP_SAPI == 'cli') {
    // Instantiate the app
    $settings = require __DIR__ . '/../src/settings.php';

    //I try adding here path_info but this is wrong, I'm sure
//    $settings['environment'] = $env;

    $app = new \Slim\App($settings);

    $container = $app->getContainer();

    // Set up dependencies
    require __DIR__ . '/../src/dependencies.php';
}

上面的初始化我们写在了 PHP_SAPI 是 cli 的情况下,因为在其他情况下我们不想让这个脚本执行,并且我们也可以看到这里面我们仅仅是配置了 container 相关的东西,因为我们不需要让 slim 的 app 运行起来,只需要配置好 container 就可以了。

到这,我们所有的初始化工作就全部做完了,下面我可以搞一个 command 的实例出来,看看前面配置的东西是否 ok ,可以运行起来,具体可以参看 console 的文档 https://symfony.com/doc/current/components/console.html 以及 https://symfony.com/doc/current/console.html 这两个里面有详尽的介绍,代码如下

新建命令文件 TestCommand.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
/**
 * Created by PhpStorm.
 * User: haoliang
 * Date: 2019-02-12
 * Time: 15:12
 */

namespace App\Command;


use Psr\Container\ContainerInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class TestCommand extends Command
{
    // the name of the command (the part after "bin/console")
    protected static $defaultName = 'test:slim-command';
    private $container;

    public function __construct(ContainerInterface $container, $name = null)
    {
        parent::__construct($name);
        $this->container = $container;
    }

    protected function configure()
    {
        $this->setDescription('测试 slim 和 symfony console 结合情况');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        // ...
        $output->writeln([
            'symfony console 的输出跑起来了',
        ]);

        $logger = $this->container->get('logger');
        $logger->info("slim 的日志也跑起来了");
    }
}

上面就是我们的命令我文件,需要注意的是,我们重写了 __contruct 方法,这里面我们把 slim 的 container 注入进来了,方便我们后续使用。

这个文件写完了之后我们可以在 application.php 里面注册命令

1
$application->add(new TestCommand($app->getContainer()));

然后我们就可以在控制台执行命令了,

1
php console/application.php test:slim-command

图片alt

再看,我们用 slim container 里面设置的 log 是不是生效了, 图片alt

可以看到 slim 里面设置的 log 也都 ok 了,至此,所有的东西都可以搞定了,接下来我们就可以在 crontab 里面使用这些命令了。