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
Форумы портала PHP.SU :: Версия для печати :: Урок №19 - Немного о паттернах [4]
Форумы портала PHP.SU » PHP » Уроки php » Урок №19 - Немного о паттернах

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

46. caballero - 07 Декабря, 2011 - 19:04:23 - перейти к сообщению
Цитата:
Подсказка - динамически, это:
- Через конфиг
- Через БД


Это НЕ динамически
кроме того не представляю себе динамические маршруты без динамических контроллеров моделей и видов
47. EuGen - 07 Декабря, 2011 - 19:05:55 - перейти к сообщению
Ну вот и сделайте правило для маршрутизатора - чтобы он все site.ru/news/*/*** отправлял в действие "show" контроллера news

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

caballero
Можно много спорить вокруг того, что можно считать "динамически" - если вчитаетесь в контекст, поймете. Но, думаю, не стоит разводить этот спор.
48. caballero - 07 Декабря, 2011 - 19:18:40 - перейти к сообщению
Динамически - в реалтайме, это очевидно.

Марщруты могут быть прописаны где угодно но самый оптимальный способ - это хардкод. Потому как нет смысла в маршруте если нет соответствующего контроллера. Раз написан контроллер значит к нему пишется правило маршрутизации. По сути маппинг параметра в URL к имени контроллера и его методу.
Причем харкод в коде а не в .htaccess как это пытаются зачем то делать а потом пишут в форумы как это заставить работать.
49. vlom - 07 Декабря, 2011 - 19:20:01 - перейти к сообщению
Все таки сколько бились, а я так и не догнал как сделать оправить запрос на дефолтовый контролер при обращении к корню сайта. Может все таки меня кто носом ткнет в правильный ответ. Огорчение
50. EuGen - 07 Декабря, 2011 - 19:26:13 - перейти к сообщению
caballero
Взгляните с другой стороны. Попытайтесь не быть таким категоричным, как это я замечаю везде почти, и не считать свое мнение единственно верным. Имею я ввиду вот что:
- Если маршруты прописаны в коде, это статично? Да
- Если я выношу их в БД, это статично? Нет. Динамично? Вопрос неоднозначный. Я могу в реальном времени на основании каких-то параметров (через методы, скажем) менять маршруты, и, стало быть, строить динамические вызовы? Нет. Я могу изменять их динамически через, например, панель администрирования? Да. Я могу создать какой-нибудь триггер/метод и т.п., который их будет менять в БД во время выполнения? Да. Так что ответ на вопрос вопрос крайне неоднозначен, потому я и не хочу спорить. Почему я назвал это динамическим - аргументы выше.
caballero пишет:
Причем харкод в коде а не в .htaccess
вот это не очень понял. Как раз в .htaccess здесь маршрутизация и не прописана.
51. caballero - 07 Декабря, 2011 - 19:26:56 - перейти к сообщению
Цитата:
Все таки сколько бились, а я так и не догнал как сделать оправить запрос на дефолтовый контролер при обращении к корню сайта. Может все таки меня кто носом ткнет в правильный ответ

Вообще то задача обычно состоит в том чтобы отправить на нужный контроллер. Если нужны йне обнаружен отправляем на дефолтный
52. EuGen - 07 Декабря, 2011 - 19:29:42 - перейти к сообщению
vlom
Например, в методе run() в случае, если не найден вызываемый контроллер - вызывать контроллер по-умолчанию вместо вызова _default_error()
53. caballero - 07 Декабря, 2011 - 19:31:44 - перейти к сообщению
EuGen

Вы можете менять маршруты как угодно но динамическими они от этого не станут. Просто потому что работать не будут или их работа не будет иметь смысла.
То есть изменение набора символов характеризующих маршрут и изменение самого маршрута как части бизнес-логики - не одно и тоже.
54. vlom - 07 Декабря, 2011 - 19:32:46 - перейти к сообщению
Как мне кажется я изначально так и пробовал сделать подправив метод run(), сказали не правильно... Вот и бьюсь головой об стену что бы это реализовать в методе _load_defaults()
55. EuGen - 07 Декабря, 2011 - 19:35:27 - перейти к сообщению
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.     }

А лучше сделать отдельный метод, определяющий контроллер и действие по-умолчанию и вызывающий его. Названия и того и того - опять же в конфигурационном файле хранить, к примеру.
56. Panoptik - 07 Декабря, 2011 - 20:28:39 - перейти к сообщению
хорошая статья. для понятия неопытным, весьма дается нелегко, но очень наглядно и доступно. я видел 2 фреймворка, у которых общее построение было таки же и теперь мне понятно что и как реализовывается, а перерывать код фреймворка в поисках тех простых истин довольно нелегко и нет особого желания, а тут ясно обрисованы те подводные камни, которыми обычно пользуются, но на абстрактном уровне и никому не понятно как оно работает изнутри.

спасибо
57. vlom - 08 Декабря, 2011 - 11:58:45 - перейти к сообщению
Еще вопрос по поводу данной строки, в классе Controller_Test.

В классе View_Base нет данной переменной, но если бы и было то смысл ее установки???
58. EuGen - 08 Декабря, 2011 - 12:18:37 - перейти к сообщению
Во View_Base - нет, но подумайте о соответствующем представлении. Ведь не зря же эта переменная заполняется из БД.
59. vlom - 08 Декабря, 2011 - 12:22:51 - перейти к сообщению
То есть в каталоге /Lib/Views/ создать дополнительный класс который будет обрабатывать данные полученные из базы???
60. EuGen - 08 Декабря, 2011 - 12:23:57 - перейти к сообщению
Будет представление, которое обращается к переменной $rgPages

 

Powered by ExBB FM 1.0 RC1