Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]jak to działa że mogę tworzyć obiekt bez includowania autoloadera?
Forum PHP.pl > Forum > Przedszkole
andrzejdupa
Nie jest dla mnie jasna kwestia autoloadera.

Rozumiem zasadę działania autoloadera i przestrzeni nazw. W klasie autoloadera rejestruję przestrzenie nazw ze ścieżkami do plików następnie inkluduję autoloadera w klasie w której chcę tworzyć obiekty.

Jak to się dzieje, jak w tym prostym, przykładowym projekcie, że istniejący autoloader nie inkluduje się w klasie w której tworzę obiekt
com
nie bardzo wiem czemu tam nie używa się psr-4, ale musisz dodać w swoim głównym pliku require z tym autoloadem nie? wink.gif

btw zresztą ten projekt jest nie do użytku tu jest właściwa wersja https://github.com/moneyphp/money
andrzejdupa
nie rozumiem,

a gdzie w tym projekcie jest "główny plik" https://github.com/moneyphp/money ?


bo w symfony, upraszczając, rozumiem że jest ten główny plik przez który przechodzi każde żądanie i który require autoloadera, ale w tym projekcie który ja i ty podaliśmy nie widzę tego.

edit: czy to może jest tak, że te projekty nie działają samodzielnie, że je się dołącza do swojego projektu jako oddzielna funkcjonalność i dołączając je muszę w swoim projekcie, w swoim pliku głównym, czy gdzieśtam dołączyć autoloadera z tego oddzielnego, dołączanego projektu. Tak to działa?

ktoś mógłby mi podać hasło jakie wpisać w google by coś o tym poczytać.
com
tak dokładnie, poczytaj o composer, i psr http://www.php-fig.org/ smile.gif
andrzejdupa
tak to rozumiem (proszę o sprostowania):

- komponenty stosują namespace zgodny z konwencjami psr (tj nazwa namespace poza prefixem odpowiada filesystem)
- każdy komponent ma swój composer.json w nim definiuje mapę autoload namespace=>dir
- dzięki temu, że podąża się na konwencjami psr to nie muszę definiowac map dla każdego pliku a tylko dla folderu \src i prefixu namespace.
- instalując komponent w swoim projekcie przez composer, composer dodaje automatycznie powyższą mape i umieszcza w pliku mojego projektu vendor\autoload.php
- i ten plik (vendor\autoload.php) ja require w swoim pliku głównym (czyli web\app.dev w Symfony, chociaż nic tam takiego nie widzę)
Pyton_000
Dokładnie tak smile.gif
andrzejdupa
guitar.gif
com
no generalnie taka jest miej więcej idea smile.gif
andrzejdupa
a gdybym chciał by vendor\autoload.php wziął też composer.json z mojego projektu a nie tylko z komponentów obcych (z katalogu \vendor)?
Comandeer
https://github.com/Comandeer/SHITTY/blob/ma...ser.json#L9-L14 (chociaż poza plikiem composer.json, to polecam się nie wzorować na tym projekcie wink.gif)
andrzejdupa
aha, nie no, to wiem jak zdefiniować, chodziło mi o to jak dołaczyć mój comoser.json do autoload


ale rozumiem że nie trzeba się tym martwić
com
przecież jak robisz composer install, to on czyta twój plik który zdefiniowałeś i z niego instaluje te paczki smile.gif
andrzejdupa
po wprowadzeniu zmian w composer.json

  1. "autoload": {
  2. "psr-4": {
  3. "foo\\": "src/"
  4. }
  5. }


muszę zrobić composer isntall by composer zaktualizował se autoloadera?


robię jakąś literówkę bo mi wykrywa tego mapowania
com
to do tego służy require wink.gif

czyli np
  1. "require": {
  2. "container-interop/container-interop": "~1.1",
  3. "league/tactician": "^1.0"
  4. }
andrzejdupa
gadamy o różnych rzeczach


mi nie chodzi o to by vendor\autoloader załadował paczki z zewnątrz (katalogu vendor) (tzn niech se ładuje, i tak tam nic nie mam, mam treningowy projekcik z 3 klasami, nie o to mi teraz chodzi)

mi chodzi o to by vendor\autoloader załadował mój katalog \src z jego namespace zdefiniowane w composer.json mojego projektu (treningowego)


bo nie ładuje. I nie wiem czy robię gdzieś literówkę czy trzeba jakoś specjalnie dołączyć mój composer.json by zaktualizowac autoloadera
com
Flow jest takie:
1. tworzysz odpowiednie katalogi które podpinasz pod autolader
2. tworzysz plik composer.json
2.1 dodajesz biblioteki do projektu, których chcesz uzyć
3. composer install
4. pracujesz sobie nad projektem, jak chcesz zaktualizować composera to robisz
composer update
5. reszta w dokumentacji do poczytania wink.gif

No to załatwiłeś to tym kodem
  1. "autoload": {
  2. "psr-4": {
  3. "foo\\": "src/"
  4. }
  5. }

tylko w głównym pliku teraz require_once 'vendor/autoload.php';

masz w katalogu composer.lock oraz vendor?

spr czy sie dodało w vendor/composer/autoload_psr4.php twoje mapowanie
andrzejdupa
Cytat(com @ 24.05.2016, 23:39:30 ) *
tylko w głównym pliku teraz require_once 'vendor/autoload.php';

facepalmxd.gif
Pyton_000
Do aktualizowania autoloadera służy
Kod
composer dump-autoload


Niestety ale chyba obecnie nie da się zrobić tak że będziesz miał swoją paczkę poza kat. vendor i on będzie sobie czytał z composer.json.

Możesz jedynie ustawić namespace tak jak robiłeś to wcześniej na katalog src (czy jaki tam masz).
viking
Cytat(Pyton_000 @ 25.05.2016, 09:05:49 ) *
Niestety ale chyba obecnie nie da się zrobić tak że będziesz miał swoją paczkę poza kat. vendor i on będzie sobie czytał z composer.json.


Dlaczego nie?
Cytat
"autoload": {
"psr-0": {
"Aaa_": "library/"
},
"psr-4": {
"Bbb\\":"library/Bbb",
}
},


Chyba że o czymś innym mówisz. dump-autoload -o wygeneruje pełną mapę.
Jest jeszcze "include-path".
Pyton_000
@viking jemu chodzi o to że msz sobie kat:

src/lib/my-lib/composer.json

i żeby composer sobie odczytał tego json i z niego wziął mapę namespace.
A nie da się tak dla pojedynczych paczek.
andrzejdupa
już mnie wszystko działa od wczoraj. pominąłem linię z require vendor\autoload.php

komenda composer dump-autoload też się przyda.


dla ścisłości, mnie chodziło o takie o:
  1. <web-root>
  2. |--------src/
  3. | |--------class1
  4. | |
  5. | |--------class2
  6. |
  7. |
  8. |---------vendor/
  9. | |
  10. | |---------composer/
  11. | | |---------autoload_psr4.php
  12. | |
  13. | |----------autoload.php
  14. |
  15. |-----------composer.json
com
andrzejdupa jak widać Pyton_000 CI,e nie zrozumiał, bo ja przyznam tez w pewnym momencie się zastanawiałem.

I fakt o composer dump-autoload zapomniałem jeszcze wink.gif
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.