Routování na modulů v adresáři presenters
- gonner47
- Člen | 27
Ahoj, chci si v vytvořit modulovou aplikaci a ztroskotal jsem na jedné chybě:
include(/var/www/sandbox-admin/App/Presenters/Base/BasePresenter.php): failed to open stream: No such file or directory
Adresářová struktůra aplikace vypadá takto:
-App
--Config
--Presenters
---AdminModule
----Base
-----template
------default.latte
-----BasePresenter.php
----Homepage
-----template
------default.latte
-----HopepagePresenter.php
---FrontModule
----Base
-----template
------default.latte
-----BasePresenter.php
----Homepage
-----template
------default.latte
-----HopepagePresenter.php
--Router
Pokud tuto chybu přeskočím objeví se nová která se týká routování a já nevím kde by mohla bát chyba:
Nette\Application\BadRequestException #404
Cannot load presenter ‚Homepage‘, class ‚HomepagePresenter‘ was not found.
Router:
public static function createRouter() {
$router = new RouteList();
$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
return $router;
}
a v configu mám takto nastavený mapping:
mapping:
*: App\Presenters\*Module\*Presenter
Díky moc za každou odpověď.
- gonner47
- Člen | 27
BasePresenter.php
<?php
namespace App\Presenters\FrontModule;
use Kdyby\Autowired\AutowireComponentFactories;
use Kdyby\Autowired\AutowireProperties;
use Nette;
use WebLoader\Nette\LoaderFactory;
/**
* Base presenter for all application presenters in frontend.
*/
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
use AutowireComponentFactories, AutowireProperties;
/** @var LoaderFactory @inject */
public $webLoader;
public function formatLayoutTemplateFiles()
{
$list = parent::formatLayoutTemplateFiles();
$list[] = __DIR__ . '/templates/' . basename($list[0]);
return $list;
}
public function formatTemplateFiles()
{
$list = parent::formatTemplateFiles();
$list[] = dirname($this->getReflection()->getFileName()) . "/templates/$this->view.latte";
return $list;
}
protected function createComponentCss()
{
return $this->webLoader->createCssLoader('default');
}
protected function createComponentJs()
{
$defaultCompiler = $this->context->getService('webloader.jsDefaultCompiler');
$defaultCompiler->addFilter(function ($js) {
return \JShrink\Minifier::minify($js);
});
return $this->webLoader->createJavaScriptLoader('default');
}
}
HomepagePresenter.php
<?php
namespace App\Presenters\FrontModule;
use Nette;
/**
* Homepage presenter.
*/
class HomepagePresenter extends BasePresenter
{
public function renderDefault()
{
$this->template->anyVariable = 'any value';
}
}
Nemůže být chyba třeba v namespace?
- blaztar
- Člen | 93
Namespace vypadá v pořádku, ale v routeru nepracuješ s modulama.
Zkus:
public static function createRouter() {
$router = $front = new RouteList('FrontModule');
$front[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
return $router;
}
Editoval blaztar (30. 8. 2015 15:15)
- gonner47
- Člen | 27
Zkusil jsem přesně to co jsi psal a chyba je:
Nette\Application\BadRequestException #404
Cannot load presenter ‚Front:Homepage‘, class ‚App\Presenters\FrontModule\HomepagePresenter‘ was not found.
Nějak my tam v tý cestě chybí Homepage je.
Mělo by to vypadat takto ne?
App\Presenters\FrontModule\Homepage\HomepagePresenter
- gonner47
- Člen | 27
Celý můj router vypadá takto:
<?php
namespace App;
use Nette\Application\Routers\Route;
use Nette\Application\Routers\RouteList;
/**
* Router factory.
*/
class RouterFactory
{
/**
* @return \Nette\Application\IRouter
*/
public static function createRouter() {
$router = $front = new RouteList('Front');
$front[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
return $router;
}
}
Upravi jsem jen v RouteList z FrontModule je na Front.
Editoval gonner47 (30. 8. 2015 22:12)
- David Matějka
- Moderator | 6445
Mělo by to vypadat takto ne?
App\Presenters\FrontModule\Homepage\HomepagePresenter
ne, slozka !== namespace. Ten zformatovany nazev odpovida tomu, co si posilal vyse. Mas nastaveny robot loader (najdes v bootstrap) aby indexoval tu app slozku?
- gonner47
- Člen | 27
Přidal jsem do bootstrapu robotloader a front funguje v pohodě, teď si
ale nejsem jistý jestli správně routuji admin modul protože když chci do
admin modulu tak vy vyskočí chyba:
Nette\Application\BadRequestException #404
Cannot load presenter ‚Front:Admin‘, class ‚App\Presenters\FrontModule\AdminPresenter‘ was not found.
Můj router vypadá takto:
public static function createRouter() {
$router = $admin = new RouteList('Admin');
$admin[] = new Route('admin/<presenter>/<action>[/<id>]', 'Homepage:default');
$router = $front = new RouteList('Front');
$front[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
return $router;
}
a namespace v presenterech mám:
namespace App\Presenters\AdminModule;
Edit:
a občas mi vyskočí stále chyba:
Warning
include(/var/www/sandbox-admin/App/Presenters/Base/BasePresenter.php): failed to open stream: No such file or directory
Editoval gonner47 (31. 8. 2015 17:22)
- David Matějka
- Moderator | 6445
Vytvor si router bez modulu, do ktereho pak pridas routery pro front a admin
$router = new RouteList();
$router[] = $admin = new RouteList('Admin');
$admin[] = new Route('admin/<presenter>/<action>[/<id>]', 'Homepage:default');
$router[] = $front = new RouteList('Front');
$front[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
return $router;
- David Matějka
- Moderator | 6445
Nemas nastaveny composer, aby ti scanoval app? kdyztak zkus
spustit composer dump-autoload
Pripadne zkus smazat cache