Modularna aplikacia, PHP5.3 a nastavenie namespace
- srigi
- Nette Blogger | 558
Zdravim, rozchadzam modularnu aplikaciu podla s novou (dufam ze aktualnou)
doporucenou addr. strukturou na PHP 5.3 – link
Aplikacia ma teda u mna takuto strukturu:
K tomu mam definovane routovanie takto:
<?php
$router[] = new Route('admin/<presenter>/<action>/<id>', array(
'module' => 'Admin',
'presenter' => 'Default',
'action' => 'default',
'id' => NULL
));
$router[] = new Route('<presenter>/<action>/<id>', array(
'module' => 'Front',
'presenter' => 'Default',
'action' => 'default',
'id' => NULL
));
?>
Otazky mam tri:
1. nefunguje to. Po pokuse otvorit hlavnu stranku mi Ladenka vyhodi
Cannot load presenter ‚Front:Default‘, class ‚FrontModule\DefaultPresenter‘ was not found in ‚/srv/www/vhosts/blablabla/app/FrontModule/presenters/DefaultPresenter.php‘.
Je mi jasne, ze nemam spravne pomenovane triedy v jednotlivych zdrojakoch a kedze pouzivam PHP-5.3 tak isto iste treba nastavit (importnut?) aj menne priestory. Bohuzial som sa nikde v dokundamentacii ani fore nedozvedel ako to nastavit.
2. Na obrazku hore je mozne vidiet, ze subory/triedy BasePresenter a ErrorPresenter su 2×. Je mozne ich nejako „urobit common“ (vsak viete co myslim)? Kde ich potom ulozit?
3. Neviem, ci pouzivam spravnu strukturu pre sablony. Je to takto OK, alebo sa pouziva styl „sablony naplocho v addr. templates“?
Potreboval by som hlavne rozchodit (1.), kcem vlastne vdaka tomu emulovat aplikacie, ako to ma Synfony. THX.
- Ondřej Mirtes
- Člen | 1536
- Pokud chceš používat namespaces a PHP 5.3 (jinak si stáhni verzi pro PHP 5.2, která je bez namespaces, a zbytek příspěvku nemusíš řešit), tak by začátek souboru s presenterem měl vypadat nějak takto:
namespace FrontModule;
class DefaultPresenter extends BasePresenter {
}
Předpokládá to, že máš BasePresenter taky v namespace FrontModule. A ještě bych si vytvořil globální BasePresenter (který nebude mít namespace):
use Nette\Application\Presenter;
class BasePresenter extends Presenter {
}
A BasePresenter modulu bude vypadat takto:
namespace FrontModule;
class BasePresenter extends \BasePresenter {
}
Zkus si počíst tady: https://forum.nette.org/…a-namespaces?…
- BasePresenter pro každý modul zvlášť se hodí, např. pro společné
továrničky. Naopak by ti ještě jeden BasePresenter měl přibýt, ten,
který bude společný pro všechny moduly – viz 1). Strčil bych ho do
app/
.
Dva ErrorPresentery Nette nyní oficiálně nepodporuje, to tam máš chybu. Název ErrorPresenteru se nastavuje v bootstrapu:
$application = Environment::getApplication();
$application->errorPresenter = 'Front:Error'; //v tomto případě můžeš ten v adminu smazat
- Jestli máš šablony OK, uvidíš, až se dostaneš přes chybu s nenalezením presenteru :) Jestli se ti vykreslí šablona nebo zobrazí Laděnka s „missing template file“ :)
Editoval Ondřej Mirtes (11. 1. 2010 22:40)
- srigi
- Nette Blogger | 558
Patri ti moja velka vdaka. S pomocou tvojho prispevku som aplikaciu rozbehal
(to vlakno som cital ale moc som z neho nebol mudry – hlavne preto, ze som
este nikde v addr app/
nevidel pouzit kod
namespace xyzAbcd
). Nakoniec vysledna struktura projektu
vypada takto:
Ak by niekto potreboval, uploadol som cely horezobrazeny projekt v archive, kde sa mozete pozriet na zdrojaky. Este raz vdaka Ondřejovi.
- Ondřej Mirtes
- Člen | 1536
Ještě jsem si všiml překlepu, v bootstrapu má být toto:
$application->errorPresenter = 'Front:Error'; //název bez 'Presenter' na konci
A nemáš zač :)
- srigi
- Nette Blogger | 558
Oprava jednej vazne hlupej chyby – link na opravenu verziu
Editoval srigi (13. 1. 2010 22:06)
- muflon
- Člen | 14
Prosim vas mohol by niekto skusit pridat do tohto skeletonu pripojenie na mysql s dibi a jeden vzorovy model vo FrontModule s nejakym vyberom z fiktivnej databazy len preto aby som videl ako sa to robi. Ja stale dostavam 500 Internal server error nech sa snazim akokolvek. Velmi vam dakujem za pomoc.
- muflon
- Člen | 14
500 error som odstranil ani neviem ako :)Namiesto toho mi ladenka hlasi: ExampleModel not found mohol by sa mi prosim vas niekto pozrit na moj kod co robim zle:
Moje zmeny su v config.ini bootstrap.php _common/Basemodel.php FrontModule/models/ExampleModel.php a FrontModule/presenters/DefaultPresenter.php
Velmi vám dakujem.
- Endrju
- Člen | 147
Celekm se mi zalibila struktura tohoto reseni a docela rad bych ji
vyuzil.
Nemuzu ale pouzivat PHP 5.3 a tudiz ani namespace a potreboval bych porad jak
to rozchodit pro PHP 5.2.9. Byl by nekdo tak laskav :)?
Stahnul jsem si posledni upravenou verzi http://s000.tinyupload.com/?… a zachoval strukturu tak jak je.
Zkousel jsem to upravovat sam, ale narazil jsem stejne na problem se kterym si nevim rady.
1. Nakopiroval jsem Nette to adresare lib
2. Upravil jsem v Nette modular php-5.3\www_root\index.php
define('WWW_DIR', __DIR__);
na
define('WWW_DIR', dirname(__FILE__));
3. Dale bylo potreba v Nette modular php-5.3\app\bootstrap.php
smazat (zakomentovat)
<?php
use Nette\Debug;
use Nette\Environment;
use Nette\Application\Route;
use Nette\Application\SimpleRouter;
?>
No a zde jsem uz narazil. Zapracovala Ladenka a vyhodila chybu, kterou jsem si prelozil jako nejednoznacne definovani tridy. Predpokladam, ze chyba vznikla, protoze je zbytek kodu udelan pro PHP 5.3?
Chyba v Ladence:
InvalidStateException
Ambiguous class 'basepresenter' resolution;
defined in
D:\webserver\Nette modular php-5.3\app\FrontModule\presenters\BasePresenter.php
and in
D:\webserver\Nette modular php-5.3\app\AdminModule\presenters\BasePresenter.php.
V Callstacku chybu vysleduju az do (jinymi slovy do tohoto mista muzu neco upravit)
app/bootstrap.php (13) source ▼ Environment:: loadConfig ()
Pak uz se to „zahloda“ do Nette adresare a vyjimka je vyhozena v souboru:
D:\webserver\Nette modular php-5.3\lib\Nette\Loaders\RobotLoader.php Line: 178
<?php
Line 173: public function addClass($class, $file)
Line 174: {
Line 175: $class = strtolower($class);
Line 176: if (!empty($this->list[$class]) && $this->list[$class] !== $file) {
Line 177: spl_autoload_call($class); // hack: enables exceptions
Line 178: throw new InvalidStateException("Ambiguous class '$class' resolution; defined in $file and in " . $this->list[$class] . ".");
Line 179: }
Line 180: $this->list[$class] = $file;
Line 181: }
?>
Podle meho se Ladence a PHP 5.2.9 nelibi zapis v souboru
Nette modular php-5.3\app\AdminModule\presenters\
:
<?php
namespace AdminModule;
class BasePresenter extends \BasePresenter
{
}
?>
Mohli by jste mi prosim poradit, jak to upravit, aby to bezelo na PHP
5.2.9?
Byl bych moc vdecny za kompletni reseni.. aby si mihla Ladenka na chvili
odpocinout :).
Dekuji!
Editoval Endrju (19. 2. 2010 3:25)
- Endrju
- Člen | 147
bazo napsal(a):
kedze je to base presenter admin modulu tak napr. takto:
<?php class Admin_BasePresenter extends BasePresenter { } ?>
nemozes mat definovane dve classy s rovnakym nazvom
Oki a timto zapisem reknu, ze Admin_BasePresenter bude rozsirovat BasePresenter, ktery je umisteny vyse ve strukture v adresari _common?
Co znamena to limitko v kodu v casti extends?
<?php
class BasePresenter extends \BasePresenter
?>
Znamena to, ze rozsiruji presenter, ktery je v adresarove strukture o adresar vyse? A tohle funguje jen v PHP 5.3? Jak se to resi pro PHP 5.2.9?
Dekuji :)
Editoval Endrju (20. 2. 2010 3:47)