Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa doładowania plikówi katalogów
Forum PHP.pl > Forum > PHP
buliq
Witam serdecznie.

Projektując klasę do obsługi plików i katalogów( operacje typu wyszukiwanie, ładowanie, upload i tworzenie) przy kwestii wyszukiwania i ładowania plików natknąłem się na problem. Bardziej na zagadnienie z wieloma rozwiązaniami. Prosiłbym was o wskazanie rozwiązania, może ktoś już spotkał się z tymi pomysłami i wybrał właściwe.

Rozwiązanie 1: tworzymy strukturę katalogów i plików, zapisujemy do cache, w razie potrzeby wyszukujemy wśród tej struktury odpowiedniego pliku. Cache odświeżany raz dziennie oraz w przypadku uploadu/tworzenia plików/katalogów.

Rozwiązanie 2: przy pomocy glob tworzymy strukturę plików odpowiadającą wzorcowi (rozszerzenie i przeznaczenie pliku np. moduł, plugin).

Rozwiązanie 3: bezpośrednie wyszukiwanie wszystkich możliwych ścieżek do plików i sprawdzanie czy plik istnieje.

Najlepsze wydaje się rozwiązanie 1 jednak nie jest ono optymalne pod względem aktualności danych. Rozwiązanie 3 to za dużo możliwości do sprawdzenia i wymagana większa ilość parametrów-bardziej złożone nazwy zawierające nazwy podkatalogów. Rozwiązanie 2 opiera się na glob - nigdy nie wiadomo ile plików znajdzie czyli ilość możliwości zmienna - może być lepiej ale może być też gorzej wink.gif

Ma ktoś jeszcze inne rozwiązania?

Wyjaśnienie działania: W kontrolerze aplikacji wydaję polecenie wczytania składowych systemu typu sterownik bazy danych, system szablonów, systemy poboczne (np File::load('db'), File::load('view')), lub wczytania kontrolera strony index (File::load('index')). Chcę uzyskać konkretny plik to w drugim parametrze podaję katalog (File::load('index','controller')) chcę wskazać precyzyjnie jaka paczka to trzeci parametr. Zawężając w ten sposób ilość wyników.

A może moje rozumowanie jest kompletnie złe? Nakierujcie mnie proszę smile.gif
Spawnm
Ale kombinujesz.
Jeśli twój fw jest w pełni oparty na klasach to nie baw się w file::load tylko daj autoloader z PSR-0.
buliq
Użyłbym gdybym chciał tylko autoloadera, klasa File ma też tworzyć, edytować, konwertować, kasować, itp. Jednym słowem cała obsługa plików i katalogów. Ewentualnie autoloader z obiektu ale to dalej nie pomoże przy szukaniu itp.
Spawnm
Jeśli chodzi o operacje na samych plikach i katalogach to jedyną sensowną opcją jest podawanie ścieżek.
Jak chcesz odróżnić db.php w Library od db.php w Application/Model podając tylko nazwę pliku?
Zyx
To jeszcze polecam Ci dorzucić do tej klasy opcję prasowania ubrań i robienia zakupów. Twoje rozwiązanie istotnie jest kompletnie złe. Jest w programowaniu obiektowym (z którym nawiasem mówiąc Twój pomysł niewiele ma wspólnego) tzw. Zasada jednej odpowiedzialności, która mówi, że obiekty (a za nimi klasy) powinny zajmować się jedną i DOKŁADNIE jedną rzeczą. Z punktu widzenia aplikacji ładowanie klas oraz zarządzanie strukturą katalogową to dwa różne problemy, zatem powinny się nimi zajmować dwie oddzielne jednostki.

Spawnm dobrze Ci pisze. Wymyślanie wianków na kiju odnośnie ładowania klas to kompletny bezsens. Jest jedna, uniwersalna i bardzo elastyczna konwencja PSR-0 i nie ma żadnych argumentów przeciwko jej używaniu. Za to jest cała masa pozytywów:
- bez problemu podłączysz dodatkowe, zewnętrzne biblioteki do projektu,
- możesz bardzo łatwo optymalizować proces ładowania klas dzięki temu, że jest on oddzielony od samej aplikacji,
- nie musisz wynajdować koła od nowa, bo istnieją do tego dobrze przetestowane, zoptymalizowane i sprawdzone w bojach zestawy autoloaderów (np. mój Open Power Autoloader...),
- dostajesz do ręki gotowe rozwiązanie, które jest odpowiedzią na wszystkie Twoje pytania.

A jak sobie poradzić z wyszukiwaniem? Mechanizmem refleksji. Podajesz przestrzeń nazw, w której leżą klasy do ładowania, używasz refleksji do wyciągnięcia ścieżki, używasz file_exists(), a jak jesteś już pewny, to wołasz spl_autoload_call() i masz plik załadowany. I nie mów mi, że to nie zadziała, bo zadziała.
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.