CakePHP 3.2:如何处理shell

时间:2016-02-16 13:33:36

标签: cakephp

假设我的CakePHP APP中有一个实用程序类。很简单,这个实用程序允许我执行一些任务 该实用程序可能会像任何其他类一样生成一些异常。

现在我正在创建一个shell,这个shell也使用这个实用程序 然后使用shell,可以生成异常。 在我的终端中,这些异常与应用程序布局一起显示。

所以我的问题是:我如何正确处理这些例外?
在shell中我应该实现一些早期发生的构造,并避免使用此实用程序可能会抛出异常吗?

实际例子:
我的实用程序允许您创建数据库备份。我希望它是一个实用程序,因为它可以在多个上下文中使用,例如也可以在控制器中使用(在应用程序的管理面板中,您可以执行数据库备份)。 在许多其他方面,该实用程序会检查您创建备份的目录是否可写,以及它是否不会抛出异常。
现在,如果我在shell中使用该实用程序,并且如果我尝试在不可写目录中创建备份,则抛出此异常。

这是对的吗?也许在shell中我应该在使用该实用程序之前检查目录是否可写,然后我应该使用Cake\Console\Shell::abort()方法?但是,通过这种方式,我将不得不两次实现相同的代码。

感谢。

修改

一些 愚蠢的 代码示例,只是为了让您了解我在说什么。

class MyUtility {
    public function create($filename, $data) {
        if(!is_writable(dirname($filename)))
            throw new InternalErrorException(__('File or directory `{0}` not writeable', dirname($filename)));

        return file_put_contents($filename, $data);
    }
}

class MyStupidShell extends Shell {
    public function main() {
        if($this->param('filename') && $this->param('data')) {
            $this->out(__('Ok, I will create the file {0}', $this->param('filename')));
            MyUtility::create($this->param('filename'), $this->param('data'));
        }
    }
}

$ bin/cake MyStupid --filename /not/writable/directory/myfile.txt --data "hello world"

1 个答案:

答案 0 :(得分:0)

正如@ndm所建议的那样:

class MyUtility {
    public function create($filename, $data) {
        if(!is_writable(dirname($filename)))
            throw new InternalErrorException(__('File or directory `{0}` not writeable', dirname($filename)));

        return file_put_contents($filename, $data);
    }
}

class MyStupidShell extends Shell {
    public function main() {
        if($this->param('filename') && $this->param('data')) {
            try {
                $this->out(__('Ok, I will create the file {0}', $this->param('filename')));
                MyUtility::create($this->param('filename'), $this->param('data'));
            }
            catch(InternalErrorException $e) {
                $this->abort($e->getMessage());
            }
        }
    }
}

$ bin/cake MyStupid --filename /not/writable/directory/myfile.txt --data "hello world"