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.SU

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


 Страниц (4): [1] 2 3 4 »   

> Без описания
Fedak.o.b
Отправлено: 26 Сентября, 2012 - 10:38:54
Post Id



Новичок


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


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




Есть необходисомость построить ядро системы на MVC.

По моем понимание MVC построил ядро так:

index.php
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. if (version_compare(phpversion(), '5.1.0', '<') == true) { die ('PHP5.1 Only'); }
  4.  
  5.  
  6. // The PHP file extension
  7. define('EXT', '.php');
  8.  
  9. //
  10. define ('SEP', DIRECTORY_SEPARATOR);
  11.  
  12. // Узнаём путь до файлов сайта
  13. $sitepath = realpath(dirname(__FILE__) . SEP . '..' . SEP) . SEP;
  14.  
  15. //
  16. define ('SITEPATH', $sitepath);
  17.  
  18. require_once 'core' . SEP . 'Controller' . EXT;
  19.  



Controller.php
PHP:
скопировать код в буфер обмена
  1. require_once 'core' . SEP . 'Gent' . EXT;
  2.  
  3. require_once 'core' . SEP . 'Router' . EXT;
  4.  
  5. class Controller extends Router
  6. {
  7.     public function __construct()
  8.     {
  9.         parent::__construct();
  10.        
  11.     }
  12. }
  13.  
  14. new Controller();



Router.php
PHP:
скопировать код в буфер обмена
  1.  
  2. class Router extends Load
  3. {
  4.     public $module_name;
  5.    
  6.     public function __construct()
  7.     {
  8.  
  9.         $this->module_name= $this->Request->getController();
  10.         //$this->router_action = $this->request->getAction();
  11.  
  12.         //
  13.         $this->loadController->($this->module_name);
  14.     }
  15. }
  16.  



Load.php
PHP:
скопировать код в буфер обмена
  1.  
  2. /**
  3.  * Класс автоматическое создает объект
  4.  */
  5.  
  6. require_once 'core' . SEP . 'Registry' . EXT;
  7.  
  8. class Load extends Registry
  9. {
  10.     private static $objects = array();
  11.    
  12.     public function __construct() {}
  13.  
  14.     /**
  15.      * Магический метод, создает нужный объект
  16.      */
  17.     public function __get($name)
  18.     {
  19.         // Если такой объект уже существует, возвращаем его
  20.         if(isset(self::$objects[$name]))
  21.         {
  22.             return(self::$objects[$name]);
  23.         }
  24.        
  25.         $class_name = $name;
  26.        
  27.         include 'core' . SEP . $class_name . EXT;
  28.  
  29.         self::$objects[$name] = new $class_name();
  30.  
  31.         // Возвращаем созданный объект
  32.         return self::$objects[$name];
  33.     }
  34. }
  35.  



Registry.php
PHP:
скопировать код в буфер обмена
  1.  
  2. class Registry
  3. {
  4.     protected static $store = array();
  5.     protected function __construct() {}
  6.     protected function __clone() {}
  7.    
  8.     public static function exists($name)
  9.     {
  10.         return isset(self::$store[$name]);
  11.     }
  12.    
  13.     public static function get($name)
  14.     {
  15.         return (isset(self::$store[$name])) ? self::$store : null;
  16.     }
  17.    
  18.     public static function set($name, $obj)
  19.     {
  20.         return self::$store[$name] = $obj;
  21.     }
  22.    
  23.     public static function remove($name)
  24.     {
  25.         unset(self::$store[$name]);
  26.     }
  27. }
  28.  



Request.php
PHP:
скопировать код в буфер обмена
  1.  
  2. // http://amdy.su/class-request/
  3.  
  4. class Type {
  5.     const T_ARRAY = 'array';
  6.     const T_BOOLEAN = 'boolean';
  7.     const T_INTEGER = 'integer';
  8.     const T_FLOAT = 'float';
  9.     const T_STRING = 'string';
  10.     const T_OBJECT = 'object';
  11.     static public function toArray($value) {
  12.         return (array) $value;
  13.     }
  14.     static public function toBoolean($value) {
  15.         return (boolean) $value;
  16.     }
  17.     static public function toInteger($value) {
  18.         return (int) $value;
  19.     }
  20.     static public function toFloat($value) {
  21.         return (float) str_replace(',', '.', $value);
  22.     }
  23.     static public function toString($value) {
  24.         return (string) $value;
  25.     }
  26.     static public function toObject($value) {
  27.         return (object) $value;
  28.     }
  29. }
  30.  
  31. class Request {
  32.     private $_url;
  33.     private $_part = array();
  34.     private static $_instance;
  35.     protected $_controller;
  36.     protected $_action;
  37.     /**
  38.      * @param string $url
  39.      * @return Request
  40.      */
  41.     public static function singleton($url = null) {
  42.         if (!self::$_instance) {
  43.             self::$_instance = new Request($url);
  44.         }
  45.         return self::$_instance;
  46.     }
  47.     public function __construct($url = null) {
  48.         if (!$url) {
  49.             $url = $_SERVER['REQUEST_URI'];
  50.         }
  51.         $this->_url = urldecode($url);
  52.         $this->_part = array();
  53.         foreach (explode('/', $this->_url) as $k => $v) {
  54.             if (!empty($v)) {
  55.                 $v = explode(':', $v);
  56.                 if (!isset($v[1])) {
  57.                     $this->_part[] = $v[0];
  58.                 } else {
  59.                     $this->_part[$v[0]] = implode(':', array_slice($v, 1));
  60.                 }
  61.             }
  62.         }
  63.         $this->_controller =  $this->get(0, 'main');
  64.         if (!preg_match('~^[a-z]+[a-z0-9_-]*$~', $this->_controller)) {
  65.             $this->_controller = 'error'; // 'error'
  66.         }
  67.         $this->_action =  $this->get(1, 'main');
  68.         if (!preg_match('~^[a-z]+[a-z0-9_-]*$~', $this->_action)) {
  69.             $this->_action = 'error404';
  70.         }
  71.     }
  72.     /**
  73.      * return value from request
  74.      *      get(0),
  75.      *      get(0, 'default', Type::T_STRING)
  76.      *      get('test', 0, Type::T_INTEGER)
  77.      * @param string $key
  78.      * @param mixed $default
  79.      * @param string $type
  80.      * @return mixed
  81.      */
  82.     public function get($key, $default = null, $type = null) {
  83.         if (isset($this->_part[$key])) {
  84.             if ($type) {
  85.                 if (!is_array($type)) {
  86.                     return call_user_func_array(array('Type', 'to'.ucfirst($type)), array($this->_part[$key]));
  87.                 } else {
  88.                     return call_user_func_array(array('Type', 'to'.ucfirst($type[0])), array($this->_part[$key])+$type[1]);
  89.                 }
  90.             } else {
  91.                 return $this->_part[$key];
  92.             }
  93.         } else {
  94.             if (is_object($default) && $default instanceof Exception) {
  95.                 throw $default;
  96.             } else {
  97.                 return $default;
  98.             }
  99.         }
  100.     }
  101.     public function has($key) {
  102.         return isset($this->_part[$key]);
  103.     }
  104.     public function getController() {
  105.         return $this->_controller;
  106.     }
  107.     public function getAction() {
  108.         return $this->_action;
  109.     }
  110.     public function isAjax() {
  111.         if ($this->get('ajax') == 1) {
  112.             return true;
  113.         } elseif (isset($_SERVER['HTTP_X_REQUESTED_WITH'])
  114.                 && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
  115.             return true;
  116.         } else {
  117.             return false;
  118.         }
  119.     }
  120. }
  121.  



Подскажите, что может не правильно построено (лучше знать изначально)
В дальнейшем есть желание прикрутить ORM propel и Смарти.
Но пока не могу логически спроектировать взаимодействия в самом начале, много мыслей и не знаю какие с них правильные а какие нет.

Дальнейшее развитие вижу в в классе "Router", так что он передает параметры классу (он еще не создан), которые будет загружать необходимый модуль с триадой (MVC).
 
 Top
digi
Отправлено: 26 Сентября, 2012 - 12:00:32
Post Id


Посетитель


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


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




1) один файл = один класс и больше ничего!, например:

PHP:
скопировать код в буфер обмена
  1. namespace MyApp;
  2.  
  3. use MyFramework\Mvc\Controller;
  4. use MyFramework\Http\Response;
  5.  
  6. class HelloController extends Controller
  7. {
  8.     public function helloAction($name)
  9.     {
  10.         return new Response('Hello '. $name);
  11.     }
  12. }


2) вместо require_once следует юзать автозагрузки классов с кешированием в АРС.

3) к шаблонизатору следует присмотреться к Twig.
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Сентября, 2012 - 12:03:25
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




digi пишет:
один файл = один класс
не всегда - возможно и несколько структур в одном файле, если оные жить друг без друга не могут и это нативно понятно.
 
 Top
digi
Отправлено: 26 Сентября, 2012 - 12:06:42
Post Id


Посетитель


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


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




смотря какие цели у человека Улыбка если научиться правильно программировать, то один файл = один класс, а если побаловаться, то конечно есть много вариантов Улыбка
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Сентября, 2012 - 12:07:09
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




digi пишет:
к шаблонизатору следует присмотреться к ...
PHP )))
Тем не менее давайте не будем холиварить тут на тему шаблонизаторов.
Автору вопроса я показал всего лишь что - сколько людей, столько и мнений.

И еще я считаю, чем проще приложение, тем лучше. И я бы удалял в том же Zend или в Symfony все файлы, которые не будут использоваться в конечном приложении.
(Добавление)
digi пишет:
побаловаться
Я не говорил о баловстве. Я вполне серьезно. Большое кол-во файлов тоже играет роль в производительности.
Вот простой пример, раньше я хостил прямо с малыша-лаптопа Compaq mini. Так вот зендяра там еле шевелился. В отличии от конечных приложений типа тяжелого ванилла-форумс.
 
 Top
digi
Отправлено: 26 Сентября, 2012 - 15:55:35
Post Id


Посетитель


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


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




DeepVarvar пишет:
Тем не менее давайте не будем холиварить тут на тему шаблонизаторов.
Автору вопроса я показал всего лишь что - сколько людей, столько и мнений.


холиварить конечно ненадо Улыбка ТС-у достаточно будет погуглить и найти статьи, где описывается почему следует юзать шаблонизаторы, либо их РНР-нативные аналоги (например https://github.com/symfony/Templating), а не заниматься взрывом мозга решая задачи наследования и экранирования.

простота бывает разной... внешняя и внутренняя, как правило внутренняя "простота" тесно граничит с ограниченностью функционала, а вот внешне решение должно быть простым, это да Улыбка

производительность следует изменять не "кол-вом файлов", а бенчмарками на готовом продакшын сервере, где грамотно применяются все механизмы кеширования.

но важнее в наше время это производиительность программиста т.к. железо стоит дешевле работы человека.
 
 Top
KingStar
Отправлено: 26 Сентября, 2012 - 16:22:32
Post Id



Участник


Покинул форум
Сообщений всего: 1889
Дата рег-ции: Авг. 2011  
Откуда: Беларусь


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




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


-----
То что программа работает, не означает что она написана правильно!
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Сентября, 2012 - 16:30:03
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




KingStar пишет:
php - лучший шаблонизатор
+1
digi пишет:
производительность следует изменять не "кол-вом файлов", а бенчмарками на готовом продакшын сервере, где грамотно применяются все механизмы кеширования
А без кеша уже моветон? Радость
Напоминает это товарисча Каганова:
Цитата:
С точки зрения пользователя, чем Win98 отличается от XP и Vista? Да ничем. Поменялись фонты, шрифты, рисунки на кнопочках, понимает теперь чуть больше оборудования и умеет монтировать флэшки? Я, пользователь, работаю с прикладными программами, а они остались прежними и вообще не имеют отношения к системе. Они любые (за редким исключением) точно так же запускаются под любой совместимой версией ОС - хоть под Win98, хоть под Vista. Так с какого перепуга XP тормозит в два раза больше, чем Win98, а Vista - в три раза тормознее, чем XP? Что это? Рисунки на кнопочках такие великие или умение монтировать флэшку без установки дополнительного драйвера так грузит процессор и требует лишних 256 мегов памяти?
 
 Top
digi
Отправлено: 26 Сентября, 2012 - 16:46:32
Post Id


Посетитель


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


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




пускай ТС сам разберется в вопросе что ему важно и как юзать ;) человек явно начинающий и ему надо указать как можно более "праведный" путь, а костылять еще успеет научиться ;)
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Сентября, 2012 - 16:47:43
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Вы намекаете что я показываю костыли? Радость
 
 Top
digi
Отправлено: 26 Сентября, 2012 - 17:00:24
Post Id


Посетитель


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


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




давай на "ты" Улыбка по свойски ;)

а намекаю я на то, что новичкам надо указать как "правильно", а не как "можно"...
разумеется, когда у новичка появятся вопросы "а почему вот так и так правильно, ведь можно вот так", вот тут уже начнется профессиональный рост Улыбка
 
 Top
DeepVarvar Супермодератор
Отправлено: 26 Сентября, 2012 - 17:05:58
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Оки, догворились, на "ты" Улыбка
Вобщем ТС должен тут все прочитать и надеюсь понять правильно.
 
 Top
digi
Отправлено: 26 Сентября, 2012 - 17:10:05
Post Id


Посетитель


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


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




всё верно Улыбка надо прочитать некоторые ключевые слова, погуглить, скачать, покрутить, подумать что в каждом из решений есть что-то полезное для проекта, над которым он начал работать, ну и естественно запомнить, что вообще есть на передовой в мире РНР, а дальше уже прикладывать моск и решать каким методом пользоваться в конкретной задаче.
 
 Top
Саныч Модератор
Отправлено: 26 Сентября, 2012 - 17:15:55
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


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




digi, Вы сами себе противоречите. То говорите, что человек должен сам разобраться в вопросе, то утверждаете, что ваше мнение является единственным правильным.

Шаблонизатор? Тут я соглашусь с DeepVarvar-ом и KingStar-ом, PHP - самый лучший шаблонизатор. Собственно он для этого и был создан.

А вот по MVC ничего не буду писать, т.к. сам еще немного плаваю в этой теме. Зато задам вопрос Улыбка

Как раз сейчас занимаюсь написанием сайта. Решил реализовать в нем MVC. Ну в моем понимании естественно Улыбка Я просто опишу классы, если найдете какие ошибки, замечани прошу указать.
Ну само собой в htaccess скидываем все запросы на индех.
В индексе класс Base. В нем происходит подключение файла базовых настроек, минимальная проверка их, инициализация автозагрузки, методов обработки ошибок и исключений. И создается объект класса Bootstrap
Bootstrap - создаем объект класса DB. DB - синглтон, из названия ясно, что это работа с базой. Далее в Bootstrap - создаем объект Users. В Users происходит авторизация пользователя и выборка соответствующих прав из базы. Далее в Bootstrap-е зачитываем настройки сайта из базы. Последнее создаем объект BaseController.
В BaseController определяем текущий контроллер и передаем управление ему.
Все контроллеры наследуются от BaseController-а. Также в BaseController создаем объект View - грубо говоря это наш шаблонизатор.
В контроллерах определяем нужное действие и вызываем соответсвующую модель. В моделе уже производим все основные операции, устанавливаем нужный шаблон в View, передаем данные ну и т.д. И в самом конце идет вызов метода View, который уже грузит нужный шаблон, подставляет данные и выводит результат.
Собственно все Улыбка Вот так я себе представляю все это дело.


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
caballero
Отправлено: 26 Сентября, 2012 - 17:21:29
Post Id


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


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


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




Цитата:
пускай ТС сам разберется в вопросе что ему важно и как юзать ;) человек явно начинающий и ему надо указать как можно более "праведный" путь, а костылять еще успеет научиться ;)

так чего он тогда полез писать ядро на MVC если не имеет понятия ни о то ни о другом.

как не новичек то сразу паттерны, ядра , социальные сети.
наберись опыта потом не будет вопросов где какие классы надо


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Страниц (4): [1] 2 3 4 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB