閱讀大量的源代碼,並獲得了XDebug到最後我工作後figuered出來:
BrowserConsoleHandler
發送由register_shutdown_function()
完成PHP腳本後剪斷的腳本。目前,Laravel已經向瀏覽器發送了完整的響應。因此從BrowseConsoleHandler
截取的腳本被生成,但從未發送到瀏覽器。
作爲解決方法,您可以構建自己的Middleware
(http://laravel.com/docs/5.0/middleware),手動調用代碼生成並在發送之前將其添加到響應中。
創建應用程序/ HTTP /中間件/ LogBrowserConsole.php:
<?php
namespace App\Http\Middleware;
use Illuminate\Contracts\Routing\Middleware;
use Illuminate\Support\Facades\Log;
use Monolog\Handler\BrowserConsoleHandler;
class LogBrowserConsole implements Middleware {
public function handle($request, \Closure $next)
{
// add BrowserConsoleHandler to Laravel's Logger
$log = Log::getMonolog();
$log->pushHandler(new BrowserConsoleHandler(\Psr\Log\LogLevel::INFO));
// invokes all your stuff like it would do without the middleware but with the new logger
$response = $next($request);
// after the request is done we care about the log entries
$handlers = $log->getHandlers();
$scriptSnippet = "";
foreach($handlers as $handler){ // only handle BrowserConsoleHandler
if($handler instanceof BrowserConsoleHandler){
ob_start(); //start output buffer so we can save echo to variable
$handler->send(); // create the scriptSnipped
$scriptSnippet .= ob_get_clean();
}
}
// write scriptSnippet to end of response content
$content = $response->getContent();
$response->setContent($content.$scriptSnippet);
return $response;
}
}
註冊了中間件,應用/HTTP/Kernel.php:
protected $routeMiddleware = [
'log.browserconsole' => 'App\Http\Middleware\LogBrowserConsole'
];
,並調用你的控制器中間件app/Http/routes.php:
Route::get('test', ['middleware' => 'log.browserconsole', 'uses'=>'[email protected]']);
另外,如果你想使用Middleware
爲每一個請求,你可以在應用程序/ HTTP/Kernel.php它添加到
protected $middleware = [
'App\Http\Middleware\LogBrowserConsole'
];
。
路線會是什麼樣子Route::get('test', '[email protected]');
現在,您Log::debug()
等。消息會發送到日誌文件(默認的LogHandler仍然可用,您只需添加另一個),並從BrowserConsoleHandler
中截取的腳本被構建併發送到瀏覽器並顯示所有日誌項。
請記住最終更改日誌級別\Psr\LogLevel::INFO
app/Http/Middleware/LogBrowserConsole以適合您的需求。
這個獨立文件在哪裏?它是如何被加載的? – treeface 2015-04-08 17:35:44