2017-03-02 42 views
1

我想了Zend的表現,這是我config/autoload/zend-expressive.global.php,當我試圖做一個路徑的請求,將去它返回錯誤頁面的動作類,但我看不到在Apache錯誤日誌中的任何PHP錯誤。所以我不知道有什麼問題。Zend的表現 - PHP錯誤報告

是否有Zend的,表現有那些PHP錯誤日誌的方法嗎?還有任何良好的文檔zend表達?看來官方文檔並沒有太多的例子。

return [ 
    'debug' => true,  
    'config_cache_enabled' => false, 
    'zend-expressive' => [ 
     'error_handler' => [ 
      'template_404' => 'error::404', 
      'template_error' => 'error::error', 
     ], 
    ], 
]; 
+0

Zend Expressive v2.0已於3月7日發佈,錯誤處理選項在該版本中稍有改動和改進。這裏是[最新文檔]的鏈接(https://zend-expressive.readthedocs.io/en/latest/features/error-handling/)。 – edigu

+0

嗨。我正在使用它來安裝。 https://docs.zendframework.com/zend-expressive/getting-started/skeleton/因此,如果我再次刪除所有內容並執行作曲家安裝,那麼我將獲得最新版本? – sparkmix

回答

2

如果你想嘗試表達,我建議使用骨架安裝程序。它給你選擇要安裝的選項。其中一個選項是whoops錯誤處理程序,它提供了關於異常的大量詳細信息。

官方文檔是在這裏有大量的信息:https://docs.zendframework.com/zend-expressive/

安裝程序文檔:https://docs.zendframework.com/zend-expressive/getting-started/skeleton/

更新:添加ErrorHandler記錄例如

至於你的ErrorHandler可以使用基地Zend\Stratigility\Middleware\ErrorHandler。您可以將listener附加到該ErrorHandler並將其用於日誌記錄。或者,您可以複製該課程並將其修改爲您的需要。

下一步就是爲它創造一個ErrorHandlerFactory:

<?php 
// src/Factory/ErrorHandler/ErrorHandlerFactory.php 

namespace App\Factory\ErrorHandler; 

use Interop\Container\ContainerInterface; 
use Psr\Http\Message\RequestInterface; 
use Psr\Http\Message\ResponseInterface; 
use Psr\Log\LoggerInterface; 
use Throwable; 
use Zend\Diactoros\Response; 
use Zend\Expressive\Middleware\ErrorResponseGenerator; 
use Zend\Stratigility\Middleware\ErrorHandler; 

class ErrorHandlerFactory 
{ 
    public function __invoke(ContainerInterface $container) 
    { 
     $generator = $container->has(ErrorResponseGenerator::class) 
      ? $container->get(ErrorResponseGenerator::class) 
      : null; 

     $errorHandler = new ErrorHandler(new Response(), $generator); 

     if ($container->has(LoggerInterface::class)) { 
      $logger = $container->get(LoggerInterface::class); 
      $errorHandler->attachListener(function (
       Throwable $throwable, 
       RequestInterface $request, 
       ResponseInterface $response 
      ) use ($logger) { 
       $logger->error('"{method} {uri}": {message} in {file}:{line}', [ 
        'date' => date('Y-m-d H:i:s'), 
        'method' => $request->getMethod(), 
        'uri'  => (string) $request->getUri(), 
        'message' => $throwable->getMessage(), 
        'file' => $throwable->getFile(), 
        'line' => $throwable->getLine(), 
       ]); 
      }); 
     } 

     return $errorHandler; 
    } 
} 

之後,你需要註冊的ErrorHandler。您可以將其添加到config/autoload/middleware-pipeline.global.php,特別是在middleware => always部分。這樣它會一直運行。如果您將它註冊爲第一個,它將在其他任何事情之前運行。

<?php 
// in config/autoload/middleware-pipeline.global.php 

use Acme\Container\ErrorHandlerFactory; 
use Zend\Stratigility\Middleware\ErrorHandler; 

return [ 
    'dependencies' => [ 
     /* ... */ 
     'factories' => [ 
      ErrorHandler::class => ErrorHandlerFactory::class, 
      /* ... */ 
     ], 
     /* ... */ 
    ], 
    'middleware_pipeline' => [ 
     'always' => [ 
      'middleware' => [ 
       ErrorHandler::class, 
       /* ... */ 
      ], 
      'priority' => 10000, 
     ], 
     /* ... */ 
    ], 
]; 
+0

有沒有辦法只顯示這些PHP錯誤,而不是/旁邊顯示錯誤頁面?看起來這些whoops錯誤處理程序要求您在代碼中添加代碼或拋出異常。我只想看看那些php錯誤,比如它有500個內部錯誤和細節。 – sparkmix

+0

好吧,我現在明白了。謝謝。我發現這一點,因爲我沒有啓用哎呀。 http://www.masterzendframework.com/whoops-errorhandler/ – sparkmix

+0

該錯誤處理程序僅適用於本地的/ dev,我不知道是否有一種方法,使PHP的錯誤在Apache的錯誤日誌中生產報告?這隻對開發有幫助,但在生產中我看不到任何細節錯誤。 – sparkmix