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 - Немного о паттернах [3]

 PHP.SU

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


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

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



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


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


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




После длительного перерыва вновь вернулся к разбору данного урока
и вот сейчас мне не понятна ошибка
CODE (htmlphp):
скопировать код в буфер обмена
  1. Strict standards: Static function Db_Adapter::getInstance() should not be abstract in C:\xampp\htdocs\coding.dev\www\Lib\Db\Adapter.php on line 9
 
 Top
EuGen Администратор
Отправлено: 07 Декабря, 2011 - 16:19:19
Post Id


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


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


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




Можно убрать abstract из объявления метода.
Дело здесь в том, что в php-не-помню-до-какой-версии (подозреваю, что до 5.1 включительно), при наследовании статические методы не переопределяются, а по-прежнему принадлежат к классу, в пределах которого они объявлены. Это приводит к тому, что когда вызывается метод, якобы реализующий абстрактный статический метод родителя, на самом деле происходит попытка вызова статического родительского метода (т.к. он не переопределен), что, естественно, приводит к ошибке (т.к. метод - абстрактный и без реализации его вызвать нельзя).


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



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


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


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




По поводу имени layout, решил добавить в конфиг новый элемент

В файле Handler.php добавить новый метод
PHP:
скопировать код в буфер обмена
  1.     public function getTempl(){
  2.         return $this->rgIni[$this->section]['templ'];
  3.     }

А в классе View_Base изменить метод _fetch следующим образом
PHP:
скопировать код в буфер обмена
  1.     protected function _fetch($template, $rgParams = array()) {
  2.         $templ = Config_Handler::getInstance()->getTempl();
  3.         $content = $this->_fetch_segment($template, $rgParams);
  4.         return $this->_fetch_segment($templ, array('content' => $content));
  5.     }

На счет остального пока масла не хватает.
(Добавление)
EuGen пишет:
Можно убрать abstract из объявления функции.

Фатальная ошибка из-за этого выскакивает
 
 Top
EuGen Администратор
Отправлено: 07 Декабря, 2011 - 16:22:32
Post Id


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


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


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




vlom
Какая именно?


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



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


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


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




CODE (htmlphp):
скопировать код в буфер обмена
  1. Fatal error: Non-abstract method Db_Adapter::getInstance() must contain body in C:\xampp\htdocs\mvc.dev\www\Lib\Db\Adapter.php on line 9

(Добавление)
и еще EuGen к вам такой вопрос, как задать контроллер по умолчанию, то есть для обращения к сайту без передачи переменной гет
я не прошу готового решения, а всего лишь верного направления в котором стоит продолжать
 
 Top
EuGen Администратор
Отправлено: 07 Декабря, 2011 - 16:30:08
Post Id


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


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


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




vlom пишет:
Fatal error: Non-abstract method

Ах, ну да. Конечно, я имел ввиду - сделать метод неабстрактным (неточно выразился - это не просто убрать слово "abstract", но и тело дописать собственно).
Вот только я не могу сказать, переопределится ли он. Иными словами, если не может реализоваться абстрактный метод, то я не могу быть уверенным, что переопределится неабстрактный.
Могу сказать лишь, что урок создавался на php 5.2

Некоторая информация еще здесь:
http://stackoverflow[dot]com/questio[dot][dot][dot]ic-class-methods

И не стесняйтесь в интернете искать.

По поводу контроллера - имеете ввиду это:
EuGen пишет:
1. Добавить возможность настройки маршрутов для маршрутизатора

?
Если да, то часть ответа содержится в самом вопросе.


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



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


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


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




EuGen пишет:
По поводу контроллера - имеете ввиду это:
EuGen пишет:
Цитата:
1. Добавить возможность настройки маршрутов для маршрутизатора


?
Если да, то часть ответа содержится в самом вопросе.

По поводу этого ни чего в голову не пришло кроме как немного преобразовать метод run()
хотя как-то мало уверенности что это правильный путь.
PHP:
скопировать код в буфер обмена
  1. function run() {
  2.         $uri = $this->getURI();
  3.         if($uri != ''){
  4.             foreach ($this->routes as $route => $destination) {
  5.                 if (preg_match($route, $uri)) {
  6.                     $internalRoute = preg_replace($route, $destination, $uri);
  7.                     $segments = explode('/', $internalRoute);
  8.                     $controller = 'Controller_' . ucfirst(array_shift($segments));
  9.                     $method = array_shift($segments) . 'Action';
  10.                     $parameters = $segments;
  11.                     //launch controller:
  12.                     if (class_exists($controller)) {
  13.                         $obj = new $controller;
  14.                         if (method_exists($obj, $method)) {
  15.                             call_user_func_array(array($obj, $method), $parameters);
  16.                             return;
  17.                         } else {
  18.                             $this->_default_error();
  19.                         }
  20.                     } else {
  21.                         $this->_default_error();
  22.                     }
  23.                 }
  24.             }
  25.         }else{
  26.             echo 'Стартовая страница сайта.';
  27.         }
  28.         return;
  29.     }
 
 Top
EuGen Администратор
Отправлено: 07 Декабря, 2011 - 16:52:31
Post Id


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


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


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




Нет, метод run переделывать не нужно. Достаточно создать способ динамического задания списка маршрутов (то, что есть $this->routes ) - если посмотрите, как список маршрутов формируется в текущей версии, думаю, поймете.


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



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


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


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




Я немного видать не правильно понял изначально суть данного массива $this->routes и думал что это для парсинга $_GET массива.
Но насколько сейчас разобрался, это для отделения подкаталогов, в котором может находится сайт и как раз таки переменных массива $_GET.
Но опять же что-то такое понял, а может и не правильно.
 
 Top
EuGen Администратор
Отправлено: 07 Декабря, 2011 - 17:49:31
Post Id


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


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


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




По сути $this->routes задает правила разбора пришедшего запроса, то есть является набором маршрутов. Об этом и сказано в тексте самого урока.


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



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


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


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




EuGen пишет:
По сути $this->routes задает правила разбора пришедшего запроса, то есть является набором маршрутов. Об этом и сказано в тексте самого урока.

Это я уже понял, но все равно не фига не могу придумать как создавать маршруты динамически.
 
 Top
EuGen Администратор
Отправлено: 07 Декабря, 2011 - 18:24:45
Post Id


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


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


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




vlom
Подсказка - динамически, это:
- Через конфиг
- Через БД
- В виде параметра через массив
- ... все, что захотите еще


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



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


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


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




EuGen пишет:
vlom
Подсказка - динамически, это:
- Через конфиг
- Через БД
- В виде параметра через массив
- ... все, что захотите еще


То есть не используя регулярок, сразу прописывать допустимые маршруты для сайта??? К примеру:
router.ini
CODE (htmlphp):
скопировать код в буфер обмена
  1. [news]
  2. 1 = news/show?id=
  3. 2 = news/add?id=
  4. 3 = news/delete?id=
  5. [users]
  6. 1 = users/list
  7. 2 = users/delete

(Добавление)
и походу опять возникает вопрос, можно ли будет скрыть в uri название контроллера и действия???
 
 Top
EuGen Администратор
Отправлено: 07 Декабря, 2011 - 18:55:11
Post Id


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


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


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




vlom
Как вариант - сделать несколько "базовых" маршрутов и дополнительно - несколько "особенных".

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


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



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


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


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




EuGen пишет:
По поводу скрытия - пожалуйста, берите любой алгоритм шифрования (или придумайте свой) и "расшифровывайте" пришедший запрос. Таким образом названия контроллеров и действий будут скрыты. Только зачем это может понадобиться - ума не приложу.


Наверное опять не ясно изъясняюсь я. Есть старый сайт, на нем есть статьи.
ссылки вида
site.ru/news/1/342 (1 - id категории, 342 - id новости)
а в случае с данной системой mvc получатся ссылки
site.ru/news/show/1/342
сейчас хочу перенести его на новый двиг и не хотелось бы делать редирект через хацкес со старых ссылок на новые, уж очень он станет раздутым.
 
 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