За последние 24 часа нас посетили 15608 программистов и 1554 робота. Сейчас ищут 873 программиста ...

Pux роутер.

Тема в разделе "PHP для новичков", создана пользователем rukisalat, 2 янв 2017.

  1. rukisalat

    rukisalat Активный пользователь

    С нами с:
    18 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    Всех приветствую.
    Очень продолжительное время пишу на Symfony/YII и внезапно поймал себя на мысли, что я совершенно не могу работать с standalone приложениями.
    К ним относится к примеру довольно известный роутер Pux (GitHub).
    То что с помощью фреймворка решается на уровне «мышечной памяти», в каких то своих проектах без использования этого самого фрейма, превращается в кашу.
    В общем, прощу помощи дабы разобраться с тем, как правильно использовать данную библиотеку.
    Не нужно относиться к этому вопросу аля «эээ, иди кури php.net». Там уже все прокурено и перекурено.
    Просто с годами потерял скилл нативной разработки.
    Затык с роутером происходит сразу же на этапе определения путей.
    Как говорит дока:
    PHP:
    1. use Pux\Mux;
    2. use Pux\Executor;
    3. $mux = new Mux;
    4. $mux->get('/get', ['HelloController','helloAction']);
    5. $mux->post('/post', ['HelloController','helloAction']);
    6. $mux->put('/put', ['HelloController','helloAction']);
    7.  
    8. $mux->mount('/hello', new HelloController);
    9.  
    10. $route = $mux->dispatch( $_SERVER['PATH_INFO'] );
    11. echo Executor::execute($route);
    Естественно классы уже загружены через spl_autoload_register.
    Создан контроллер HelloController наследуемый от Pux с паблик экшеном helloAction.
    Вот только ничего абсолютно не происходит, в логах тоже пусто.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    какой смысл ты вкладываешь в это понятие?
    --- Добавлено ---
    так а зачем ты пытаешься писать без своего любимого фреймворка? какой в этом смысл?
    --- Добавлено ---
    ты уверен, что тебе интересен именно $_SERVER['PATH_INFO'], а не $_SERVER['REQUEST_URI'] ? мне кажется, что последний более подходящий для задачи обработки урлов.
     
  3. rukisalat

    rukisalat Активный пользователь

    С нами с:
    18 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    Гит смотрел? В доке такой пример.

    Ах да, я забыл, как здесь модер супер толсто троллит.
    Как бы юзать симфонию ради 5 страниц аля лендниг.. надо быть бичом конкретным.
    Однако должна быть возможность добавить/убавить пару страниц и функционала, а не гемороиться с написанием модуля для фрейма или того хуже cms.
     
    #3 rukisalat, 2 янв 2017
    Последнее редактирование: 2 янв 2017
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    сильно пахнуло хамством...
    если это твой единственный аргумент, то тебе наверное лучше оставаться в мире фреймворков :D

    да ну и ладно. повардампи оба варианта, и реши какой тебе больше подходит.

    завязывай хамить и подозревать заговоры. параноиком станешь.

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

    а почему не взять например ModX? отличная система.
    Хотя я тебя понимаю, я тоже свой движочек накидал для маленьких сайтов. Остался очень доволен. Ну да самим собою довольным быть несложно, это так.

    Как раз поэтому и говорю про $_SERVER['REQUEST_URI']. Тут сидит весь запрошенный урл, а не кусок после файла php. Я его парсю через parse_url(), соотв. потом по path ищу подходящий файлик, а в случае Pux видимо его и надо парсить. Хотя возможно в $_SERVER['PATH_INFO'] по счастливому совпадению уже сидит то что нужно, но в доке у этого значения нет гарантий, что так будет всегда.
     
  5. rukisalat

    rukisalat Активный пользователь

    С нами с:
    18 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    Да я уже обвардампился весь. Поэтому и спрашиваю на форуме, может кто пользовался именно этой библиотекой.
    На Тостере тоже никто не вкуривает, там такие же сплошные фреймворкщики.
    Это кто кому хамит еще :mad:
    В жизни то никому доверять нельзя, а в интернетах так и подавно. Сплошной сарказм и ирония.
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну так ты попробовал то, что я предложил? я просто не понял это по твоему сообщению.
     
  7. rukisalat

    rukisalat Активный пользователь

    С нами с:
    18 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    Да пробовал конечно. В общем с этим примером что то не то, ибо экзекутор должен принимать массив.
    Ну это ладно, пол беды. Самое что меня интересует то, что объявленные методы не обрабатывают ни контроллер ни параметры post/get.
    В этом то и был вопрос. Задаю путь по образу и подобию доки:
    PHP:
    1. get("/home/:id", ['HomeController','indexAction'])
    Ну и на этом все. Параметры из строки вообще не принимает. Nginx настроен точно так как указано в доке.
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а нафига ты ради как ты сказал простого сайта так морочишься? бери мой двиг :D
     
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Так протрассируй этот роутер отладчиком в NetBeans или PHPStorm, и узнай, что там и как работает. Видимо, что-то не срабатывает. Я, когда маленький сайт, в качестве фреймворка использую https://www.slimframework.com/
    --- Добавлено ---
    Кстати, а у HelloController глобальный namespace?
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Стало интересно, поигрался на локалке. Всё работает.
    PHP:
    1. <?php
    2. require 'vendor/autoload.php';
    3. use Pux\Mux;
    4. use Pux\Executor;
    5.  
    6. class HelloController {
    7.     function helloAction()
    8.     {
    9.         echo "Hello";
    10.     }
    11.  
    12.     function goodBuy()
    13.     {
    14.         echo "Good buy";
    15.     }
    16. }
    17.  
    18. $mux = new Mux;
    19. $mux->get('/', ['HelloController','helloAction']);
    20. $mux->get('/good-buy', ['HelloController','goodBuy']);
    21. $route = $mux->dispatch(str_replace("/utils/pux", "", $_SERVER['REQUEST_URI']));
    22. echo Executor::execute($route);
    Строка 21 приобрела такой странный вид, потому что мне лень было отдельный домен создавать под эксперимент, и у меня эта штука доступна по пути "localhost/utils/pux". Разбираться, как сделать правильно сайт во вложенной папке на этой штукенции было лень :) Для работы роута good-buy естественно апач был настроен на перенаправление запросов на index.php (@igordata, знаю, скажешь, "апач не нужен". А он мне нравится, нравится, нравится, ну и не в том вопрос был). Но что-то для выполнение всего одной функции он много зависимостей натянул с собой на мой вкус. PATH_INFO у меня на локалке нету в $_SERVER, настраивать неохота - опять же, ради 5 минут эксперимента.
    --- Добавлено ---
    И с параметром попробовал, работает. Короче, дело скорее всего таки в настройках сервера
     
    #10 mkramer, 2 янв 2017
    Последнее редактирование: 2 янв 2017
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    не нужен, но сердцу не прикажешь
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Вообщем, ТС, выложи конфиг ngnix для сайта, знатоки подскажут. Дело явно в нём. Ну и проверь, есть ли у тебя PATH_INFO в $_SERVER, когда ngnix без апача работает, там вроде надо ещё что-то в конфиг прописать, чтоб было.
     
  13. rukisalat

    rukisalat Активный пользователь

    С нами с:
    18 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    И правда. Странно, на том же Yii конфиг нормально в index перенаправляет. Пока что на локалке индейца запустил, потом буду смотреть что за дела с нгинксом. Ну раз завелось, значит пришло время следующего вопроса :)

    Есть у нас значит форма:
    HTML:
    1. <form action="" method="post">
    2. <input type="input" name="id" value="1"/>
    3. <input type="submit" value="Send"/>
    4. </form>
    И путь по которому должен приниматься Post:
    PHP:
    1. $mux->post('/:id', ['Controllers\FormController', 'postAction']);
    Где экшн просто возвращает значение:
    PHP:
    1. public function postAction($id) {
    2.         print "postAction: $id";
    3.     }
    В общем все как в примере. Но данные не приходят. Куда копать?
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Так, эм... Пост-параметра нету в маршруте :) Как говорится, элементарно. POST-параметры, видимо, нужно как обычно принимать. А из маршрута и аргумента его уберите :)
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    вот уж чо-чо а мой движок тут идеально ложится... ну да и ладно.
     
  16. rukisalat

    rukisalat Активный пользователь

    С нами с:
    18 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    :):):):):)

    Лучше помогите разобраться в данном случае. Я тут погуглил, почитал, посмотрел устройство различных форков из симфониевского роутера.
    Не могу понять принцип устройства в общем. Понятное дело что основная суть в парсинге и разборе запросов, все мы когда писали свои parse_url и switch case.
    Но во всех классах используются устоявшиеся обозначения методов типа mux, mount, add, dispatch, execute. Я совершенно не въезжаю в их закономерности.
    Еще раз повторюсь, что долгое время работал с фреймами, где настройка роутинга заканчивается на перенаправлении всех запросов в корень и все. Далее происходит работа только на уровне MVC.
    Вся документация к роутерам написана так, будто рассчитана на динозавров, принимавших участие в становлении Lisp. Совершенно ничего не понятно (возможно только мне). Поэтому и прошу разъяснений.
     
  17. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я честно говоря пока ещё не встречал человка, который реально пользуется отдельными роутерами. Так что может в этом причина.
     
    denis01 нравится это.
  18. rukisalat

    rukisalat Активный пользователь

    С нами с:
    18 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    Мне в данный момент это кажется достаточно разумным. Если абстрагироваться от юзабилити на стороне клиента, скажем администрирования через браузер и от огромного количества «мусора» который тянется в след за CMS и любым фреймворком (авторизации, шаблонов, комментов, диких сетов всевозможных фильтров, загрузки на сервер и тд), иногда появляются задачи, которые нужно описать в два три класса и заложить в функционал надежду на масштабируемость :)
    В данный момент мне необходим роутер для создания взаимодействия с API, который семимильными шагами множит ветки от различных методов и документацией к нему, одновременно все фичи организовав в рамках стандартного паттерна mvc.
    Все это было просто на начальном этапе, сейчас же появилась необходимость организовать что то то похожее на https://vk.com/dev. Отсюда и желание разобраться с роутингом.
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    редактирование контента в IDE и отказ от админки в браузере за ненадобностью - это как раз те самые причины, по которым я сделал свой движок. Как следствие прилипла нормальная подсветка синтаксиса, без коверканья, и поддержка систем версий.
     
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    @rukisalat, а в чём проблема с этим роутером? Я его завёл вчера за 5 минут. Ну только глупостями заниматься не нужно, ожидая что post-параметр каким-то образом можно будет поймать, разобрав регуляркой $_SERVER["PATH_INFO"], как вы предполагаете здесь:
    Насколько мне известно, в Symfony роутинг примерно также и фигачится, и в Laravel тоже. Поэтому я ими и не пользуюсь :) Мне нравится, чтоб как в Yii, controller/action превращалось в вызов соответственного класса и метода без моей помощи. Но что-то сложнее я мог объяснить. Хотя, повторюсь, я вряд ли эту штуку возьму. Когда я делаю что-то маленькое, я беру это: slimframework.com или это: https://fatfreeframework.com

     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    и который тебя больше прёт?
    --- Добавлено ---
    А опыт API у кого-то есть? Кто что предпочитает?
     
  22. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Со Slim у меня как-то лучше сложилось. Пробовал ещё Silex (на реальном проекте), но он столько symphony по зависимостям тянет, что его уже микрофреймфорком и не назовёшь. И с Lumen (с ним только немного игрался) та же ситуация, он тянет слишком много Laravel.
     
    igordata нравится это.
  23. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Да и отвечу твоими же словами
     
  24. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а чего у тебя за двиг на апи? а чего за апи? заинтриговал
     
  25. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Налабал по началу двиг для парсера UBER'а, потом переписал под API для пластиковых карточек, потом дописал для обычного сайта со smarty, сейчас буду снова подтачивать под API, для приложений. Опциональный роутинг, query path = namespace и прочая приблуда.