Routování na modulů v adresáři presenters

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
gonner47
Člen | 27
+
0
-

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ěď.

blaztar
Člen | 93
+
0
-

Přidej prosím i kódy presenterů.

gonner47
Člen | 27
+
0
-

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
+
0
-

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
+
0
-

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

blaztar
Člen | 93
+
0
-

Pošli svůj router

gonner47
Člen | 27
+
0
-

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
+
0
-

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?

yonix
Člen | 37
+
0
-

skús pri tomto mapovaní hodiť presenter na priamo do modulu tam ho podla tohoto mapovania hlada

	mapping:
*: App\Presenters\*Module\*Presenter

podla mna ho hlada App\Presenters\FrontModule\HomepagePresenter

Editoval yonix (30. 8. 2015 22:28)

gonner47
Člen | 27
+
0
-

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
+
0
-

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;
gonner47
Člen | 27
+
0
-

Supr díky moc už mi to funguje když jsem upravil ten router.

Ale ještě by mě zajímalo proč se mi zobrazuje chyba:

include(/var/www/sandbox-admin/App/Presenters/Base/BasePresenter.php): failed to open stream: No such file or directory

Poradil by jsi mi prosím tě ještě s tím?

David Matějka
Moderator | 6445
+
0
-

Nemas nastaveny composer, aby ti scanoval app? kdyztak zkus spustit composer dump-autoload

Pripadne zkus smazat cache

gonner47
Člen | 27
+
0
-

spustil jsem composer dump-autoload a problém vyřešen díky všem za pomoc! :)