Diskuze: autoload funkce

PHP PHP autoload funkce American English version English version

Aktivity (1)
Avatar
Adam Matis
Člen
Avatar
Adam Matis:8. srpna 18:02

Ahoj potřeboval bych poradit mám problém vymyslet jak načítat třídy, které jsou rozdělený po různých složkách.

Zkusil jsem: Napadlo mě v indexu vytvořit nějaké pole, které by obsahovalo všechny názvy adresářů a pak jednotlive adresáře procházet a hledat daný soubor. Existuje nějaká efektivnější varianta ?

Chci docílit: Vytvářím svou vlastní jednoduchou mvc strukturu, kde část webu, která používá svou vlastní šablonu než zbytek webu např adminsitrace,login bude ve vlastním adresáři s vlastní šablonou.

 
Odpovědět 8. srpna 18:02
Avatar
Odpovídá na Adam Matis
Martin Konečný (pavelco1998):8. srpna 18:14

Ahoj,
pokud dodržuješ určitý standard, pak by namespace mělo odpovídat adresářové struktuře. Tedy např.

namespace App\Model\Services\Users\UserManager

by mělo být ve složce

app/Model/Services/Users/UserManager.php

Pokud to máš poházené různě a nechceš vymýšlet vlastní řešení, zkus:
https://github.com/…robot-loader

Pokud chceš opravdu sám, pak si myslím, že tvé řešení je dobré. Jen by bylo fajn si to nějak cachovat, abys při každém požadavku nemusel procházet všechny adresáře a hledat :D

Nahoru Odpovědět 8. srpna 18:14
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Adam Matis
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Adam Matis:8. srpna 18:53

Děkuji za odpověď určitý standart dodržuji resp Mám to rozděleno jako
App/
nazev_adresaře/

  • Model
  • View
  • Controller

Namespaces zatím nevyužívám resp kdybych je dodělal
např

<?php
namespace app\chyba\Controller;
class ChybaController {...}

Jak by pak měl ta autoload funkce vypadat aby tu třídu s daným namespacem dokazala najít
Ja jí mam prozatím udělanou takto

function autoload($className) {
    $file = $className . '.php';
    if(file_exists($file)) {
        require_once $file;
    }
}
 
Nahoru Odpovědět 8. srpna 18:53
Avatar
Lasvit
Člen
Avatar
Lasvit:9. srpna 10:38

Od toho slouží composer který stejně nakonec budeš potřebovat. Takže dodržuj PSR-4 a nainstaluj si tam https://getcomposer.org/. Nejlepší řešení.

 
Nahoru Odpovědět  +1 9. srpna 10:38
Avatar
Ondřej Pech
Člen
Avatar
Ondřej Pech:13. srpna 14:06

V proměnné className dostane funkce vždy kompletní název třídy i s jmenným prostorem. Tzn. pokud máš namespace app\chyba\Con­troller a třídu ChybaController tak při volání autoload funkce máš v proměnné className máš "\app\chyba\Con­troller\Chyba­Controller". Teoreticky stačí převrátit lomítka a udělat require_once() na tu cestu.

Pokud by namespace neodpovídal adresářům tak už si tu proměnou musíš nějak rozparsovat podle lomítek a udělat si k tomu nějakou logiku.

Jinak souhlasím s ostatními, že je dobré se držet standardů ušetří ti to spoustu problémů.

Editováno 13. srpna 14:07
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 13. srpna 14:06
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.