2013-01-15 42 views
0

我們正在使用zend框架2爲一個新的應用程序,我想有相同的日誌系統的Rails或類似的,我想每個請求有一個日誌,有可能做到這一點在Zend ?記錄每個請求在ZF2

+0

爲什麼不使用Apache的訪問日誌? – hohner

回答

5

它取決於什麼你想記錄。如果它只是一個訪問日誌,你應該嘗試使用Web服務器的日誌。來自Apache/nginx/IIS等的日誌表現比您在ZF2應用中獲得的更好。

如果您需要登錄ZF2應用程序,您有兩種選擇。第一個選項是bootstrap。這是您可以使用的最早的選項之一,所以可能是最好的選擇。不過,你也可以看看routedispatch。這兩個事件在應用程序的「運行」階段被調用。通過這些事件,例如可以使用路徑匹配,因此如果您的請求與任何控制器匹配(或者如果您沒有匹配,則爲404),您就知道(或不知道)。

一些例子。假設您在logger密鑰下的ServiceManager中配置了一個記錄器。然後記錄在bootstrap

namespace Application; 

class Module 
{ 
    public function onBootstrap($e) 
    { 
    $app = $e->getApplication(); 
    $sm = $app->getServiceManager(); 

    $logger = $sm->get('logger'); 
    $logger->debug('Log here!'); 
    } 
} 

或者例如,如果您等待route,您可以將偵聽器route事件:

namespace Application; 

use Zend\Mvc\MvcEvent; 
use Zend\Mvc\Router\RouteMatch; 

class Module 
{ 
    public function onBootstrap($e) 
    { 
    $app = $e->getApplication(); 
    $em = $app->getEventManager(); 
    $sm = $app->getServiceManager(); 

    $logger = $sm->get('logger'); 
    $em->attach(MvcEvent::EVENT_ROUTE, function($e) use ($logger) { 
     $match = $e->getRouteMatch(); 

     // No route, this is a 404 
     if (!$match instanceof RouteMatch) { 
     return; 
     } 

     $logger->debug(sprintf(
     'Route event with route %s', 
     $match->getMatchedRouteName() 
    )); 
    }); 
    } 
} 
+0

像往常一樣,真棒,真棒。 ;-) –

2

聽起來像您可以將聽衆附加到Zend\Mvc\Application上的dispatch事件。

作爲參考,羅布艾倫創建了一個便利的清單ZF2 events

+0

真棒列表,謝謝你的鏈接! –