Název modulu v ErrorPresenteru

Terka04
Člen | 44
+
0
-

Dobrý den,
jak prosím zjistit název modulu v ErrorPresenteru? Chci rozdělit .latte chybových hlášek zvlášť pro frontModule a pro backModulu.

common.neon

application:
	errorPresenter: Error
	mapping:
		*: App\Presenters\*Module\*Presenter

Moduly se jmenují „BackModule“ a „FrontModule“.

RouterFactory.php

/** Admin**/
        $router[] = $admin = new RouteList('Back');
        $admin->addRoute('admin/<presenter>/<action>[/<id>]', 'Homepage:default');

        /** Front **/
        $router[] = $front = new RouteList('Front');
        $front->addRoute('<presenter>/<action>[/<id>]', 'Homepage:default');

ErrorPresenter.php

declare(strict_types=1);

namespace App\Presenters;

use Nette;
use Nette\Application\Responses;
use Nette\Http;
use Tracy\ILogger;

final class ErrorPresenter implements Nette\Application\IPresenter
{
    use Nette\SmartObject;

    /** @var ILogger */
    private $logger;

    public function __construct(ILogger $logger)
    {
        $this->logger = $logger;
    }

    public function run(Nette\Application\Request $request): Nette\Application\Response
    {
        $exception = $request->getParameter('exception');

        if ($exception instanceof Nette\Application\BadRequestException) {
                [$module, , $sep] = Nette\Application\Helpers::splitName($request->getPresenterName());
                return new Responses\ForwardResponse($request->setPresenterName($module . $sep . 'Error4xx'));
        }

        $this->logger->log($exception, ILogger::EXCEPTION);
    }
}

Tento řádek nereaguje jak by měl. $request->getPresenterName() mi vrátí „Error“ jako název ErrorPresenteru, a tím bude $module prázdné, taktéž i $sep.

[$module, , $sep] = Nette\Application\Helpers::splitName($request->getPresenterName());

Očekávala bych, že mi to při adrese www.domena.tld/neexistujici vrátí $module=„Front:“; a při www.domena.tld/…neexistujici $module=„Back:“;

Děkuji všem za pomoc. :)

Editoval Terka04 (17. 2. 2022 14:29)

Marek Bartoš
Nette Blogger | 1165
+
0
-

Problém je, že url http://www.domena.tld/admin/neexistujici nematchne žádná routa a tedy ani presenter, takže request ti název presenteru z administrace vrátit nemůže. Jen když se matchne routa a vyhodíš BadRequestException v presenteru, tak budeš mít název presenteru v requestu dostupný.

Můžeš to vyřešit tak, že budeš mít jako poslední pro administraci routu, která matchne vše a pošle tě na administrační presenter, co tu výjimku vyhodí

$admin->addRoute('admin/<path .+>', 'ThrowError:default');

Editoval Marek Bartoš (17. 2. 2022 15:14)