How to get the current console command in Laravel

∥☆過路亽.° 提交于 2019-12-23 12:38:25

问题


I can see if a script is running in the console with the App::runningInConsole() command, but I would like to know (for audit logging purposes) which command has been run from console.

To add some context - I need to log whenever a system or user accesses a certain type of data. For users, that's pretty simple - I can use Auth::user() and get their IP address from Request, but for console commands, it's a little more difficult.

I can figure out if a console command is running, which is good, but I need to be able to record which console command is running.


回答1:


I do not see a way to get that information directly Laravel. I'm also not sure how that would be possible, as you can have one command executing other commands or even creating a new application instance like some test tools do.

There is however a way to achieve that using plain PHP. You can check the server/environment variables to identify how application was executed.

Have a look at

dd($_SERVER['argv']);

If you run a command this should give you the command name in $_SERVER['argv'][1]

You can find more information here: http://php.net/manual/en/reserved.variables.argv.php




回答2:


To get console command together with arguments you should use something like that:

$command = \Request::server('argv', null);
if (is_array($command)) {
   $command = implode(' ', $command);
}

In Laravel you can use \Request:server to get $_SERVER variables.




回答3:


The problem with $SERVER['arg'] is that it doesnt work when you execute the command on the GUI.

I fixed the problem adding the next code on the command.

private function getAttributes() 
{
    $arguments = $this->arguments();
    unset($arguments[0]);
    $arguments = collect($arguments)->implode(' ');
    $options = collect($this->options())->filter(function($item) {
        return $item;
    })->map(function($item, $key) {
        $return = '--'.$key;
        if($item!==true) {
            $return .= '='.$item;
        }
        return $return;
    })->implode(' ');
    return $arguments.' '.$options;
}

and you get it calling $this->getAttributes() and you will get all the command with the attributes



来源:https://stackoverflow.com/questions/31994132/how-to-get-the-current-console-command-in-laravel

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!