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 :: Урок №19 - Немного о паттернах [4]

 PHP.SU

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


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

> Описание: Архитектура MVC своими руками.
caballero
Отправлено: 07 Декабря, 2011 - 19:04:23
Post Id


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


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


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




Цитата:
Подсказка - динамически, это:
- Через конфиг
- Через БД


Это НЕ динамически
кроме того не представляю себе динамические маршруты без динамических контроллеров моделей и видов

(Отредактировано автором: 07 Декабря, 2011 - 19:04:44)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
EuGen Администратор
Отправлено: 07 Декабря, 2011 - 19:05:55
Post Id


Профессионал


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


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




Ну вот и сделайте правило для маршрутизатора - чтобы он все site.ru/news/*/*** отправлял в действие "show" контроллера news

Или другой вариант - в случае, если не указано действие, вызывать для любого контроллера действие index. В которое для контроллера news и поместите вывод новости.

caballero
Можно много спорить вокруг того, что можно считать "динамически" - если вчитаетесь в контекст, поймете. Но, думаю, не стоит разводить этот спор.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
caballero
Отправлено: 07 Декабря, 2011 - 19:18:40
Post Id


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


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


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




Динамически - в реалтайме, это очевидно.

Марщруты могут быть прописаны где угодно но самый оптимальный способ - это хардкод. Потому как нет смысла в маршруте если нет соответствующего контроллера. Раз написан контроллер значит к нему пишется правило маршрутизации. По сути маппинг параметра в URL к имени контроллера и его методу.
Причем харкод в коде а не в .htaccess как это пытаются зачем то делать а потом пишут в форумы как это заставить работать.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
vlom
Отправлено: 07 Декабря, 2011 - 19:20:01
Post Id



Частый посетитель


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


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




Все таки сколько бились, а я так и не догнал как сделать оправить запрос на дефолтовый контролер при обращении к корню сайта. Может все таки меня кто носом ткнет в правильный ответ. Огорчение
 
 Top
EuGen Администратор
Отправлено: 07 Декабря, 2011 - 19:26:13
Post Id


Профессионал


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


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




caballero
Взгляните с другой стороны. Попытайтесь не быть таким категоричным, как это я замечаю везде почти, и не считать свое мнение единственно верным. Имею я ввиду вот что:
- Если маршруты прописаны в коде, это статично? Да
- Если я выношу их в БД, это статично? Нет. Динамично? Вопрос неоднозначный. Я могу в реальном времени на основании каких-то параметров (через методы, скажем) менять маршруты, и, стало быть, строить динамические вызовы? Нет. Я могу изменять их динамически через, например, панель администрирования? Да. Я могу создать какой-нибудь триггер/метод и т.п., который их будет менять в БД во время выполнения? Да. Так что ответ на вопрос вопрос крайне неоднозначен, потому я и не хочу спорить. Почему я назвал это динамическим - аргументы выше.
caballero пишет:
Причем харкод в коде а не в .htaccess
вот это не очень понял. Как раз в .htaccess здесь маршрутизация и не прописана.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
caballero
Отправлено: 07 Декабря, 2011 - 19:26:56
Post Id


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


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


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




Цитата:
Все таки сколько бились, а я так и не догнал как сделать оправить запрос на дефолтовый контролер при обращении к корню сайта. Может все таки меня кто носом ткнет в правильный ответ

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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
EuGen Администратор
Отправлено: 07 Декабря, 2011 - 19:29:42
Post Id


Профессионал


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


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




vlom
Например, в методе run() в случае, если не найден вызываемый контроллер - вызывать контроллер по-умолчанию вместо вызова _default_error()


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
caballero
Отправлено: 07 Декабря, 2011 - 19:31:44
Post Id


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


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


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




EuGen

Вы можете менять маршруты как угодно но динамическими они от этого не станут. Просто потому что работать не будут или их работа не будет иметь смысла.
То есть изменение набора символов характеризующих маршрут и изменение самого маршрута как части бизнес-логики - не одно и тоже.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
vlom
Отправлено: 07 Декабря, 2011 - 19:32:46
Post Id



Частый посетитель


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


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




Как мне кажется я изначально так и пробовал сделать подправив метод run(), сказали не правильно... Вот и бьюсь головой об стену что бы это реализовать в методе _load_defaults()
 
 Top
EuGen Администратор
Отправлено: 07 Декабря, 2011 - 19:35:27
Post Id


Профессионал


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


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




caballero пишет:
Просто потому что работать не будут

Отчего не будут? Если я буду менять их не как попало, а в соответствии с той самой бизнес-логикой через предназначенный для того метод в приложении - будут работать, и работать корректно. Речь не о наборе символов. Я думаю, Вы понимаете о чем я, и не знаю, зачем этот спор. Дальнейшее можно продолжить в отдельной теме, т.к. к этой оно относится весьма косвенно, и это продолжение того, чего я хочу избежать - спора. Мы спорим по вопросу, на который нет однозначного ответа. Пожалуйста, давайте воздержимся.

vlom
Если так угодно, то, например,
PHP:
скопировать код в буфер обмена
  1. function run()
  2.     {
  3.         $uri = $this->getURI();
  4.         foreach($this->routes as $route=>$destination)
  5.         {
  6.             if(preg_match($route, $uri))
  7.             {
  8.                 $internalRoute = preg_replace($route, $destination, $uri);
  9.                 $segments = explode('/', $internalRoute);
  10.                 $controller = 'Controller_'.ucfirst(array_shift($segments));
  11.                 $method = array_shift($segments).'Action';
  12.                 $parameters = $segments;                
  13.                 //launch controller:
  14.                 if(class_exists($controller))
  15.                 {
  16.                     $obj    = new $controller;
  17.                     if(method_exists($obj, $method))
  18.                     {
  19.                         call_user_func_array(array($obj, $method), $parameters);
  20.                         return;
  21.                     }
  22.                     else
  23.                     {
  24.                         $this->_default_error();
  25.                     }
  26.                 }
  27.                 else
  28.                 {
  29.                     /*Вместо Default подставите название Вашего контроллера по-умолчанию (так или иначе Вам это придется сделать, т.к. в текущем виде код, естественно, неработоспособен)
  30.                        Вместо index подставите имя действия по-умолчанию
  31.                     */
  32.                     $obj    = new Default();
  33.                     $method = 'index';
  34.                     call_user_func_array(array($obj, $method), $parameters);
  35.                     return;
  36.                 }
  37.             }
  38.         }
  39.         return;
  40.     }

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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Panoptik
Отправлено: 07 Декабря, 2011 - 20:28:39
Post Id



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


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


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




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

спасибо


-----
Just do it
 
 Top
vlom
Отправлено: 08 Декабря, 2011 - 11:58:45
Post Id



Частый посетитель


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


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




Еще вопрос по поводу данной строки, в классе Controller_Test.

В классе View_Base нет данной переменной, но если бы и было то смысл ее установки???
 
 Top
EuGen Администратор
Отправлено: 08 Декабря, 2011 - 12:18:37
Post Id


Профессионал


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


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




Во View_Base - нет, но подумайте о соответствующем представлении. Ведь не зря же эта переменная заполняется из БД.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
vlom
Отправлено: 08 Декабря, 2011 - 12:22:51
Post Id



Частый посетитель


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


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




То есть в каталоге /Lib/Views/ создать дополнительный класс который будет обрабатывать данные полученные из базы???
 
 Top
EuGen Администратор
Отправлено: 08 Декабря, 2011 - 12:23:57
Post Id


Профессионал


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


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




Будет представление, которое обращается к переменной $rgPages


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (7): « 1 2 3 [4] 5 6 7 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Уроки php »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB