Modularna aplikacia, PHP5.3 a nastavenie namespace

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

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:

projekt

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
+
0
-
  1. 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?…

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

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

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

Diki, tu chybku som opravil a este som trocha upravil addr. strukturu tak, ze sablony su teraz ulozene spolu s modulmi. Pride mi to logickejsie a spravne – modul si nesie kod a sablony pekne v jednom adresari, vid obrazok:

Tu je odkaz na tuto opravenu verziu.

srigi
Nette Blogger | 558
+
0
-

Oprava jednej vazne hlupej chyby – link na opravenu verziu

Editoval srigi (13. 1. 2010 22:06)

muflon
Člen | 14
+
0
-

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.

Ondřej Mirtes
Člen | 1536
+
0
-

muflon: A je ten 500 error alespoň od Nette?

muflon
Člen | 14
+
0
-

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:

Source

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

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)

bazo
Člen | 620
+
0
-

kedze je to base presenter admin modulu tak napr. takto:

<?php
class Admin_BasePresenter extends BasePresenter
{

}
?>

nemozes mat definovane dve classy s rovnakym nazvom

Endrju
Člen | 147
+
0
-

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)