Where should I log visited urls?

2 years ago

netteman
Member | 59
+
0
-

Hi,

I'd like to log visited urls in the base presenter.

Should I do this in __construct, beforeRender or startup ?

Thank you :)

2 years ago

srigi
Member | 553
+
0
-

Try intercepting a request:

// bootstrap.php
// ...
$container = $configurator->createContainer();

$logHandler = $container->getByType(App\Services\LogHandler::class);
$application = $container->getByType(Nette\Application\Application::class);
$application->onRequest[] = [$logHandler, 'request'];
$application->onError[] = [$logHandler, 'error'];

return $container;
<?php

namespace App\Services;

use App\Routing\RouterFactory;
use Exception;
use Nette\Application;
use Nette\Application\Application as NApplication;
use Nette\Http;


class LogHandler
{
    /** @var Http\Request */
    private $httpRequest;


    /**
     * @param Http\Request $httpRequest
     */
    public function __construct(Http\Request $httpRequest)
    {
        $this->httpRequest = $httpRequest;
    }


    /**
     * @param NApplication $application
     * @param Application\Request $request
     */
    public function request(NApplication $application, Application\Request $request)
    {
        $requestPresenter = explode(':', $request->getPresenterName());
        $requestModule = $requestPresenter[0];
        // ... your logging code
    }


    public function error(NApplication $application, Exception $e)
    {
        $request = $application->getRouter()->match($this->httpRequest);
        $this->request($application, $request);
    }
}

Don't forget to register log service in config.neon

Last edited by srigi (2017-03-05 20:32)

2 years ago

netteman
Member | 59
+
0
-

Wow, thanks for your code :) Looks like some study time for me ahead :)

Just a question – isn't this code theoretically faster than intercepting a request?

abstract class BasePresenter extends \Nette\Application\UI\Presenter
{
    public $db;
    public $httpRequest;

    public function __construct(\Nette\Database\Context $database, \Nette\Http\Request $httpRequest){
        $this->db = $database;
        $this->httpRequest = $httpRequest;

        $this->db->table("log")
                ->insert(array(
                    "url" => $this->httpRequest->getUrl(),
                ));

    }//end construct