Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Autoloader + namespace
Forum PHP.pl > Forum > Przedszkole
brzoza91
Witam
Chciałbym używać w swojej aplikacji przestrzeni nazw, a także użyć autoloadera klas.
Na początku pokaże wam strukturę mojej aplikacji.


posiadam taki Autoloader
  1. <?php
  2. class Autoloader {
  3.  
  4. public static $loader;
  5.  
  6. public static function init()
  7. {
  8. if (self::$loader == NULL)
  9. self::$loader = new self();
  10.  
  11. return self::$loader;
  12. }
  13.  
  14. public function __construct()
  15. {
  16. spl_autoload_register(array($this,'controller'));
  17. }
  18.  
  19. public function controller($class)
  20. {
  21. var_dump($class);
  22. try{
  23. if(file_exists($class)){
  24. require_once($class);
  25. } else {
  26. throw new Exception('nie mozna dolaczyc pliku: ' .$class);
  27. }
  28. } catch (Exception $e){
  29. echo $e->getMessage();
  30. }
  31. }
  32.  
  33.  
  34. }


taki Controller
  1. namespace Framework\Core\Controller;
  2.  
  3. require_once('libs/yaml/Yaml.php');
  4. require_once('View.php');
  5. abstract class Controller
  6. {
  7. protected $pdo;
  8. protected $view;
  9. public function __construct()
  10. {
  11. try
  12. {
  13. $file='c:/wamp/www/framework/core/parameters/parameters.yml';
  14. $database= Yaml::parse($file);
  15. $database=(object)$database['database'];
  16.  
  17. $this->pdo= new PDO($database->type.':host='.$database->host.';dbname='.$database->dbname, $database->user, $database->password);
  18. $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  19. } catch(DBException $e)
  20. {
  21. echo 'The connect can not create with database<br>'. $e->getMessage();
  22. }
  23.  
  24. $this->view= new View();
  25. }
  26. abstract public function indexAction();
  27.  
  28. }
  29.  


i taki IndexContoller
  1. namespace App\Contollers\IndexContoller;
  2.  
  3. use Framework\Core\Controller as Contoller;
  4.  
  5. class IndexController extends Controller {
  6.  
  7. function __construct() {
  8. parent::__construct();
  9. }
  10.  
  11. public function indexAction() {
  12.  
  13.  
  14. }
  15. public function showAction($arg=false){
  16. $this->view->render('Index::show');
  17. }
  18.  
  19. public function addAction()
  20. {
  21. echo "addAction</br>";
  22. }
  23.  
  24. }


po wpisaniu adresu w przeglądarce który powinien uruchomić metodę show z IndexContoller otrzymuje taki komunikat:

  1. string 'App\Contollers\IndexContoller\Controller' (length=40)
  2. nie mozna dolaczyc pliku: App\Contollers\IndexContoller\Controller


co robię nie tak, coś nie mogę zrozumieć tych namespace, bo Autoloader bez użycia namespace implementuje poprawnie
piotr.pasich
Rozumiem, że jest to rozpoczęcie projektowania własnego frameworka... nie wymyślaj koła na nowo! (koniec nawracania:) )

Ale rozwiązując problem z posta najlepiej albo przyjrzeć się gotowym już rozwiązaniom, albo je podpiąć - większość obecnych supportowanych frameworków swoje biblioteki ma dość odseparowane i istnieje możliwość ich podpięcia pod autorskie rozwiązania, np. :
http://symfony.com/doc/2.0/components/class_loader.html - jeżeli nie uda się zainstalować, to kod dostarczy przynajmniej pożądane rozwiązanie
http://framework.zend.com/manual/2.0/en/mo...autoloader.html - dosyć podobny do Symfony

pozdrawiam,
Piotr
memory
Cytat
nie wymyślaj koła na nowo!

eh...

https://github.com/php-fig/fig-standards/bl...cepted/PSR-0.md

Tutaj jest przykładowa prawidłowa implementacja autloadera
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.