Mapping presenterů načítání z více složek
- dvorka47
- Člen | 12
Ahoj,
snažím se udělat administraci která má společné presentery která mám ve
složce vendor jako composer balíček. Ale zároveň bych pro ten modul chtěl
načítat i presentery které jsou v AdminModule který je v app. Neřešil
někdo tento problém?
Mapping vypadá takto.
application:
debugger: true
errorPresenter: Error
scanDirs:
- %appDir%/../vendor/SimpleCMS/Admin
mapping:
Admin: SimpleCMSAdmin\Presenters\*Presenter
*: App\Presenters\*Presenter
Děkuji za každou radu.
- Petr Parolek
- Člen | 455
Ahoj, takhle to podle mě nepůjde, musíš přes DI extension. Nedávno jsem to tu řešil.
- Petr Parolek
- Člen | 455
https://github.com/…istry/router#… tady jsem popsal, jak na to, pokud bys chtěl mít i vlastní routy, doporučuju nainstalovat celou zmíněnou extension
Editoval ppar (5. 1. 2019 15:59)
- Petr Parolek
- Člen | 455
Moc ti nerozumím, ale napíšu ti jednoduchý příklad, jak jsem nedávno vymyslel:
dáš composer require webchemistry/router
a potom
app/config.neon
...
application:
errorPresenter: Error
mapping:
*: App\*Module\Presenters\*Presenter
...
extensions:
...
routers: WebChemistry\Routing\DI\RouterExtension
- GuestbookExtension
...
routers:
modules:
- Guestbook
...
- App
routers:
- App\MainRouter
...
tvá extension:
<?php
namespace CMS\Guestbook\DI;
use Nette\Application\IPresenterFactory;
use Nette\DI\CompilerExtension;
class GuestbookExtension extends CompilerExtension
{
public function loadConfiguration()
{
$builder = $this->getContainerBuilder();
$config = $this->loadFromFile(__DIR__ . '/services.neon'); //např. továrny na formuláře, modely atd.
$this->compiler->loadDefinitions(
$builder,
$config['services'],
$this->name
);
}
public function beforeCompile()
{
$builder = $this->getContainerBuilder();
$builder->getDefinition($builder->getByType(IPresenterFactory::class))
->addSetup(
'setMapping',
[['Guestbook' => 'CMS\Guestbook\Presenters\*Presenter']]
);
}
}
?>
Presenter v extension:
<?php
namespace CMS\Guestbook\Presenters;
use Nette;
class DefaultPresenter extends Nette\Application\UI\Presenter
{
...
public function renderDefault() {
...
}
...
}
?>
Editoval ppar (5. 1. 2019 19:12)
- dvorka47
- Člen | 12
@ppar Nakonec jsem to vyřešil pomocí librette/presenter-factory. A teď to funkuje přesně jak jsem chtěl.
Config:
extensions:
presenterFactory: Librette\Application\PresenterFactory\DI\PresenterFactoryExtension
presenterFactory:
mapping:
Admin:
- CMS\Presenters\*Presenter
- App\AdminModule\Presenters\*Presenter
*: App\Presenters\*Presenter
Ale děkuji za tvou radu.