在artisan控制台命令中聆听laravel'languate.query'事件

时间:2016-06-06 04:20:44

标签: php laravel laravel-5 laravel-events

我想记录laravel查询。我知道我们可以使用以下代码监听laravel查询:

Event::listen('illuminate.query', function ($query, $bindings, $time, $name) {
    // Log queries
};

我想将上面的代码放在一个artisan命令中,这样我只能在程序运行时监听查询,而不是所有时间。我写了下面的代码。

<?php
// ... namespace and use statements

class QueryListener extends Command
{
    protected $signature = 'pots:query-listen';
    protected $description = 'Runs forever and logs all database queries.';

    public function __construct()
    {
        parent::__construct();
    }

    private function logDatabaseQueries()
    {
        Event::listen('illuminate.query', function ($query, $bindings, $time, $name) {
            Log::info(PHP_EOL.$query.PHP_EOL);
        });
    }

    public function handle()
    {
        $this->logDatabaseQueries();

        echo 'Listening for database queries: Type \'stop\' to stop execution.'.PHP_EOL;
        $stopExecution = false;

        while ($stopExecution === false) {
            $handle = fopen('php://stdin', 'r');
            $line = fgets($handle);

            if (strtolower(trim($line)) === 'stop') {
                fclose($handle);
                echo 'Aborting script.'.PHP_EOL;
                $stopExecution = true;
            }
        }
    }
}

我的期望是,只要我使用artisan运行此命令,logDatabaseQueries()方法就会开始侦听事件。但是这不起作用,因为我从未收到任何查询事件。我在想正确的方向吗?

2 个答案:

答案 0 :(得分:2)

您可以使用以下方式收听数据库查询:

DB::listen(function($query) { 

  // Log this
  \Log::info($query->sql); 


});

答案 1 :(得分:0)

对于那些感兴趣的人 听取照亮问题

// routes web.php
      \Event::listen('illuminate.query', function($sql) {
        var_dump($sql);
        \Log::info($sql);
    });

For More和Advanced Lisen Here