Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 清理控制台命令帮助输出_Php_Laravel - Fatal编程技术网

Php 清理控制台命令帮助输出

Php 清理控制台命令帮助输出,php,laravel,Php,Laravel,我的应用程序中有很多用于维护任务的laravel控制台命令,在绝大多数情况下,“帮助”对话框中提供的默认选项很少是我的用例所需要和支持的。典型的帮助输出如下所示: Description: Do stuff Usage: myapp:mycommand Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --

我的应用程序中有很多用于维护任务的laravel控制台命令,在绝大多数情况下,“帮助”对话框中提供的默认选项很少是我的用例所需要和支持的。典型的帮助输出如下所示:

Description:
  Do stuff

Usage:
  myapp:mycommand

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
      --env[=ENV]       The environment the command should run under
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

我不喜欢向用户展示我无意支持的选项,因此我想在
--help
文本中省略一系列选项来清理显示的信息。例如,
--no interaction
--no ansi
--ansi
--verbose
标志等等。到目前为止,我还找不到任何优雅的(laravel)方法来做到这一点。有什么建议吗?

打开您的
app\Console\Kernel.php
文件,该文件是laravel安装的标准文件。它扩展了
illumb\Foundation\Console\Kernel

现在,您可以使用以下代码覆盖构造函数:

//定义一个属性,其中键是命令名和值
//是具有允许您传递的选项的数组。
受保护的$optionFilters=[
“我的命令名”=>[
“用户”,
“生的”,
]
];
公共函数构造(应用程序$app,调度程序$events)
{
父项::_构造($app,$events);
$commands=$this->getArtisan()->all();
foreach($commands作为$command){
//现在我们只需循环所有注册的命令,看看是否应该
//应用过滤器。
如果($filter=array\u get($this->optionFilters,$command->getName()){
$options=array\u过滤器(
$command->getDefinition()->getOptions(),
函数(\Symfony\Component\Console\Input\InputOption$选项)使用($filter){
返回数组($option->getName(),$filter);
});
//为命令设置新选项。
$command->getDefinition()->setOptions($options);
}
}
}
现在,如果您之前定义了如下命令:

protected$signature='my命令名{--user}{--raw}{--type}';
运行上述循环会从命令中省略
{--type}

不过,当从Laravel自己的artisan命令中删除选项时,我确实注意到了一些副作用(例如
php artisan help
命令,当我删除
--format
选项时,该命令引发了一些错误)。所以你得检查一下

还有一个
getArguments()
setArguments()
可以用来省略参数,例如
{user?}
{user=foo}
(在命令定义中,选项以
--
开头,参数不起作用)


我还没有考虑允许artisan脚本访问用户。我认为您必须扩展一些命令并以这种方式修改它们。为了澄清,我指的是那些与这些应用程序分担管理职责的同事。大多数有问题的应用程序处理系统之间的各种集成,以及在“用户”访问系统时(在您所想的意义上),它是作为API请求完成的,并且都通过laravel控制器运行。这些选项是从类
Symfony\Component\Console\Application
getDefaultInputDefinition
方法填充的,该方法在类
illighted\Console\Application
中由相同的方法调用。。我认为您必须扩展其中一个类,并以某种方式让artisan的内核使用新类。。。不过我强烈不推荐这个,因为它非常黑客。谢谢你的信息,Helioarch。正如您所注意到的,我希望找到一个优雅的解决方案,如果不存在,那么我只能忍受杂乱无章的帮助输出以及与命令无关的选项。