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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: MVC
Bio man
Отправлено: 04 Марта, 2012 - 16:32:18
Post Id


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


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


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




начал осваивать MVC паттерн и начал с фронт контроллера
Front (Отобразить)

чего не хватает? что лишнее? что не так?

(Отредактировано автором: 04 Марта, 2012 - 16:39:08)

 
 Top
caballero
Отправлено: 04 Марта, 2012 - 16:49:20
Post Id


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


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


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




откуда кто то может знать чего тут хватает а чего нет - все зависит от реализации. Классы не в воздухе висят
кто знает зачем нужен например getBody
а getinstamce ?
и чего там reflection делает
осваивать нужно с понимания сути предмета а не из чьего то одно частного случая реализации из стопицот возможных


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Bio man
Отправлено: 04 Марта, 2012 - 16:54:29
Post Id


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


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


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




ну вообще фронт контроллер, в общих чертах правильно реализован? допустим, верно то что в нем роутер? или часть отображения ($_body)? в боди заносится готовый контент и в бутстрепе выводится. отражение имхо очень полезная и удобная вещь, почему бы не применить?
 
 Top
etoYA
Отправлено: 04 Марта, 2012 - 17:02:14
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


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




Bio man, узнается специалист Хм Однако
 
 Top
caballero
Отправлено: 04 Марта, 2012 - 17:04:45
Post Id


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


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


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




Цитата:
ну вообще фронт контроллер, в общих чертах правильно реализован?

правильно ли нет можно узнать только о если известно что он должен дделать
очень понятие растяжимое.
нужен ли там router может нужен а может и нет
а может роутер нужен вне контроллера
кто вообще дергает роутер

и что там делает рефлексия - полезна она или нет имеет смысл в констексте вопроса зачем она, какую функцию выполняет

Цитата:
в боди заносится готовый контент

кем , а главное зачем заносится. Почему надо заносить а не вывести в выходной поток сразу
кто и когда использует body

(Отредактировано автором: 04 Марта, 2012 - 17:12:53)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
Bio man
Отправлено: 04 Марта, 2012 - 17:14:51
Post Id


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


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


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




etoYA, ага.
caballero, в общем ясно. фронт контроллер это такая "парадигма" чуть ли не как само ООП и четкого определение этому не существует. конечно я образно выразился и тут нет и доли правды но суть думаю ясна.
 
 Top
caballero
Отправлено: 04 Марта, 2012 - 17:20:12
Post Id


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


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


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




фронт контроллер обычно стоит на входе сайта
обычная задача - распарсить запрос и перенаправить вызов нужному модулю или контроллеру.
это необязательно какойто класс даже - в большинствет случаев эту функцию можно реализовать в index.php куда через htaccess направляются вызовы

должен ли например фронт контроллер отвечать за сборку страницы с шаблонов и вывод данных - зависит от реализации архитектуры
можно так можно эдак


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DelphinPRO
Отправлено: 04 Марта, 2012 - 17:32:44
Post Id



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


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


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




Bio man пишет:
чего не хватает?


не хватает
PHP:
скопировать код в буфер обмена
  1.         private function __clone()
  2.         {
  3.  
  4.         }
  5.  
  6.         private function __wakeup()
  7.         {
  8.  
  9.         }


синглтон подразумевает гарантированное наличие только одного экземпляра класса. Поэтому нужно запретить клонирование и серилизацию объекта.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Bio man
Отправлено: 04 Марта, 2012 - 17:33:26
Post Id


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


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


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




поправьте если не так.
MVC состоит из 3 логических частей:
Model - часть приложения отвечающая за бизнес логику
View - шаблоны
Controller - мост между View и Model. Front Controller это единая точка входа. отвечает за подключение контроллеров. контроллер (не фронт) отвечает за обработку входящей информации (или этим занимается модель?), за передачу информации в модель и за вывод информации на экран (контроллер агрегирует модель View и возвращает в бутстрап). так я понимаю? знаю многое не написал но пока с этим не разобрался.
(Добавление)
DelphinPRO, само собой. но это не столь важно
 
 Top
etoYA
Отправлено: 04 Марта, 2012 - 17:40:01
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


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




Bio man, я столько статей на эту тему перечитал, и сам нихрена не понял, как будет правильней их сделать.. Там пишут одно, там-то пишут еще другое, и в общем совпадений я не нашел пока что))
(Добавление)
Как я понял:

Model - модуль работы с базой
View - вывод информации(не шаблон)
Controller - Соеденение Model и View
 
 Top
OrmaJever Модератор
Отправлено: 04 Марта, 2012 - 17:46:31
Post Id



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


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




Сразу замечание по логике кода, глубокие конструкции это не очень понятно, во многих случаях их можно сократить перевернув условие.
Например метод
PHP:
скопировать код в буфер обмена
  1. public function route(){
  2.         if(class_exists($this->_controller)){
  3.                 $rReflection = new ReflectionClass($this->_controller);
  4.                 if($rReflection->implementsInterface('IController')){
  5.                         if($rReflection->hasMethod($this->_action)){
  6.                                 $rReflection->getMethod($this->_action)->invoke($rReflection->newInstance);
  7.                         }
  8.                         else throw new FrontControllerException('Action not exists');
  9.                 }
  10.                 else throw new FrontControllerException('Wrong controller');
  11.         }
  12.         else throw new FrontControllerException('Controller not exists');
  13. }

Можно написать так
PHP:
скопировать код в буфер обмена
  1. public function route(){
  2.         if( !class_exists($this->_controller) ) throw new FrontControllerException('Controller not exists');
  3.         $rReflection = new ReflectionClass($this->_controller);
  4.         if( !$rReflection->implementsInterface('IController') ) throw new FrontControllerException('Wrong controller');
  5.         if( !$rReflection->hasMethod($this->_action) ) throw new FrontControllerException('Action not exists');
  6.         $rReflection->getMethod($this->_action)->invoke($rReflection->newInstance);
  7. }

Помоему это лучше выглядит.
А если исключения кидаются много раз то их можно вынести в отдельную функцию и кол будет ещё окуратнее

PHP:
скопировать код в буфер обмена
  1. function ex($p) {
  2.     throw new FrontControllerException($p);
  3. }
  4.  
  5. public function route(){
  6.     if( !class_exists($this->_controller) ) ex('Controller not exists');
  7.     $rReflection = new ReflectionClass($this->_controller);
  8.     if( !$rReflection->implementsInterface('IController') ) ex('Wrong controller');
  9.     if( !$rReflection->hasMethod($this->_action) ) ex('Action not exists');
  10.     $rReflection->getMethod($this->_action)->invoke($rReflection->newInstance);
  11. }


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
caballero
Отправлено: 04 Марта, 2012 - 18:26:02
Post Id


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


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


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




Цитата:
синглтон подразумевает гарантированное наличие только одного экземпляра класса. Поэтому нужно запретить клонирование и серилизацию объекта.

там вообще синглтон не нужен потому как с смысла не имеет

Цитата:
и сам нихрена не понял, как будет правильней их сделать.

потому как это просто идея а вариантов реализации немеряно

Цитата:
Как я понял:

Model - модуль работы с базой

не обязательно - это может быть "тонкая модель" то есть сами данные
Цитата:
View - вывод информации(не шаблон)

а если вообще не используется шаблон?
Цитата:
Controller - Соеденение Model и View


не обязательно - view может сам подтягивать себе данные. Это вобщемто логично.

то есть ты понял одну из стопицот частных имплементаций


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
etoYA
Отправлено: 04 Марта, 2012 - 19:07:00
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


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




caballero пишет:
а если вообще не используется шаблон?

Поэтому и написал не шаблон, а вывод данных. Типа <b>Hello, World</b>
(Добавление)
Блин, все вроде как делал по специалисту, но вот ошибка

CODE (htmlphp):
скопировать код в буфер обмена
  1. Fatal error: Uncaught exception 'Exception' with message 'Wrong Interface' in Z:\home\test1.ru\www\application\controllers\FrontController.php:37 Stack trace: #0 Z:\home\test1.ru\www\index.php(11): FrontController->route() #1 {main} thrown in Z:\home\test1.ru\www\application\controllers\FrontController.php on line 37


Вот сам фронт controller (37 строка) это
PHP:
скопировать код в буфер обмена
  1. throw new Exception ('Wrong Interface');

PHP:
скопировать код в буфер обмена
  1.  
  2. <?
  3. class FrontController{
  4.         private $_controller, $_action, $_params, $_body;
  5.         private static $_instance = null;
  6.        
  7.         public static function getInstance(){
  8.                 if (!(self::$_instance instanceOf self))
  9.                         self::$_instance = new self();
  10.                 return self::$_instance;
  11.         }
  12.         private function __construct(){
  13.                 $request = $_SERVER['REQUEST_URI'];
  14.                 $splits = explode('/', trim($request, '/'));
  15.                 $this->_controller = !empty($splits[0]) ? ucfirst($splits[0]).'Controller' : 'IndexController';
  16.                 $this->_action = !empty($splts[1]) ? $splits[1].'Action' : 'indexAction';
  17.                 if (!empty($splits[2])) {
  18.                         $keys = $values = array();
  19.                         for ($i=2,$cnt=count($splits);$i<$cnt;$i++){
  20.                                 if ($i%2==0) $keys[] = $splits[$i];
  21.                                 else $values[] = $splits[$i];
  22.                         }
  23.                         $this->_params = array_combine($keys,$values);
  24.                 }
  25.         }
  26.         function route(){
  27.                 if (class_exists($this->getController())){
  28.                         $rc = new ReflectionClass($this->getController());
  29.                         if ($rc->implementsInterface('IController')){
  30.                                 if ($rc->hasMethod($this->getAction())){
  31.                                         $controller = $rc->newInstance();
  32.                                         $method = $rc->getMethod($this->getAction());
  33.                                         $method->invoke($controller);
  34.                                 }else{
  35.                                         throw new Exception ('Wrong Action');
  36.                                 }
  37.                         }else{
  38.                                 throw new Exception ('Wrong Interface');
  39.                         }
  40.                 }else{
  41.                         throw new Exception ('Wrong Controller');
  42.                 }
  43.         }
  44.         function getParams(){
  45.                 return $this->_params;
  46.         }
  47.         function getController(){
  48.                 return $this->_controller;
  49.         }
  50.         function getAction(){
  51.                 return $this->_action;
  52.         }
  53.         function getBody(){
  54.                 return $this->_body;
  55.         }
  56.         function setBody($body){
  57.                 return $this->_body = $body;
  58.         }
  59. }
  60. ?>
  61.  
 
 Top
digi
Отправлено: 04 Марта, 2012 - 20:16:38
Post Id


Посетитель


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


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




Фронт-контроллер должен быть примерно такого вида:

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. require_once '/path/to/my/app/boot.php';
  3. $App = new \My\Framework\Application();
  4. $App->run();


в boot.php описываем правила автозагрузки, конфигурация роутингов, бд и т.д.
а в $App->run(); уже описывается логика совпадения паттерна маршрута, выполняется экшен контроллера, а его результат выдаётся на ответ.

собственно в экшене происходит обращение к модели, если оно действительно требуется т.к. есть случаи когда ответ можно сформировать без применения классов модели... далее в этом экшене формируется ответ, это может быть и просто строчка, например <b>Hello World</b>, а может быть и объект какого-то шаблонизатора с нужными параметрами для отображения.

(Отредактировано автором: 04 Марта, 2012 - 20:21:35)

 
 Top
caballero
Отправлено: 04 Марта, 2012 - 20:26:58
Post Id


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


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


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




etoYA
пример того что не следует тупо выдирать класы из чужих сорцов.
мало того что та нафиг не нужжный синглетон да еще и надо наследоватся непонятно нафига от какого то IController (потому и ошибка)
и рефлексия там бессмысленна потому как бессмысленно наследоватся от фронт контроллера.


Цитата:
Фронт-контроллер должен быть примерно такого вида:


я так и делаю, хотя это уже не совсем фронт контроллер, это именно Aplication, ядро системмы, отвечающее за жизненный цикл страниц


-----
Бесплатная система складского учета с открытым кодом 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