Název modulu v ErrorPresenteru
- Terka04
- Člen | 44
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 | 1280
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)