Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Jak rozwiazac problem z autoloaderem
rad11
post 10.03.2015, 12:45:59
Post #1





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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?

Ten post edytował rad11 10.03.2015, 12:49:04
Go to the top of the page
+Quote Post
com
post 10.03.2015, 12:55:52
Post #2





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


ale czemu chcesz wstawiać jeden autoloader w drugi?
Go to the top of the page
+Quote Post
rad11
post 10.03.2015, 12:57:47
Post #3





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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.

Ten post edytował rad11 10.03.2015, 13:02:58
Go to the top of the page
+Quote Post
com
post 10.03.2015, 13:04:54
Post #4





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
rad11
post 10.03.2015, 13:13:45
Post #5





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
com
post 10.03.2015, 13:17:17
Post #6





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


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/

Ten post edytował com 10.03.2015, 13:16:05
Go to the top of the page
+Quote Post
Pyton_000
post 10.03.2015, 13:26:21
Post #7





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


zmień swój __autoload na inną nazwę i zarejestrują ją przez spl_autoload_register i będzie działać.
Go to the top of the page
+Quote Post
rad11
post 10.03.2015, 13:37:26
Post #8





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


No jak zmienie bedzie dzialac ale czy zadziala zaladowanie vendora z eloquenta?
Go to the top of the page
+Quote Post
Pyton_000
post 10.03.2015, 13:54:32
Post #9





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


tak, tylko musisz dołączyć autoloader z composera
Go to the top of the page
+Quote Post
rad11
post 10.03.2015, 14:00:29
Post #10





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Pyton_000
post 10.03.2015, 15:04:04
Post #11





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


autloader composera musisz wrzucić poza funkcję

Ten post edytował Pyton_000 10.03.2015, 15:04:12
Go to the top of the page
+Quote Post
rad11
post 10.03.2015, 17:32:17
Post #12





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


No niestety , musze dostac dostep do logow bo biala strona jest jak wrzuce includa za funkcje.
Go to the top of the page
+Quote Post
Pyton_000
post 10.03.2015, 18:31:41
Post #13





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


pokaż finalny kod
Go to the top of the page
+Quote Post
rad11
post 11.03.2015, 06:50:41
Post #14





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


  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';
Go to the top of the page
+Quote Post
Pyton_000
post 11.03.2015, 09:08:50
Post #15





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Wrzuć include przed rejestrację swojego autoloadera i włącz raportowanie błędów
Go to the top of the page
+Quote Post
rad11
post 11.03.2015, 09:26:54
Post #16





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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 ?

Ten post edytował rad11 11.03.2015, 09:47:29
Go to the top of the page
+Quote Post
Pyton_000
post 11.03.2015, 10:22:23
Post #17





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Wersja 4.1.x jest pod php 5.3 wyższe już pod 5.4
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 05:14