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

> Начала роутинга
twin  
 ۩  [x] Дата
Цитировать сообщение

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



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15787
Пользователь №: 6543
На форуме: 8 лет, 3 месяца, 20 дней
Карма: 299

Трезвый :
6 лет, 29 дней


Сразу с лирического отступления начну.

Я тут начал делать, пока примитивно, но работает уже по дефолту.

Так как это учебно-тренировочный фреймворк, то он должен поддерживать типы маршрутизации топовых фреймворков. А они все кто-куда. Используют и обычные массивы, и XML и JSON и YAML. С обычными массивами все ясно, а вот на остальные форматы нужен конвертор. За одно будет неплохой компонент на будущее.

Ни кто не хочет присоединиться и помочь? :)

Ну а теперь про роутинг. Введение для тех, кто не в теме.

Route - (англ) маршрут. Соответственно роутинг - маршрутизация. Это определение функционала, который нужно задействовать, в зависимости от полученных от юзера данных и установленных настроек. Настройки, это правила роутинга. Правила, это обычно своеобразные регулярные выражения, по которым роутер разбирает полученный URL и сопоставляет ему нужные контроллеры, экшены и GET-параметры.

Вот допустим самый простой набор правил в виде PHP массива от Yii:
[
'<controller:(post|comment)>/<id:\d+>/<action:(create|update|delete)>' => '<controller>/<action>',
'<controller:(post|comment)>/<id:\d+>' => '<controller>/read',
'<controller:(post|comment)>s' => '<controller>/list',
]


Это правила с именнованными параметрами. оно сработает, если к примеру придет такой URL:
http://site.com/comment/15/delete

Роутер разберет его по первому правилу, и получит следующие данные
$controller = 'comment';
$action = 'delete';
$id = 15


Соответственно задействует CommentController, вызовет в нем экшен delete(), и передаст ему ID = 15. Значит комментарий с этим ID будет удален.

По этому же правилу будет работать такой URL
http://site.com/post/10/update

но задействует уже такой функционал:
$controller = 'post';
$action = 'update';
$id = 10

Соответственно будет отредактирован пост с ID = 10.

В общих чертах так.

А теперь ближе к телу. Я пока не сделал разбор правил, подключается только пустой контроллер. Просто чтобы отследить цепочку. Процессор фреймворка запускат роутер:

\Abc\core\AbcPrjwtssor
    /**
* Устанавливает пользовательские маршруты и запускает роутер
*
*
@return void
*/

public function route()
{
$this->router = new Router;
$this->router->config = $this->config;
$this->router->run();
}


Дальше роутер устанавливает путь до директории с контроллерами по дефолту, или с пользовательскими настройками.
    /**
* Возвращает директорию с пользовательскими контроллерами
*
*
@return string
*/

public function getControllersDir()
{
$userSettings = @$this->config['settings'] ?: [];
$settings = array_merge($this->defaultSettings, $userSettings);
return $settings['application'] .'\\'. $settings['dir_controllers'];
}

Ну и пытается вызвать контроллер из этой папки (с именем контроллера пока затык):
    /**
    * Вызывает контроллер
    *
    *
@return void
    */
       
    public function run()
    {
        $controllersDir = $this->getControllersDir();
        $controllerName = $this->getControllerName();
        $controller = '\ABC\\'. $controllersDir .'\\'. $controllerName .'Controller';
       
        if (!class_exists($controller)) {
            $this->create404($controller);
        } else {
            (new $controller());       
        }
    }

Если такого нет, вызывается базовый контроллер и запускается экшен 404
    /**
* Если не найден контроллер, активирует базовый с генерацией 404 заголовка
*
*
@param string $controller
*
*
@return string
*/

public function create404($controller)
{
(new BaseController($this->config))->action404($controller);
}


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

Ну вот в общих чертах такое начало. Дальше нужно делать парсер правил роутинга и Request. Начинаются практические работы. Желающих поучаствовать и прокачать скиллы - милости просим.

Ну и хотелось бы критики на дессерт. :)


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
bestxp  
Дата
Цитировать сообщение

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



орангутанг
******

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




немного неудобен в плане составления роутов

тут скорее вариант обязательного соотвестивия роута к контроллеру

то есть создал контроллер - создал и роут к нему, первый роут совпавший являеться верным

и проверка дальнейшая не идет

тут чисто мое имхо =)

и по сути состоит из преобразования роута в регулярку и далее уже простая проверка =)

ну и валидация и тд так же становиться возможным

что-то в таком стиле https://gitlab.com/snippets/9124 мой вариант достаточно удобный
там не описаны классы и тд там сам процесс сопоставления
а контроллер получить и тд не проблема
и конечно же там надо будет кой чего поправить =) но это не проблема да?)


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

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



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

Профиль
Группа: Сын полка
Сообщений: 1847
Пользователь №: 38654
На форуме: 3 года, 20 дней
Карма: 40




twin, функционал FrontController и Router в одном классе это архитектурная ошибка.

Роутер ищет совпадение по правилам и генерирует строки по этим правилам(и то не факт), FrontController инициализирует объекты на основе данных полученых от роутера.


--------------------
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации

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

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



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15787
Пользователь №: 6543
На форуме: 8 лет, 3 месяца, 20 дней
Карма: 299

Трезвый :
6 лет, 29 дней


bestxp
Цитата (bestxp @ 23.10.2015 - 06:49)
немного неудобен в плане составления роутов

Тут идея в том, что правила я хочу взять типовые, от топовых фреймворков. Чтобы новобранцу на этом можно было потренироваться, а потом легко перейти на symfony скажем.

chee
Ну значит разделим потом, если так положено. Просто не хотелось из-за двух строк класс плодить. Когда накопится функционала, сделаем фронт-контроллер.


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
bestxp  
Дата
Цитировать сообщение

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



орангутанг
******

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




Twin так я и взял от считай топового роутера который сейчас используется Symfony Silex Laravel Slim , последний по сути синтакиси тот же реализация другая вроде

да и написать
/user/auth => UserController:authAction например можно понять откуда корни растут нежели

думать что с этим не так

/user/auth

это UserController/authAction
или
UserModule/AuthController/indexAction

а что есть и то и то? Как быть тогда и какой отработает рандом?
А если надо что бы работал последний а не первый вариант при условии что для остальных сначала первый потом последний?

имхо в прмом указании роута и есть то самое ненавязывание о которым ты говоришь , ты сам говоришь приложению что мы обрабатываем, в противном случае у нас 404

первое совпадение верное, и не будет недвусмысленых путей

а так же например

get user/auth выводим форму
post user/auth обрабатываем форму и авторизацию

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

-- опять же тут мое имхо основанное на программировании на yii zend и симфони


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

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



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15787
Пользователь №: 6543
На форуме: 8 лет, 3 месяца, 20 дней
Карма: 299

Трезвый :
6 лет, 29 дней


Ты опять не понял. Сейчас речь не о правилах, а о выборе формата задания правил. Я хочу сделать опционально, чтобы можно было использовать любой стандарт. Задали в настройках стандарт Symfony, значит будет работать по их правилам. Задали ZEND, значит по их. Сейчас речь пока идет о конверторе разных форматов. Чтобы он мог читать XML, JSON и YAML и переводить их в обычный PHP массив. С первыми двумя особых проблем нет, а вот для YAML в PHP хоть и есть библиотека, но она не входит в стандартный набор. Так что нужно писать ручками.

Вот это я и предлагаю сделать тем, кто хотел бы поучаствовать. smile.gif Под моим чутким руководством естественно и с любой помощью и консультациями. Для тех, кто хоечт повысить уровень, это неплохой вариант кстати. От конкурсов помнится многие были в восторге, как они скилы прокачивали.


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
bestxp  
Дата
Цитировать сообщение

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



орангутанг
******

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




а зачем тебе парсить yaml ?)

вон http://symfony.com/doc/current/book/routing.html например, напротив первого варианта у них там есть выбор каким образом задать роутинг =)

аннотация
xml
yml
php

далее пример лары

http://laravel.com/docs/4.2/routing

просто фишка в том как описать роуты я имел ввиду =)

а формат как сохранишь не важно

но опять же мое имхо и мое предложение и только


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

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



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15787
Пользователь №: 6543
На форуме: 8 лет, 3 месяца, 20 дней
Карма: 299

Трезвый :
6 лет, 29 дней


Цитата (bestxp @ 23.10.2015 - 09:34)
а формат как сохранишь не важно

Как раз это мне сейчас и важно. Разбирать роуты я буду на следующем этапе. Пока хочу сделать выбор. Может кто то захочет взять уже готовый от Зенда biggrin.gif Или от Symfony. Или кто-нибудь захочет попрактиковаться. Да мало ли. У меня в спецификации написано:
Цитата
Фреймворк дает свободу программисту, не создавая каких-либо структурных ограничений и конвенций
Значит не нужно ограничивать одним форматом, коли есть такая возможность. smile.gif

А что, Symfony не поддерживает JSON?


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
bestxp  
Дата
Цитировать сообщение

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



орангутанг
******

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




а зачем он там нужен

основное сейчас
yml и аннотации

притом что php и xml это отчасти легаси и мало кто использует их


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

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



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15787
Пользователь №: 6543
На форуме: 8 лет, 3 месяца, 20 дней
Карма: 299

Трезвый :
6 лет, 29 дней


А JSON используют?
Цитата (bestxp @ 23.10.2015 - 10:50)
а зачем он там нужен

Ну такая вот блажь у меня. smile.gif Хочу все форматы.


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
 ۩  Дата
Цитировать сообщение

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



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15787
Пользователь №: 6543
На форуме: 8 лет, 3 месяца, 20 дней
Карма: 299

Трезвый :
6 лет, 29 дней


Косячек у тебя в сниппете.

$routes = preg_match_all($path, '/hello/my/name/is-god/world2', $result, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arh  
[x] Дата
Цитировать сообщение

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



146%
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2156
Пользователь №: 27172
На форуме: 5 лет, 9 месяцев, 21 день
Карма: 73




Я тоже всё хотел роутер написать себе, но сейчас времени нет, на работу устроился =)
Вот только не пойму зачем так сильно усложнять правила запуска.
По сути ведь главное по какой то ссылке подключить нужный контроллер.
Например

#На главной запустить домашнюю страницу и слайдер
$Router->set('/', function () {
запустить('abc\controllers\Home.php');
запустить('abc\controllers\Slider.php');
});

#На любой странице запустить опрос и меню сайта
$Router->set('*', function () {
запустить('abc\controllers\Vote.php');
запустить('abc\controllers\Menu.php');
});

#Запустить модуль новостей на всех страницах начинающихся с /news/
$Router->set('/news/*', function () {
запустить('abc\controllers\News.php');
});

#Запустить комментарии на страницах начинающихся с /news/id/
$Router->set('/news/id/*', function () {
запустить('abc\controllers\Comments.php');
});

$Router->run();


Ну примерно так.
А остальное сами контроллеры будут определять из параметров $_GET/$_POST
То есть допустим есть контроллер который выводит 10 последних новостей, он их берет из контроллера News.php и кэширует, что бы каждый раз не дёргать базу.
Нужно при добавлении новости News.php чистить этот кэш, сам News.php этого делать разумеется не умеет, потому что он даже не знает о существовании модуля "10 последних новостей".
Вешаем на страницу добавления новости какой то скрипт, который чистит кэш если есть $_POST['safe'].
то есть, если новость сохранили/отредактировали/добавили.
$Router->set('/news/add/', function () {
запустить('abc\controllers\NewsLastCacheClear.php'); //if(isset($_POST['safe'])) $Cache->delete('last');
});


--------------------
:)
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
 ۩  Дата
Цитировать сообщение

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



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15787
Пользователь №: 6543
На форуме: 8 лет, 3 месяца, 20 дней
Карма: 299

Трезвый :
6 лет, 29 дней


Ты, я гляжу, человек не ленивый совсем. smile.gif Я еще прошлый раз удивлялся, сколько нужно терпения, чтобы такие горы кода писать.
Цитата (Arh @ 23.10.2015 - 17:55)
Вот только не пойму зачем так сильно усложнять правила запуска.

Дык для автоматизации процесса. Как раз чтобы столько не писать. Кроме того, у тебя что, на страницу бывает несколько контроллеров?


--------------------
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Arh  
Дата
Цитировать сообщение

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



146%
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2156
Пользователь №: 27172
На форуме: 5 лет, 9 месяцев, 21 день
Карма: 73




twin
Цитата
Дык для автоматизации процесса. Как раз чтобы столько не писать.

Ну это если в ручном режиме всё описывать =)
Так то должен быть конфиг в файле или базе, который настроит роутинг.
Цитата
Кроме того, у тебя что, на страницу бывает несколько контроллеров?

Ну да, сколько угодно.
Хотя я наверное опять путаюсь в терминах. Сколько угодно не контроллеров, а сервисов.


--------------------
:)
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
OleKh  
Дата
Цитировать сообщение

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



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

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




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

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

Опции темыСтраницы: (2) [1] 2  Ответ в темуСоздание новой темыСоздание опроса