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 :: MVC PHP

 PHP.SU

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


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

> Без описания
maragon
Отправлено: 22 Февраля, 2016 - 09:42:33
Post Id



Посетитель


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


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




Приветствую. Много гуглил, читал, смотрел о паттерне.
Решил реализовать и попробовать.

Единая точка входа, далее:
Index.php
PHP:
скопировать код в буфер обмена
  1.  
  2. define('ROOT', dirname(__FILE__));
  3. require_once(ROOT . '/classes/Loader.php');
  4. $router = new Router();
  5. if(($display = $router->run()) !== false){
  6. print $display;
  7. } else {
  8. header("HTTP/1.0 404 Not Found");
  9. }
  10.  


Loader.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. set_include_path(ROOT . '/classes' . PATH_SEPARATOR .
  4.                                 ROOT . '/modules' . PATH_SEPARATOR .  
  5.                                 get_include_path());
  6. function __autoload($class_name)
  7. {
  8.     $file_name = str_replace('_', '/', $class_name) . '.php';
  9.     $result = include_once($file_name);
  10.     return $result;
  11. }
  12. ?>
  13.  


Controller.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. /**
  4. *       Класс для работы с контроллерами
  5. */
  6. class Controller {
  7.  
  8.         /**
  9.         *       Получаем контроллер вызываемого модуля
  10.         */
  11.         public function get($module, $action){
  12.         $controller_class = ucfirst($module) . '_Controller';
  13.         $file_controller = ROOT . '/modules/'. $module .'/Controller.php';
  14.          
  15.         if(!file_exists($file_controller)){
  16.         //die ('Файл контроллера ' . $controller . ' не найден');
  17.         return false;
  18.         }
  19.        
  20.         include_once($file_controller);
  21.        
  22.         if(class_exists($controller_class)){
  23.         $controller = new $controller_class();
  24.         }
  25.        
  26.         if (is_callable(array($controller_class, $action)) == false) {
  27.     //die ('Метод ' . $action . ' не найден в контроллере ' . $controller_class);
  28.         return false;
  29.         }
  30.        
  31.         return $controller->$action();
  32.         }
  33.        
  34. }
  35.  


Model.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. /**
  4. *       Класс для работы с моделями
  5. */
  6. class Model {
  7.  
  8.         protected $db;
  9.          
  10.         public function __construct(){
  11.         $this->db = new Database();
  12.         }
  13.        
  14.         /**
  15.         *       Получаем модель вызываемого модуля
  16.         */
  17.         public function get($module){
  18.         $model_class = $module;
  19.         $file_model = ROOT . '/modules/'. $module .'/Model.php';
  20.        
  21.         if(!file_exists($file_model)){
  22.         //die ('Файл модели ' . $module . ' не найден');
  23.         return false;
  24.         }
  25.        
  26.         include_once($file_model);
  27.        
  28.         if(class_exists($model_class)){
  29.         $model = new $model_class();
  30.         }
  31.        
  32.         return $model;
  33.         }
  34.        
  35. }
  36.  


Router.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. /**
  4.         Класс роутера
  5. */
  6. class Router {
  7.        
  8.         protected $request;
  9.         protected $controller;
  10.         protected $model;
  11.        
  12.         public function __construct(){
  13.                 $this->request = new Request();
  14.                 $this->controller = new Controller();
  15.                 $this->model = new Model();
  16.         }
  17.        
  18.         public function run(){
  19.                 $module = $this->request->get('module');
  20.                 $module = preg_replace('/[^A-Za-z0-9]+/', '', $module);
  21.                 $module = strtolower($module);
  22.                
  23.                 $action = $this->request->get('action');
  24.                 $action = preg_replace('/[^A-Za-z0-9]+/', '', $action);
  25.                
  26.                 if(empty($module)){
  27.                 $module = 'main';
  28.                 }
  29.                
  30.                 if(empty($action)){
  31.                 $action = 'Index';
  32.                 }
  33.                
  34.                 return $this->controller->get($module, $action);
  35.         }
  36.        
  37. }
  38.  


Класс шаблонизатора и дб прикладывать не буду, посколько смысл вопроса к ним не относится.
1. На данном этапе проектирование может я чего-то упустил?
2. Мне не нравится как реализован контроллер вызываемого модуля. Возможно-ли переделать?

Действия:
1. Пришел пользователь на страницу - роутер смотрит урл и подключает нужный контроллер и модель
2. Сам контроллер (если допустим мы на главной):
PHP:
скопировать код в буфер обмена
  1.  
  2. class Main_Controller extends Controller {
  3.        
  4.         protected $main;
  5.         function __construct(){
  6.         $this->main = new Main_Model();
  7.         }
  8.        
  9.         public function Index(){
  10.         print_r($this->main->get_array());
  11.         return 'main controller - index;)';
  12.         }
  13.        
  14.         public function Test(){
  15.         return 'main controller - test ;)';
  16.         }
  17. }
  18.  


3. Модель
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class Main_Model extends Model {
  4.         public function get_array(){
  5.         echo 'Модель Main<br>';
  6.         return array(1 => 'a', 2 => 'b');
  7.         }
  8. }
  9.  


Возможно ли отказаться от __construct() в контроллере модуля?
Слышал о Signleton и Instance, но пока не представляю как это сделать.
Что я еще упустил? Всем спасибо! Улыбка


-----
https://vk[dot]com/tvoycase_ru - Твой чехол со своим дизайном
 
 Top
LIME
Отправлено: 22 Февраля, 2016 - 09:52:00
Post Id


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


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


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




maragon пишет:
require_once(ROOT . '/classes/Loader.php');
не дочитал до конца
сразу ... изучать autoload
лучше spl autoload
еще лучше psr и composer autolod
... читаем далее ...
maragon пишет:
function __autoload($class_name)

часть вопросов сняли))..
maragon пишет:
return $result;
в автолоадере? серьезно? фуфу
только инклуд
лучше require
maragon пишет:
Возможно ли отказаться от __construct() в контроллере модуля?
зачем?
конструктор нужен для инстанциации сущьности
зачем от него отказываться?
------
моя душа не выдержала дальнейшего чтения
полная каша
сорь))
(Добавление)
что не получается? в чем затык?
если все ок то все ок
(Добавление)
maragon пишет:
Слышал о Signleton и Instance,
забудь немедленно
чаще всего новички его пользуют не по делу
когда понадобится вспомнишь
 
 Top
maragon
Отправлено: 22 Февраля, 2016 - 10:02:54
Post Id



Посетитель


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


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




1. Про контроллер разжували - спасибо!
2. Про Loader.php понял.

Цитата:

лучше spl autoload
еще лучше psr и composer autolod

- Почитаю, попробую.

А в чем собсно каша? Однако
На ошибках так скачать и учатся, мало адекватных и разжеванных примеров в сети, оперировался, вроде бы, на статью об MVC от пользователя EuGen.


-----
https://vk[dot]com/tvoycase_ru - Твой чехол со своим дизайном
 
 Top
LIME
Отправлено: 22 Февраля, 2016 - 10:10:50
Post Id


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


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


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




maragon пишет:
На ошибках так скачать и учатся
в том и дело
к сожалению первоначально надо поспотыкаться о грабли
потом пойдут более конкрентные вопросы
maragon пишет:
на статью об MVC от пользователя EuGen.
а мне не понравилось
хотя для начала очень хорошо
по сабжу - не надо искать ООП ради ООП
почитай месяц другой материал об ООП
рекомендую Макконелл "Совершенный код"
Зандстра "PHP Объекты, шаблоны и методики программирования" - немного устарела в главах про инструментарий но очень хороша в паттернах и методиках в целом
(Добавление)
maragon пишет:
А в чем собсно каша?
долго объяснять
(Добавление)
LIME пишет:
почитай месяц другой материал об ООП
рекомендую Макконелл "Совершенный код"
Зандстра "PHP Объекты, шаблоны и методики программирования" - немного устарела в главах про инструментарий но очень хороша в паттернах и методиках в целом
это наиболее быстрый и легкий способ перейти из junior в middle
наберись терпения на пару-тройку месяцев(в лучшем случае)
 
 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