Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Роутинг. Как сделать хорошо?, с блэкджеком и ....
McLotos  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



武士道
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1225
Пользователь №: 28342
На форуме: 5 лет, 5 месяцев, 27 дней
Карма: 28




Всем привет!
Вот решил сам написать роутинг, пока ничего не получается, пытаюсь понять почему.
Подскажите как можно сделать адекватный и удобный роутинг.
Router

final class Router extends RouterRules{

private $app;

public function __construct($app) {
$this->app = $app;
parent::__construct();
}

public function createRule($url, $controller, $action='', array $parameters=array()) {
$this->routes[$url] = array('Controller'=>$controller,
'Action'=>(empty($action)) ? 'index' : $action,
'Data'=>implode('&',$parameters);
}

public function getRule($url) {
if(array_key_exists($url, $this->routes)) {
return $this->routes[$url];
} else {
$url = trim($url,'/');
$url = explode('/', $url);
$class = $this->app->factory->getController($url[0]);
if(is_object($class)) {
$arr['Controller'] = $url[0];
if((!empty($url[1])) && (method_exists($class, $url[1]))) {
$arr['Action'] = $url[1];
$arr['Data'] = (!empty($url[2])) ? $url[2] : null;
} elseif(empty($url[1])) {
$arr['Action'] = 'index';
$arr['Data'] = null;
} else {
return $this->routes['405'];
}
return $arr;
} else {
return $this->routes['404'];
}
}
}


public function getRoutes() {
return $this->routes;
}
}



RouterRules

class RouterRules {

protected $routes;

protected function __construct() {
$this->getSystemRoutes();
$this->getRoutes();
}

private function getRoutes() {
$this->routes['/'] = array('Controller'=>'chart', 'Action'=>'main', 'Data'=>null);
$this->routes['/cabinet'] = array('Controller'=>'tickets', 'Action'=>'cabinet', 'Data'=>null);
$this->routes['/cabinet/my'] = array('Controller'=>'tickets', 'Action'=>'cabinet', 'Data'=>'user=#{id}');
$this->routes['/leadgens'] = array('Controller'=>'tickets', 'Action'=>'leadgens', 'Data'=>'user=#{id}');
$this->routes['/leadgens/@{status}'] = array('Controller'=>'tickets', 'Action'=>'leadgens', 'Data'=>'user=#{id}&status={status}');
$this->routes['/leadgens/@{name}'] = array('Controller'=>'tickets', 'Action'=>'leadgens', 'Data'=>'user=#{id}&name={name}');
$this->routes['/leadgens/@{name}/@{status}'] = array('Controller'=>'tickets', 'Action'=>'leadgens','Data'=>'user=#{id}&name=@{name}&status=@{status}');
}

private function getSystemRoutes() {
$this->routes['405'] = array('Controller'=>'errors',
'Msg'=>'Method Not Allowed',
'Code'=>405);
$this->routes['404'] = array('Controller'=>'errors',
'Msg'=>'Not Found',
'Code'=>404);
$this->routes['403'] = array('Controller'=>'errors',
'Msg'=>'Access denied',
'Code'=>403);
}
}



Если честно я не столько за критикой, сколько за направлением поэтому прошу быть посдержаннее =)
Вопроса собственно 2:
1. Как сделать так чтобы роутер обрабатывал правила типа @{name}/#{id}. Т.е. чтобы он подставлял значения и генерировал роуты для таких вариантов урла
2. Как сделать, чтобы то, что было записано в Data, было передано в метод контроллера вызванной страницы но не как одна строка типа name=Вася&id=1, а как прям отдельные переменные, или так не делают? Подскажите как сделать.


--------------------
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1755
Пользователь №: 20757
На форуме: 6 лет, 10 месяцев, 8 дней
Карма: 184




Цитата (McLotos @ 19.08.2016 - 09:22)
Как сделать хорошо?

Чем плохи существующие реализации?
Цитата (McLotos @ 19.08.2016 - 09:22)
Вот решил сам написать роутинг

Тот же вопрос - зачем?
Цитата (McLotos @ 19.08.2016 - 09:22)
Подскажите как можно сделать адекватный и удобный роутинг.

Адекватных и удобных роутеров вагон и маленькая тележка (https://github.com/search?l=PHP&q=router&type=Repositories&utf8=%E2%9C%93). Мы же не знаем почему они тебя не устраиваю, что ты решил изобрести свой велик.
PMПисьмо на e-mail пользователю
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
McLotos  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



武士道
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1225
Пользователь №: 28342
На форуме: 5 лет, 5 месяцев, 27 дней
Карма: 28




kaww
Всё просто. Если бы я всегда юзал только готовые реализации, то мои познания так и остались бы на уровне echo "<b>Hello world</b><br>"; dry.gif
В принципе сейчас я могу написать практически всё что угодно, только вот всё еще не понимаю как работают роутинги. Читал роутинг симфони2, ларавел, yii. Все они мне кажутся слишком громозкими, а хочется какое-то легкое решение написать (хоть и в учебных целях)


--------------------
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Ron  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1048
Пользователь №: 41686
На форуме: 1 год, 4 месяца, 1 день
Карма: 14




McLotos, посмотри очень неплохой роутер: https://github.com/dannyvankooten/AltoRouter

Правда он без лончера, и на главной странице пример на колбэках.

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

Очень хорошая штука, я считаю.



--------------------
Жду 5.11.2017
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
McLotos  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



武士道
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1225
Пользователь №: 28342
На форуме: 5 лет, 5 месяцев, 27 дней
Карма: 28




Цитата (Ron @ 19.08.2016 - 12:08)
McLotos, посмотри очень неплохой роутер: https://github.com/dannyvankooten/AltoRouter

Да его кстати часто рекомендуют, на сколько я знаю когда кто-то тут писал свою cms использовал именно его.
Ну попробую, поковыряю, может и оттуда что-то пойму. Цель как бы не в том чтобы найти решение, а чтобы понять как вообще работают такие решения


--------------------
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
SlavaFr  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
******

Профиль
Журнал
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1535
Пользователь №: 22453
На форуме: 6 лет, 6 месяцев, 9 дней
Карма: 104




Цитата (McLotos @ 19.08.2016 - 02:44)
только вот всё еще не понимаю как работают роутинги

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


--------------------
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
McLotos  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



武士道
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1225
Пользователь №: 28342
На форуме: 5 лет, 5 месяцев, 27 дней
Карма: 28




SlavaFr
А вот если например взять маршрут
/chart/period/2016-01-01/2016-02-01
то правило для роутера должно быть примерно таким
$this->route['/chart/period/@date1/@date2'] = array('Controller'=>'chart', 'Action'=>'period', 'date1'='@date1', 'date2'=>'@date2');

т.е. в результате сработает
$ChartController->period('2016-01-01', '2016-02-01');

Я правильно понимаю логику?


--------------------
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
SlavaFr  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
******

Профиль
Журнал
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1535
Пользователь №: 22453
На форуме: 6 лет, 6 месяцев, 9 дней
Карма: 104




Разбей задачу.
1) расспoзнать соответствует ли URL выражению которое написано в роутинге
например является ли актуальная URL такой, что бы выражение /chart/period/@date1/@date2' вообще к нему подходила..
То есть валидация роутинга.
То есть ясно, что должен существовать масив с рутами нужно этот масив итерировать, что бы выражение оказалось валидным.
2) Как в случае если выражение подходит вытянуть из url или стринга нужные для тебя параметры.
В твоём случае из /chart/period/блябля/блумблум вытянуть в переменную date1 -> блябля а в date2->блумблум
3) как вызвать нужный контроллер и нужный метод и передать им твои параметры $date1 и $date2

В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми smile.gif


--------------------
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
McLotos  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



武士道
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1225
Пользователь №: 28342
На форуме: 5 лет, 5 месяцев, 27 дней
Карма: 28




Цитата (SlavaFr @ 19.08.2016 - 14:42)
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми

В точку!


--------------------
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
TMake  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Журнал
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3106
Пользователь №: 16333
На форуме: 7 лет, 11 месяцев, 24 дня
Карма: 58




Цитата (McLotos @ 19.08.2016 - 06:44)
Всё просто. Если бы я всегда юзал только готовые реализации, то мои познания так и остались бы на уровне echo "<b>Hello world</b><br>";

Если бы ты пользовался готовым и интересовался как он работает из нутри то знал бы ответ на свой вопрос.
PM
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса