iyank4 / l4shell
L4shell 的另一个分支 - 为 Laravel 4.* 添加 shell 命令包装器
Requires
- php: >=5.4.0
- illuminate/support: 4.2.x
Requires (Dev)
- mockery/mockery: dev-master
- orchestra/testbench: 2.0.*
This package is not auto-updated.
Last update: 2024-09-24 02:13:43 UTC
README
这个 Laravel 4 包是 shell 命令包装器类(exec)的另一个分支。它允许你在应用中添加 exec() 命令而不丢失编写单元测试的能力。该包提供了一个 Facade,因此使用 Mockery 进行测试变得非常简单。
此包在 Windows 系统上无法工作。
新增功能
此分支仅简单添加了 runBackground() 方法。请谨慎使用,这可能不适合你。
安装
简单使用 composer
$ php composer.phar require iyank4/l4shell:1.2.2
或将需求手动添加到 composer.json 文件中
"require": {
"iyank4/l4shell": "1.2.2"
}
包成功加载后,您必须将其添加到 Service Providers 数组中
// app/config/app.php 'providers' => array( ... 'Netson\L4shell\L4shellServiceProvider', );
Service Provider 会自动注册别名,但如果你想知道,这就是它
'L4shell' => 'Netson\L4shell\Facades\Command'
用法
此包会转义整个命令(使用 escapeshellcmd())和每个单独的参数(使用 escapdeshellarg())。几乎所有方法都允许对象链式调用,以便于设置。
初始化一个新的命令
这可以通过在 Service Provider 中注册的快捷方式完成
$command = L4shell::get();
或者通过手动创建一个新的对象
$command = new \Netson\L4shell\Command("command", array("arg1", "arg2"));
使用 get() 方法将初始化一个空命令对象,并需要在执行命令之前使用 setCommand() 和 setArguments() 方法(可选)。
示例命令:不带参数
$command = L4shell::get(); $result = $command->setCommand('hostname')->execute();
如果命令执行成功,将返回命令的输出。如果命令无法执行,将抛出异常,包括命令的错误信息(除使用 sendToDevNull() 方法外;见下文)。
示例命令:带参数
添加参数时,请确保添加正确数量的占位符(sprintf 格式),否则将抛出异常。
$command = L4shell::get(); $result = $command->setCommand('hostname %s')->setArguments(array("-s"))->execute();
默认情况下,当您调用 setArguments() 方法时,将替换任何现有的参数,以避免在一系列连续命令中堆叠参数。但是,如果您想分几个步骤添加它们,可以向方法传递第二个(可选)布尔参数
$command = L4shell::get(); $command->setCommand('ls %s %s')->setArguments(array("-a")); // do something else ... $command->setArguments(array("-l"), true); // add the optional second argument to keep existing arguments $result = $command->execute();
如果您想手动清除任何现有的参数,请使用以下方法
$command = L4shell::get(); $command->clearArguments();
示例命令:将输出发送到 /dev/null
该包有一个简单的方法可以将命令的输出发送到 /dev/null,因为您可能只对退出状态感兴趣,而不是输出文本。将输出发送到 /dev/null 将使任何输出消息无用,但当然退出代码仍然可用,当发生错误时将抛出异常。
$command = L4shell::get(); $result = $command->setCommand("hostname")->sendToDevNull()->execute(); // will return exit code (0), but no output message
示例命令:启用所有命令的日志记录
L4shell 允许您轻松地将对 shell 命令的所有调用记录到默认的 Laravel 日志。默认情况下,日志记录是 启用的。日志记录使用默认的 Laravel 4 日志包(Monolog)。
对于每个成功的命令,将出现 3 或 4 行日志,具体取决于是否设置了参数
- 设置命令 ...
- 设置参数 ...(可选)
- 执行命令 ...
- 命令成功执行
要禁用日志记录,发布包配置文件
$ php artisan config:publish iyank4/l4shell
然后更改 app/config/packages/iyank4/l4shell/config.php
文件中的 enable_logging
选项。
或者,您可以在运行时更改日志设置
$command = L4shell::get(); $result = $command->setLogging(true)->setCommand("hostname")->execute();
设置和取消执行路径
如果您希望从特定目录中执行您的命令,可以使用以下方法
$command = L4shell::get(); $result = $command->setExecutionPath("/path/to/your/folder")->setCommand("ls")->execute();
执行路径是一个静态变量,在这种情况下意味着如果只设置一次执行路径,将影响之后执行的所有命令。
注意: 在执行命令之前更改执行路径,并在命令执行后将其改回原始设置。这样您就不必记住恢复工作目录,也不会干扰此命令之后运行的任何脚本。
如果您想取消执行路径,只需调用该方法而不带任何参数
$command = L4shell::get(); $result = $command->setExecutionPath()->setCommand("ls")->execute();
设置和取消可执行路径
如果包含您的可执行文件的文件夹不在执行该命令的用户路径中,可以使用以下方法
$command = L4shell::get(); $result = $command->setExecutablePath("/usr/bin")->setCommand("ls")->execute();
这将有效地将您的命令从简单的 $ ls
改为 $ /usr/bin/ls
。这同样是一个静态变量,意味着设置将跨命令持续存在。
如果您想取消可执行路径(例如,要从本地目录运行命令),只需调用该方法而不带任何参数
$command = L4shell::get(); $result = $command->setExecutablePath()->setCommand("ls")->execute();
防止某些字符被转义
当您有一个特定的需要使用通常会被 escapeshellcmd()
或 escapeshellarg()
函数转义的字符的 shell 命令时,可以使用 setAllowedCharacters()
方法。此方法接受一个数组,其中包含不会被 L4shell 转义的字符
$command = L4shell::setCommand('find ./ -maxdepth 1 -name %s')->setArguments(array("*.txt"))->setAllowedCharacters(array("*")); // returned with allowed characters: find ./ -maxdepth 1 -name '*.txt' // returned without allowed characters: find ./ -maxdepth 1 -name '\*.txt'
由于此方法完全绕过了潜在危险字符的转义,因此请务必谨慎使用此方法!!
单元测试
在使用 L4shell 时,对模块/包进行单元测试很容易。只需在测试中使用 Mockery 风格的调用即可
public function testSomething () { L4shell::shouldReceive('get')->once(); L4shell::shouldReceive('execute')->once()->andReturn("your message"); } public function tearDown () { \Mockery::close(); }
有关使用 Laravel 4 进行单元测试的更多信息,请参阅以下文档