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


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

> Без описания
esterio
Отправлено: 08 Декабря, 2012 - 19:43:44
Post Id



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


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


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




Наконец то решил выслушать критику. поэтому прошу посмотреть на реализацию моего роутера. Хотелось бы узнать:
1. Чтобы бы вы сделали иначе
2. Какие ошибки
3. Что доработать
4. Удобство в пользовании

основной класс neusRouter
Спойлер (Отобразить)


Интерфейс для конфигурации neusRouterConfigInterface
Спойлер (Отобразить)


Класс конфигурации neusRouterConfig
Спойлер (Отобразить)


Пример использования:
PHP:
скопировать код в буфер обмена
  1. $router = new neusRouter();
  2. $neusRoute = $router->createConfig(array('controller' => 'index', 'action' => 'index'));


На вход функции подаем массив, который будет взят за основу (index)
Далее сама конфигурация:
PHP:
скопировать код в буфер обмена
  1. $neusRoute->add('category_{id}', 'category', 'index')->
  2.                         add('{m_id}', 'category', 'show')->
  3.                         assert(array(
  4.                                 'id' => '\d+',
  5.                                 'm_id' => '\d+'
  6.                         ));
  7.  
  8. $neusRoute->add('information', 'information', 'index')->
  9.                         add('{id}', 'information', 'index')->
  10.                         assert(array(
  11.                                 'id' => '\d+',
  12.                         ));
  13.  
  14. $neusRoute->add('about_us', 'index', 'about_us');
  15. $neusRoute->add('search', 'search', 'index')->set('access_level', 100);


Здесь используется метод add, где 1 параметр - часть URL, а все остальное это элементы массива которые мы задали ранее.
Например $ neusRoute-> add ('category_ {id}', 'category', 'index') означает, что:
для части URL category_ {id} результатом будет array ('controller' => 'category', 'action' => 'index')
В параметре URL можно использовать переменные с помощью "{var}".
Метод assert задает правила для переменных в URL, и представляет собой регулярное выражение.Наприклад:
assert(array(
'id' => '\d+',
'm_id' => '\d+'
));

Указывает, что часть URL category_{id} и {m_id} может содержать переменные только числа.
Метод set задает дополнительные параметры. Например set ('access_level', 100); - задает параметры access_level , который равен 100.

Теперь например наш URL следующий:
http://example.com/category_18/123
Тогда после разбора URL получается массив:

выполняем роутинг
PHP:
скопировать код в буфер обмена
  1. $routing = $router->route($url);
  2. var_dump($routing);

Результат выполнения:
array
'route' =>
array
'controller' => string 'category' (length=8)
'action' => string 'show' (length=4)
'vars' =>
array
'id' => string '18' (length=2)
'm_id' => string '123' (length=3)
'params' =>
array
empty


Индексная страница будет следующей:


Чуть не забыл преобразованием из http://example.com/category_18/123 в array('category_18', '123') у меня занимается совсем другой класс.

(Отредактировано автором: 08 Декабря, 2012 - 19:46:16)

 
 Top
caballero
Отправлено: 08 Декабря, 2012 - 20:28:36
Post Id


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


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


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




ты что у индусов учился?

Цитата:
преобразованием из http://example[dot]com/category_18/123 в array('category_18', '123') у меня занимается совсем другой класс.

это одной строкой можно сделать.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
esterio
Отправлено: 08 Декабря, 2012 - 20:34:46
Post Id



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


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


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




caballero пишет:
ты что у индусов учился?

Цитата:
преобразованием из http://example[dot]com/category_18/123 в array('category_18', '123') у меня занимается совсем другой класс.

это одной строкой можно сделать.


Да там кроме преобразования, есть еще определения браузера, предпочитаемого языка, является ли запрос ПОСТ-ом или АЯКС и т.д.
(Добавление)
И еще ето сделано ен спроста, У меня УРЛ может быть например http://example.com/ru/category_18.
Таким образом я делаю с строкой то чно мне нужно, например - узнаю что язык русский и забираю елмент 'ru'.
 
 Top
caballero
Отправлено: 08 Декабря, 2012 - 20:48:16
Post Id


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


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


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




Цитата:
Да там кроме преобразования, есть еще определения браузера, предпочитаемого языка, является ли запрос ПОСТ-ом или АЯКС и т.д.

а зачем это роутеру?


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
esterio
Отправлено: 08 Декабря, 2012 - 20:49:50
Post Id



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


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


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




caballero пишет:
а зачем это роутеру?

Так и я о том-же, есть отдельной компонент request который етим занимаеться, но если чесно я уже думаю что все-таки стоит добавить преоброзование в роутер.

П.С. спасибо за отзыв
 
 Top
caballero
Отправлено: 08 Декабря, 2012 - 20:53:06
Post Id


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


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


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




Цитата:
Так и я о том-же, есть отдельной компонент request который етим занимаеться, но если чесно я уже думаю что все-таки стоит добавить преоброзование в роутер.

значит ты не о том же. Я о том что это вообще не функции роутера должны быть, а ты еще туда хочешь накидать функционала


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
esterio
Отправлено: 08 Декабря, 2012 - 20:56:28
Post Id



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


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


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




Значит не правильно обьяснил. Уже есть другой класс который етим занимаеться.
А именно
Цитата:
Да там кроме преобразования, есть еще определения браузера, предпочитаемого языка, является ли запрос ПОСТ-ом или АЯКС и т.д.

И я не собираюсь все ето в роутер сувать. Думаю лиш что преобразоване из http://example[dot]com/category_18/123 в array('category_18', '123') стоит все-таки засунуть в роутер и не более.
 
 Top
caballero
Отправлено: 08 Декабря, 2012 - 20:57:14
Post Id


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


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


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




а что тогда делают это стопицот строк кода?


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
esterio
Отправлено: 08 Декабря, 2012 - 21:01:17
Post Id



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


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


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




Узнают например какой контроллер и метот вызивать для даного УРЛя, и витаскивають переменные например категория с ИД 18.
 
 Top
caballero
Отправлено: 08 Декабря, 2012 - 21:04:53
Post Id


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


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


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




чтобы распознать category_ в урле вынуть id и перенаправить на нужный контроллер я думаю достаточно полдесятка строк


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
esterio
Отправлено: 08 Декабря, 2012 - 21:08:05
Post Id



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


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


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




Тут столько строк для того чтоб класс был менее зависим, конифиг например можно сделать чтоб тянул с БД или с файла какого-нить. А что Вы предлагаете использовать switch..case
 
 Top
avtor.fox
Отправлено: 08 Декабря, 2012 - 21:13:51
Post Id



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


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


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




esterio ну и жесть Вы понаписали.
Запомните, выучив несколько строк кода из книги и сразу их запостив в свой "проект", лучше от этого не будет. Слишком всё сложно. Там натыкано, здесь накидано, ничего непонятно, а на выходе получаем массив с определением "контроллера" и скармливаемая "гет" строка. Ну и намудрили.

Но это Ваше видение. Всё равно ж Вам переписывать, не нам Улыбка
 
 Top
caballero
Отправлено: 08 Декабря, 2012 - 21:14:24
Post Id


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


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


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




чем писать такое

PHP:
скопировать код в буфер обмена
  1. $neusRoute->add('information', 'information', 'index')->
  2.                         add('{id}', 'information', 'index')->
  3.                         assert(array(
  4.                                 'id' => '\d+',
  5.                         ));


уж лучше switch..case

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


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
esterio
Отправлено: 08 Декабря, 2012 - 22:03:29
Post Id



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


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


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




avtor.fox пишет:
Запомните, выучив несколько строк кода из книги и сразу их запостив в свой "проект"

Все лично мой код, никакого копипаста.

caballero пишет:
роутер судя по всему для новостей. что такого сложного там надо роутить чтобы писать такие конструкции

Ето пример, а служет он далеко не для таких целей.

caballero пишет:
вообще, роутеры как правило нужны для ЧПУ. адресоватся к контроллеру можно просто задав имя контроллера и экшена в урле, что многое фреймворки и делают

Он и предназначен для ЧПУ. И являеться частю моего фреймворка(велосипеда). От даной затее отказался в связи з задачами для которих такой подход не подошел бы.
 
 Top
avtor.fox
Отправлено: 09 Декабря, 2012 - 05:44:23
Post Id



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


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


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




esterio пишет:
такой подход не подошел бы

Ды я боюсь представить куда бы он подошёл.

esterio пишет:
Все лично мой код, никакого копипаста.

Я не говорил что это копипаст чужого кода.

И caballero прав. Роутер нужен в основном для ЧПУ и вызова нужного контроллера. А Вам с таким подходом к задаче нужно идти в 1С работать, там любят таких Улыбка
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB