Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

PSR-0 Standard za SPL class autoloading problem

[es] :: PHP :: PSR-0 Standard za SPL class autoloading problem

[ Pregleda: 2513 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

alfa-pro
Pancevo

Član broj: 241818
Poruke: 476
*.dynamic.sbb.rs.



+7 Profil

icon PSR-0 Standard za SPL class autoloading problem08.05.2013. u 14:39 - pre 132 meseci
Imam problem sa ucitavanjem klasa i namespace. Koristim PSR-0 standard za spl autoloading.
Problem je sto nemogu da ucitam klasu pomocu putanje i namespace iako je registrujem.

Klasa :

Code:

https://gist.github.com/jwage/221634


E sada ja pokusam da registrujem base kontroller (u /library/system/controller/) koji ima namespace System/Controller.

Code:

$classLoader = new SplClassLoader('System\Controller', __DIR__.DS.'library'.DS);

$classLoader->register();

 echo "<pre>";
    print_r($classLoader);
 echo "</pre>";

$c = new System/Controller;


DEBUG OUTPUT:

Code:
SplClassLoader Object
(
    [_fileExtension:SplClassLoader:private] => .php
    [_namespace:SplClassLoader:private] => System\Controller
    [_includePath:SplClassLoader:private] => D:\xampp\htdocs\Workplace\cms_lite\library\
    [_namespaceSeparator:SplClassLoader:private] => \
)


I naravno konstantni error da ne moze naci:
Fatal error: Class 'Controller' not found in D:\xampp\htdocs\Workplace\cms_lite\index.php on line 42

Nerazumem zasto definisao sam tacan name space System\Controller posle toga tacan path. Debug pokazuje ispravnu putanju ali nece da radi...

Testirao sam u DOCTRINE i ZEND i tamo radi ovaj princip sto sam ja uradio na svojoj aplikaciji, takodje sam pokusao i u symfrony i tamo radi samo kod ovog mog nesrecnika, baksuza.

Eo za zend:

Code:
$zendLoader = new SplClassLoader('Zend', '/path/to/zend/lib');
$zendLoader->setNamespaceSeparator('_');
$zendLoader->register();


Code:

    \Doctrine\Common\IsolatedClassLoader => /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
    \Symfony\Core\Request => /path/to/project/lib/vendor/Symfony/Core/Request.php
    \Zend\Acl => /path/to/project/lib/vendor/Zend/Acl.php
    \Zend\Mail\Message => /path/to/project/lib/vendor/Zend/Mail/Message.php


[Ovu poruku je menjao Goran Rakić dana 08.05.2013. u 22:28 GMT+1]
Kada vidjamo uvek ista lica, na kraju ona postaju deo našeg života. A kada postanu
deo našeg života,
onda žele i da nam ga izmene. I ako ne bude po njihovom, nije im pravo. Jer, svaki
čovek ima tačnu predstavu kako bi trebalo da živimo svoj život. A nikad nemaju pojma
kako treba da prožive sopstveni život.
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: PSR-0 Standard za SPL class autoloading problem08.05.2013. u 21:22 - pre 132 meseci
PHP koristi \ kao separator za namespace. Ako je klasa "System\Controller", namespace je "System".

Prema PSR-0 klasa "System\Controller" ako želiš prefiks "/library" treba da je u datoteci "/library/System/Controller.php".

SplClassLoader konstruišeš tako da namespace "System" traži u direktorijumu "/library/".
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

alfa-pro
Pancevo

Član broj: 241818
Poruke: 476
*.dynamic.sbb.rs.



+7 Profil

icon Re: PSR-0 Standard za SPL class autoloading problem09.05.2013. u 12:19 - pre 132 meseci
@Gorane
Da skontao sam to sinoc posle brdo testova (UNIT).

Pazi ovo sada, mislim da ova klasa nije dovoljna za ono sto ja zelim i da bi bilo dobro da je prosirim...

Gledaj moju strukturu.

Imam Library dir koji sadrzi jos 2 dir-a. Jedan dir je System gde je moj core za framework sa kontrollerima, uri, routing, doctrine itd...
Drugi dir u lib je External koji sadrzi druge biblioteke tipa Smarty, Mailer, SimplePie.
I u root imam dir Modules <modName> / <controllers> <modules> <views> <config> <helpers> <language>

E meni ovo radi samo na SYSTEM ucitava mi sve core klase kako treba.

Npr:
$external = new SplClassLoader('System', LIB_PATH); // putanja do lib DIR-a
$external->register();

$baseController = new System\Controller\Controller(); // Ovo radi odlicno i sve druge system core klase se ucitaju bez greske

Ali problem nastaje kada probam da ucitam Externalne klase tipa smarty.

Ja sam napravio ovako:

Code:
-root
---Library
-----External
-------Smarty
---------Adapter.php // Klasa koja mi instancira/extenduje smarty class slicno kao doctrine sto radi


U ovom slucaju ja moram da pravim novu instancu SPL CLASS LOADERA

Code:
$external = new SplClassLoader('External', LIB_PATH); // putanja do lib DIR-a
$external->register();

$smarty = new External\Smarty\Adapter(); 

Ali kada ja napravim novu ins za external i pozovem Adapter dobijam gresku da sve klase koje sam pokusao da ucitam iz SYSTEM Namespac-e da nisu pronadjene a ucita mi adapter za smarty...

Ja kada bi sada prosirio klasu ne znam da li bi ispostovao PSR-0 standard:
https://github.com/php-fig/fig.../blob/master/accepted/PSR-0.md

Mislio sam da konstruktor bude prazan a da napravim novu metodu kao sto symfrony ima.

$obj -> add(NS, PATH);
$obj -> add(NEW_NS, PATH);
$obj -> register();

Dodam u add i system i external i modules da nemoram da instanciram 5x jednu istu klasu?

Sta ti mislis?
Kada vidjamo uvek ista lica, na kraju ona postaju deo našeg života. A kada postanu
deo našeg života,
onda žele i da nam ga izmene. I ako ne bude po njihovom, nije im pravo. Jer, svaki
čovek ima tačnu predstavu kako bi trebalo da živimo svoj život. A nikad nemaju pojma
kako treba da prožive sopstveni život.
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: PSR-0 Standard za SPL class autoloading problem09.05.2013. u 16:50 - pre 132 meseci
Koristi Composer i njegov autoloader. http://getcomposer.org

To je pravo rešenje kada imaš više biblioteka.
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-1.sezampro.rs.



+33 Profil

icon Re: PSR-0 Standard za SPL class autoloading problem09.05.2013. u 21:25 - pre 132 meseci
Ako smem da primetim, ti sve te instance SplClassLoader smestaš u jednu istu varijablu koja se zove $external. Najpre u slučaju tog "System" namespace-a, o onda i za "External". Verovatno iz tog razloga dolazi do preklapanja i override-ovanja, pri tim pozivima register() metoda.

edit: Po mom mišljenju, ubedljivo najbolja i najkompletnija PSR-0 autoloading implementacija: https://github.com/symfony/ClassLoader.
 
Odgovor na temu

alfa-pro
Pancevo

Član broj: 241818
Poruke: 476
*.dynamic.sbb.rs.



+7 Profil

icon Re: PSR-0 Standard za SPL class autoloading problem12.05.2013. u 04:12 - pre 132 meseci
COmposer je fantastican stvarno, ali kako ja sada da definisem svoj autoloader za svoju lib?

@nikola
Bas odatle sam i uzimao primere.
Kada vidjamo uvek ista lica, na kraju ona postaju deo našeg života. A kada postanu
deo našeg života,
onda žele i da nam ga izmene. I ako ne bude po njihovom, nije im pravo. Jer, svaki
čovek ima tačnu predstavu kako bi trebalo da živimo svoj život. A nikad nemaju pojma
kako treba da prožive sopstveni život.
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-1.sezampro.rs.



+33 Profil

icon Re: PSR-0 Standard za SPL class autoloading problem12.05.2013. u 09:07 - pre 132 meseci
Odakle si uzimao primere? Sa ovog linka kojeg sam poslao? Čisto sumnjam, jer kao što si naglasio u tvom prvom postu, ti si isprobavao ovu PSR-0 implementaciju: https://gist.github.com/jwage/221634. Ovo što sam ja poslao je class loading komponenta Symfony framework-a.
 
Odgovor na temu

alfa-pro
Pancevo

Član broj: 241818
Poruke: 476
*.dynamic.isp.telekom.rs.



+7 Profil

icon Re: PSR-0 Standard za SPL class autoloading problem12.05.2013. u 11:30 - pre 132 meseci
Ako sam uzimao primere neznaci da cu da prepise celu klasu isto. Vec sam uzeo standard PSR-0.
A ono gore sto sam pitao je da li ja mogu nekako da zadam composeru da ucitava i moje biblioteke ili module. ili ucitava samo pakete koje je preuzeo
Kada vidjamo uvek ista lica, na kraju ona postaju deo našeg života. A kada postanu
deo našeg života,
onda žele i da nam ga izmene. I ako ne bude po njihovom, nije im pravo. Jer, svaki
čovek ima tačnu predstavu kako bi trebalo da živimo svoj život. A nikad nemaju pojma
kako treba da prožive sopstveni život.
 
Odgovor na temu

Goran Rakić
Beograd

Moderator
Član broj: 999
Poruke: 3766

Sajt: blog.goranrakic.com


+125 Profil

icon Re: PSR-0 Standard za SPL class autoloading problem12.05.2013. u 11:48 - pre 132 meseci
Potrebno je da definišeš svoj autoloader u composer.json: http://getcomposer.org/doc/04-schema.md#autoload
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
 
Odgovor na temu

alfa-pro
Pancevo

Član broj: 241818
Poruke: 476
*.dynamic.sbb.rs.



+7 Profil

icon Re: PSR-0 Standard za SPL class autoloading problem13.05.2013. u 01:33 - pre 132 meseci
Da da da sada kontam. Gorane ne znam sta da ti kazem sem jendo veliko hvala. Ako ikada dodjes u Pancevo castim pivo ;)
Kada vidjamo uvek ista lica, na kraju ona postaju deo našeg života. A kada postanu
deo našeg života,
onda žele i da nam ga izmene. I ako ne bude po njihovom, nije im pravo. Jer, svaki
čovek ima tačnu predstavu kako bi trebalo da živimo svoj život. A nikad nemaju pojma
kako treba da prožive sopstveni život.
 
Odgovor na temu

[es] :: PHP :: PSR-0 Standard za SPL class autoloading problem

[ Pregleda: 2513 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.