Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: autoload в MVC

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: учусь...
Colorado
Отправлено: 19 Февраля, 2015 - 01:32:31
Post Id


Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Февр. 2015  


Помог: 0 раз(а)




Это моё первое в жизни "шопопало" и явно в логике где-то дырка.

Хочу принцессу, пол царства и что бы подгружать автоматом классы из допустимого массива классов $classes и допустимого массива директорий $dirs.
Оно работает, но не могу поверить, что сказка наступила!!!! Хм

1) Где подвох?
2) Имеет ли право такой роутер на жизнь в MVC?
3) Чего бы ему еще такого надо доделать, что бы дальше жизнь была маслом?

Код такой:
PHP:
скопировать код в буфер обмена
  1.  
  2. // класс Router вызывается из index.php и находится в папке Core
  3.  
  4. class Router{
  5.     private $className;
  6.     private static $classes = array(
  7.         'controller',
  8.         'model',
  9.         'view',
  10.         'main',
  11.         'catalog',
  12.         'default',
  13.         'errors',
  14.     );
  15.     private static $dirs = array(
  16.         'core',
  17.         'controller',
  18.         'model',
  19.         'view',
  20.         'libs'
  21.     );
  22.  
  23.  
  24.     function __construct(){
  25.         $this-> getURL();
  26.         $this-> getPath();
  27.         $class = new $this->className;
  28.     }
  29.  
  30. // ловим ссылку и проверяем, допустимо ли имя класса, если нет - 404.
  31.  
  32.    function getURL(){
  33.        $url=$_GET['url'];
  34.        $url=explode('/',$url);
  35.  
  36.        if(isset($url[0]) &&  in_array($url[0],self::$classes)){
  37.            $this->className = $url[0];
  38.        } else { $this->className = 'errors';}
  39.        return  $this->className;
  40.    }
  41.  
  42. // перебираем все допустимые папочки и подставляем полученный className, если такой файл есть - включаем его в дело.
  43.  
  44.    function getPath(){
  45.       $dirs = self::$dirs;
  46.        
  47.       foreach ($dirs as $dir){
  48.            $path = $dir.'/'.$this->className.'_'.$dir.'.php';
  49.            if(file_exists($path))
  50.            include_once $path;
  51.        }
  52.    }
  53. }
  54.  
 
 Top
Anguis
Отправлено: 19 Февраля, 2015 - 09:28:59
Post Id



Частый гость


Покинул форум
Сообщений всего: 253
Дата рег-ции: Июнь 2012  


Помог: 2 раз(а)




Что то я не вижу здесь autoload совсем.
С виду банальный инклуд по url Радость
Смысл?
 
 Top
exlant
Отправлено: 19 Февраля, 2015 - 12:15:54
Post Id



Посетитель


Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015  


Помог: 14 раз(а)




я так авто-подключаю классы..
если не сложно, укажите на допущенные ошибки!
я только учусь!
PHP:
скопировать код в буфер обмена
  1.  
  2. // название класса dirPatch_nameOfFile разбивается по сепаратору "_" на папку(ки) где содержится файл с классом, и на имя файла с классом
  3. // слева папка(ки), справа последний имя файла  
  4. // файл имеет разрешение .class.php
  5. class spl_autoload{                         // класс автозагрузки классов по вызову, подгружаются и родительские классы
  6.  
  7.     static function autoload($class_name){      // метод, который запускается при вызове нового объекта
  8.        
  9.         $filename = self::loadpatch($class_name);
  10.                
  11.         if(file_exists($filename)){ //если файл с классом существует инклудим его
  12.             require_once $filename;
  13.             return TRUE;
  14.         }
  15.         trigger_error('Класс '.$class_name.' не найден по пути: '.$filename, E_USER_ERROR); //если не найден FATAL ERROR и выход из скрипта
  16.         return NULL;
  17.     }
  18.    
  19.     static function loadpatch($class_name){            
  20.         $stack = explode(DOMEN_PATCH,__DIR__);        // создаем абсолютный путь к папке с сайтом, константа DOMEN_PATCH содержит название папки с сайтом
  21.         $class_patch = str_replace('_',DIRECTORY_SEPARATOR,$class_name); // меняем "_" на DIRECTORY_SEPARATOR, если нет "_" значит файл будет в главной папке
  22.         $patch = $stack[0].DOMEN_PATCH.DIRECTORY_SEPARATOR.$class_patch.'.class.php'; // склеиваем путь к файлу!
  23.        
  24.         return $patch;
  25.     }
  26. }
  27. spl_autoload_register(array('spl_autoload','autoload'));
  28.  
 
 Top
exlant
Отправлено: 19 Февраля, 2015 - 21:17:46
Post Id



Посетитель


Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015  


Помог: 14 раз(а)




что никто не поправит код?????
 
 Top
Sail
Отправлено: 20 Февраля, 2015 - 08:19:55
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




exlant пишет:
что никто не поправит код?????

Оно ведь корректно работает и отвечает требованиям решаемых Вами задач?
А в качестве пищи для размышлений есть, например, следующая информация:
Битва стандартов: PSR-0 против PSR-4
Перевод стандартов PSR-0, PSR-1, PSR-2, PSR-3, PSR-4
Example Implementations of PSR-4
и другие[dot][dot][dot]
 
 Top
exlant
Отправлено: 21 Февраля, 2015 - 00:07:34
Post Id



Посетитель


Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015  


Помог: 14 раз(а)




Да, корректно работает.
Спасибо за ссылки, ознакомился! Буду иметь ввиду!
С namespacame пока еще не сталкивался.. А стандартам пусть на работе обучают, как и фреймворкам, и кмсам, какие там будут нужны)))
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Напишите за меня, пожалуйста »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB