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 :: Куда запихнуть автолоадер моделей?

 PHP.SU

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


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

> Без описания
razorg1991
Отправлено: 12 Мая, 2014 - 22:04:52
Post Id


Частый гость


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


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




В общем начинаю осваивать ООП, пытаюсь написать что-то вроде учебной CMS (по канонам MVC Радость ).
Сделал следующее:
1. Создал структуру папок (models/, controllers/, templates/default/veiws/)
2. Создал файл конфига в корне (подключение к БД, пути к папкам шаблона и т.д.)
3. index.php - точку входа (в корне) Сейчас index выглядит так:

PHP:
скопировать код в буфер обмена
  1.  
  2. //запрет прямого доступа
  3.     define('AVTO', TRUE);
  4.    
  5.     //автозагрузчик контроллеров
  6.      function autoloadController($className) {
  7.      $filename = "controllers/" . $className . "Controller.php";
  8.      if (is_readable($filename)) { require $filename; }
  9.      }
  10.      spl_autoload_register("autoloadController");
  11.    
  12.     //подключение конфигурации
  13.         require_once 'config.php';
  14.          
  15.     $obj = new One;
  16.     echo $obj->properity;
  17.  


Для теста в конце вывел одно свойство контроллера - автозагрузчик работает.
Вот теперь пока ума не приложу куда впихнуть автолоадер моделей? Не понял Из индекса по MVC должен вызываться только контроллер же?

Есть идея создать отдельный контроллер-автолоадер моделей (что-то вроде родительского класса), а потом от него наследовать все остальные классы-контроллеры. Напрягает только одно - что при таком варианте постоянно придется писать extends, что по-моему не совсем красиво Хм

Подскажите пожалуйста, я немного в растерянности.

(Отредактировано автором: 12 Мая, 2014 - 22:06:36)

 
 Top
Zuldek
Отправлено: 13 Мая, 2014 - 12:43:53
Post Id


Постоянный участник


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


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




Какой автолоадер моделей?
Модели вызываются из контроллеров какой автолоадер вы для них хотите ещё?
 
 Top
Panoptik
Отправлено: 13 Мая, 2014 - 14:48:22
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


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




во первых наследование от класса не решит проблему автолоада
нужно писать один автолоадер для всех компонентов вашего приложения, через 2 пинка вы устанете переподключать автолоадеры при каждом чихе

выработайте неймспейсы для ваших классов и опишите это в автолоадере и всё

что-то типа такого
для структуры папок /models /controllers
PHP:
скопировать код в буфер обмена
  1.  
  2. class Base {
  3.  
  4.   static private $_autoloadPaths = array(
  5.      'models/*',
  6.      'controllers/*',
  7.   );
  8.  
  9.   static public function import($path) {
  10.      self::$_autoloadPaths[] = $path;
  11.   }
  12.  
  13.   static public function autoload($className) {
  14.      foreach(self::$_autoloadPaths as $path) {
  15.         $pathComponents = explode('/', $path);
  16.         $last = end($pathComponents);
  17.         if($last == '*') {
  18.           $tryPath = str_replace('*', $className, $path);
  19.           if(file_exists($tryPath) {
  20.             require($tryPath);
  21.             break;
  22.           }
  23.         } elseif($last == $className) {
  24.           require($path);
  25.           break;
  26.         }
  27.      }
  28.   }
  29.  
  30. }
  31.  


класс находится в корне ваших директорий контролеров и моделей
через импорт можно включить дополнительные классы которые находятся не в стандартных папках

писал прям тут, так что за работоспособность не отвечаю, но как вариант реализации можно рассмотреть

+ тут еще непаханное поле для доработок и улучшений. всё зависит от ваших желаний и требований


-----
Just do it
 
 Top
IllusionMH
Отправлено: 13 Мая, 2014 - 16:19:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


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




razorg1991, проверяйте названия классов и по ним выбирайте из какой папки грузить файл. Для моделей можно "требовать" Model в конце. И если имя класса заканчивается на Model тогда и искать его в папке моделей.
 
 Top
DelphinPRO
Отправлено: 13 Мая, 2014 - 17:06:18
Post Id



Активный участник


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


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




spl позволяет регистрировать несколько автозагрузчиков.
Можно этим воспользоваться.
PHP:
скопировать код в буфер обмена
  1. class Autoloader {
  2.         const $ROOT = 'path/to/root/directory'
  3.         public static function loadControllers ($classname) {
  4.                 if (file_exists(self::$ROOT . '/controllers/' . $classname . '.php')) {
  5.                         require self::$ROOT . '/controllers/' . $classname . '.php';
  6.                 }
  7.         }
  8.         public static function loadModels ($classname) {
  9.                 if (file_exists(self::$ROOT . '/models/' . $classname . '.php')) {
  10.                         require self::$ROOT . '/models/' . $classname . '.php';
  11.                 }
  12.         }
  13. }
  14.  
  15. // подключаем файл с автозагрузчиком
  16. require 'path/to/Autoloader.php';
  17.  
  18. // регистрируем две функции автозагрузки
  19. spl_autoload_register(array('Autoloader', 'loadControllers'));
  20. spl_autoload_register(array('Autoloader', 'loadModels'));
  21.  
  22. // Дальше не паримся, а просто используем классы, там где они нужны
  23.  
  24. $controller = new IndexController();
  25.  
  26. $model = new SuperModel();


Но такой вариант более подходит для особо запущенных случаев Улыбка

В данном простом случае, видимо, лучше определить пространства имен типа
\controllers\IndexController
\models\SuperModel
и использовать примитивный загрузчик, код которого можно найти в документации на php.net в разделе про автозагрузку (или неймспейсы, не помню)


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
razorg1991
Отправлено: 13 Мая, 2014 - 19:34:28
Post Id


Частый гость


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


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




DelphinPRO, а вот Ваш вариант мне очень понравился Улыбка
Видимо так и поступлю. Достаточно тогда еще в index подключить файл автолоада и все.
(Добавление)
razorg1991 пишет:
DelphinPRO, а вот Ваш вариант мне очень понравился Улыбка
Видимо так и поступлю. Достаточно тогда еще в index подключить файл автолоада и все.


Получилось в индексе вот что:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4.     //проверка версии php
  5.     if (version_compare(PHP_VERSION, '5.3.1', '<'))
  6.     {
  7.         die('Ваш хостинг должен поддерживать версию php 5.3.1 и выше для запуска AVTOCMS!');
  8.     }
  9.  
  10.     //запрет прямого доступа
  11.     define('AVTO', TRUE);
  12.    
  13.     //подключение автозагрузчика контроллеров и моделей
  14.     require_once 'includes/autoloader.php';
  15.    
  16.     //регистрация функций автозагрузки
  17.     spl_autoload_register(array('Autoloader', 'loadControllers'));
  18.     spl_autoload_register(array('Autoloader', 'loadModels'));
  19.    
  20.      
  21.    
  22.     //подключение конфигурации
  23.         require_once 'config.php';
  24.  
  25. ?>
  26.  


Только я вот теперь не пойму, что написать еще в index.php, ведь браузер же ничего не выведет, он же не знает какой контроллер мне нужен в данный момент?! Не понял
Нужен же типа "запуск приложения". Я снова в тупике
(Добавление)
razorg1991 пишет:
DelphinPRO, а вот Ваш вариант мне очень понравился Улыбка
Видимо так и поступлю. Достаточно тогда еще в index подключить файл автолоада и все.


Получилось в индексе вот что:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4.     //проверка версии php
  5.     if (version_compare(PHP_VERSION, '5.3.1', '<'))
  6.     {
  7.         die('Ваш хостинг должен поддерживать версию php 5.3.1 и выше для запуска AVTOCMS!');
  8.     }
  9.  
  10.     //запрет прямого доступа
  11.     define('AVTO', TRUE);
  12.    
  13.     //подключение автозагрузчика контроллеров и моделей
  14.     require_once 'includes/autoloader.php';
  15.    
  16.     //регистрация функций автозагрузки
  17.     spl_autoload_register(array('Autoloader', 'loadControllers'));
  18.     spl_autoload_register(array('Autoloader', 'loadModels'));
  19.    
  20.      
  21.    
  22.     //подключение конфигурации
  23.         require_once 'config.php';
  24.  
  25. ?>
  26.  


Только я вот теперь не пойму, что написать еще в index.php, ведь браузер же ничего не выведет, он же не знает какой контроллер мне нужен в данный момент?! Не понял
Нужен же типа "запуск приложения". Я снова в тупике
(Добавление)
razorg1991 пишет:
DelphinPRO, а вот Ваш вариант мне очень понравился Улыбка
Видимо так и поступлю. Достаточно тогда еще в index подключить файл автолоада и все.


Получилось в индексе вот что:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4.     //проверка версии php
  5.     if (version_compare(PHP_VERSION, '5.3.1', '<'))
  6.     {
  7.         die('Ваш хостинг должен поддерживать версию php 5.3.1 и выше для запуска AVTOCMS!');
  8.     }
  9.  
  10.     //запрет прямого доступа
  11.     define('AVTO', TRUE);
  12.    
  13.     //подключение автозагрузчика контроллеров и моделей
  14.     require_once 'includes/autoloader.php';
  15.    
  16.     //регистрация функций автозагрузки
  17.     spl_autoload_register(array('Autoloader', 'loadControllers'));
  18.     spl_autoload_register(array('Autoloader', 'loadModels'));
  19.    
  20.      
  21.    
  22.     //подключение конфигурации
  23.         require_once 'config.php';
  24.  
  25. ?>
  26.  


Только я вот теперь не пойму, что написать еще в index.php, ведь браузер же ничего не выведет, он же не знает какой контроллер мне нужен в данный момент?! Не понял
Нужен же типа "запуск приложения". Я снова в тупике
(Добавление)
razorg1991 пишет:
DelphinPRO, а вот Ваш вариант мне очень понравился Улыбка
Видимо так и поступлю. Достаточно тогда еще в index подключить файл автолоада и все.


Получилось в индексе вот что:

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4.     //проверка версии php
  5.     if (version_compare(PHP_VERSION, '5.3.1', '<'))
  6.     {
  7.         die('Ваш хостинг должен поддерживать версию php 5.3.1 и выше для запуска AVTOCMS!');
  8.     }
  9.  
  10.     //запрет прямого доступа
  11.     define('AVTO', TRUE);
  12.    
  13.     //подключение автозагрузчика контроллеров и моделей
  14.     require_once 'includes/autoloader.php';
  15.    
  16.     //регистрация функций автозагрузки
  17.     spl_autoload_register(array('Autoloader', 'loadControllers'));
  18.     spl_autoload_register(array('Autoloader', 'loadModels'));
  19.    
  20.      
  21.    
  22.     //подключение конфигурации
  23.         require_once 'config.php';
  24.  
  25. ?>
  26.  


Только я вот теперь не пойму, что написать еще в index.php, ведь браузер же ничего не выведет, он же не знает какой контроллер мне нужен в данный момент?! Не понял
Нужен же типа "запуск приложения". Я снова в тупике
(Добавление)
Чето сайт тупит, извиняюсь повторные сообщения
(Добавление)
Чето сайт тупит, извиняюсь повторные сообщения
(Добавление)
Чето сайт тупит, извиняюсь повторные сообщения
 
 Top
DelphinPRO
Отправлено: 14 Мая, 2014 - 07:31:49
Post Id



Активный участник


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


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




razorg1991 пишет:
Только я вот теперь не пойму, что написать еще в index.php, ведь браузер же ничего не выведет, он же не знает какой контроллер мне нужен в данный момент?! Не понял
Нужен же типа "запуск приложения". Я снова в тупике


Пора вам узнать такие страшные слова как "роутер", "фронт-контроллер". загуглите.

Вкратце. Роутер анализирует адресную строку (в случае использования mod_rewrite) или GET-параметры, и на их основании определяет, какой из контроллеров должен обработать запрос, и каким из своих методов.

Например имеем запрос типа /posts/display/1
Значит нам нужно вызвать метод display() класса PostsController
Правило условное, вы можете придумать какую угодно адресацию.

Подсказка. на github.com можно найти полно готовых роутеров разной сложности, и либо полностью использовать у себя ( с учетом лиценцзии ;) ), либо просто подсмотреть идеи реализации.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
razorg1991
Отправлено: 16 Мая, 2014 - 20:57:41
Post Id


Частый гость


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


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




DelphinPRO Спасибо огромное за подсказки Улыбка
Хотел отправить "Спасибо" в карму, но не дает, говорит "у вас недостаточно сообщений для данной операции"

Поэтому выражаю свою благодарность здесь Улыбка
 
 Top
wh0am1
Отправлено: 25 Мая, 2014 - 20:53:01
Post Id


Новичок


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


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




Я использую следующую конструкцию:

Сам автолоадер: http://code[dot]wh0am1[dot]ru/uR5
Пример системной модели: http://code[dot]wh0am1[dot]ru/uxo
Пример пользовательской модели: http://code[dot]wh0am1[dot]ru/16k

И использую модель так:
PHP:
скопировать код в буфер обмена
  1.  
  2. $this->category->getList();
  3. $this->uitils->method();
  4.  
 
 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