Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Jak rozwiazac problem z autoloaderem
Forum PHP.pl > Forum > Przedszkole
rad11
Panowie mam taki problem chcialbym zaladowac biblioteke laravela w projekcie. Projekt jest taki ze ma niekrore funkcjonalnosci wstrzykniete z symfony chcialbym dostrzyknac ORM eloquenta. Sytuacja wyglada tak ze aby zaladowac biblioteke eloquenta trzeba uzyc:

  1. include 'vendor/autoload.php';


i okey normalnie dziala w innych projektach natomiast tutaj jest taka sytuacja ze mam plik autoloadera:

  1.  
  2. function __autoload($className) {
  3.  
  4. if (strpos($className, "Symfony\\Component\\") !== FALSE) {
  5. $className = str_replace("Symfony\\Component\\", "", $className);
  6. }
  7.  
  8. $className = str_replace("\\", DIRECTORY_SEPARATOR, $className);
  9. if (strpos($className, 'Actions') || strpos($className, 'Components')) {
  10. $fileName = __DIR__ . '/../modules/' . $className . '.php';
  11. }
  12. else {
  13. $fileName = __DIR__ . '/../lib/' . $className . '.php';
  14. }
  15.  
  16. if (!file_exists($fileName)) {
  17. var_dump($className, $fileName);
  18. die("Failed to load $fileName");
  19. return FALSE;
  20. }
  21. include $fileName;
  22. }


ktory laduje klasy, a chcialbym tutaj dolaczyc wlasnie autolader z vendoru.

Struktura katalogow wyglada mniej wiecej tak:

-lib
--phpexcel
--phpmailer

itd.

-apps
--index.php
--autoload.php (tutaj powyzszy kod sie laduje)
--index.php
-modules
--app
---action
-vendor
--autoload.php
--composer
--illuminate

itd.

Dodam ze operacja typu:
  1. function __autoload($className) {
  2.  
  3. if (strpos($className, "Symfony\\Component\\") !== FALSE) {
  4. $className = str_replace("Symfony\\Component\\", "", $className);
  5. }
  6.  
  7. $className = str_replace("\\", DIRECTORY_SEPARATOR, $className);
  8. if (strpos($className, 'Actions') || strpos($className, 'Components')) {
  9. $fileName = __DIR__ . '/../modules/' . $className . '.php';
  10. }
  11. else {
  12. $fileName = __DIR__ . '/../lib/' . $className . '.php';
  13. }
  14.  
  15. if (!file_exists($fileName)) {
  16. var_dump($className, $fileName);
  17. die("Failed to load $fileName");
  18. return FALSE;
  19. }
  20. include $fileName;
  21. include __DIR__.'/vendor/autoload.php';
  22. }


Nie dziala.

Jakies pomysly jak to rozwiazac?
com
ale czemu chcesz wstawiać jeden autoloader w drugi?
rad11
Potrzebuje w jakis sposob wlasnie zaladowac eloquenta, a zeby to zrobic to trzeba zaladowac odpowiednie klasy ktore laduje autoloader z vendora. A autoloader z vendora nie laduje sie bo __autoloader laduje tylko klasy.
com
no to rozumiem, aby wywołać dwa autoloadery musisz uzyć spl_autoload_register, bo funkcja magiczna __autoload została skonstruowana poto żeby jej użyć raz a u ciebie została by wywołana dwa razy i dlatego tak to nie działa smile.gif Nwm na jakim poziomie jest caly twój projekt ale warto zapoznać się z standardem psr-0 lub psr-4 jeśli chodzi o strukturę wtedy composer sam dostarcza odpowiedni autoloader smile.gif
rad11
a czy aby spl_autoload_register nie laduje tez tylko klasy?

A jezeli chodzi o psr moglbys mi nakreslic tak na szybko w jaki sposob to dziala?
com
jakiej klasy? spl_autoload_register odpowiada za zarejestrowanie autoloadera którego mu wskażesz, a co w nim będzie ładowane to za to odpowiada już sama ta funkcja. __autoloader ładuje to co mu napiszesz że ma załadować. Jak zdefiniujesz że ma ładować pliki w których jest hello world to też Ci załaduje, bo autoładowanie to nic innego jak pobieranie kodu naszego pliku w całości i jego interpretowanie przez interpreter php smile.gif

http://www.php-fig.org/psr/psr-0/
http://www.php-fig.org/psr/psr-4/
Pyton_000
zmień swój __autoload na inną nazwę i zarejestrują ją przez spl_autoload_register i będzie działać.
rad11
No jak zmienie bedzie dzialac ale czy zadziala zaladowanie vendora z eloquenta?
Pyton_000
tak, tylko musisz dołączyć autoloader z composera
rad11
czyli np tak:
  1. function autoload($className) {
  2.  
  3. if (strpos($className, "Symfony\\Component\\") !== FALSE) {
  4. $className = str_replace("Symfony\\Component\\", "", $className);
  5. }
  6.  
  7. $className = str_replace("\\", DIRECTORY_SEPARATOR, $className);
  8. if (strpos($className, 'Actions') || strpos($className, 'Components')) {
  9. $fileName = __DIR__ . '/../modules/' . $className . '.php';
  10. }
  11. else {
  12. $fileName = __DIR__ . '/../lib/' . $className . '.php';
  13. }
  14.  
  15. if (!file_exists($fileName)) {
  16. var_dump($className, $fileName);
  17. die("Failed to load $fileName");
  18. return FALSE;
  19. }
  20. include __DIR__.'/../vendor/autoload.php';
  21. include $fileName;
  22.  
  23. }
  24.  
  25. spl_autoload_register("autoload");

Jesli tak to ten sposob nei dziala tez
Pyton_000
autloader composera musisz wrzucić poza funkcję
rad11
No niestety , musze dostac dostep do logow bo biala strona jest jak wrzuce includa za funkcje.
Pyton_000
pokaż finalny kod
rad11
  1. function autoload($className) {
  2.  
  3. if (strpos($className, "Symfony\\Component\\") !== FALSE) {
  4. $className = str_replace("Symfony\\Component\\", "", $className);
  5. }
  6.  
  7. $className = str_replace("\\", DIRECTORY_SEPARATOR, $className);
  8. if (strpos($className, 'Actions') || strpos($className, 'Components')) {
  9. $fileName = __DIR__ . '/../modules/' . $className . '.php';
  10. }
  11. else {
  12. $fileName = __DIR__ . '/../lib/' . $className . '.php';
  13. }
  14.  
  15. if (!file_exists($fileName)) {
  16. var_dump($className, $fileName);
  17. die("Failed to load $fileName");
  18. return FALSE;
  19. }
  20. include $fileName;
  21.  
  22. }
  23. spl_autoload_register("autoload");
  24. include __DIR__.'/../vendor/autoload.php';
Pyton_000
Wrzuć include przed rejestrację swojego autoloadera i włącz raportowanie błędów
rad11
Log zglasza blad o " [] " stara wersja PHP`a musze sie zapytac czy jest mozliwosc update`u. Chyba ze mozna sciagnac paczke eloquenta na wersje PHP 5.3.3 ?
Pyton_000
Wersja 4.1.x jest pod php 5.3 wyższe już pod 5.4
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.