За последние 24 часа нас посетили 16724 программиста и 1694 робота. Сейчас ищет 861 программист ...

Pux роутер.

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

  1. rukisalat

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

    С нами с:
    18 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    Эх, так по существу никто и не ответил... :(
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты так считаешь?
     
  3. rukisalat

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

    С нами с:
    18 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    Раз пишу об этом, значит так и считаю. Логично?

    Нашел вот диииико простой одноклассовый роутер. И все равно не понимаю что он должен делать? http://altorouter.com

    PHP:
    1. $router->map( 'GET', '/', 'render_home', 'home' );
    По корневому пути вызывает функцию
    PHP:
    1. render_home
    из класса
    PHP:
    1. home
    Так что ли? Но это не работает?
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Я надеюсь ты победишь в своей неравной борьбе с роутерами и кое-чем ещё.
     
  5. rukisalat

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

    С нами с:
    18 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    Короч этот роутер оказывается без экзекутора. Рукалицо. Он просто сравнивает пути.
     
  6. igordata

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

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

    А мой суперклёвый движочек делает то же самое, только автоматически. :p
     
    denis01 нравится это.
  7. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Уже не раз видел как ты нахваливаешь свой движок. Ты его продаешь, что ли?))
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Да ну? Я тебе всё объяснил, и почему твои поделки не работают, и что делать дальше... Конфиг ngnix ты отказался выложить, чтоб тебе помогли его поправить. А так Pux вполне себе рабочий вариант, и странно, что после Symfony с таким же роутером ты не можешь пользоваться этой штуковиной.

    @SamyRed, поищи темы @igordata, он его бесплатно в git и composer выложил, пользуйся-не хочу. Любопытная штучка, на самом деле, просто не знаю, зачем она лично мне.
    --- Добавлено ---
    За 5 секунд находим в доках, как этой штукой пользоваться:
    PHP:
    1. // match current request url
    2. $match = $router->match();
    3.  
    4. // call closure or throw 404 status
    5. if( $match && is_callable( $match['target'] ) ) {
    6.     call_user_func_array( $match['target'], $match['params'] );
    7. } else {
    8.     // no route was matched
    9.     header( $_SERVER["SERVER_PROTOCOL"] . ' 404 Not Found');
    10. }
    Первый повеселее будет, имхо.
     
    igordata нравится это.
  9. rukisalat

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

    С нами с:
    18 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    Дело не в нем. И я сказал что на локалке поставил апач и воспользовался htaccess`ом - чтобы наверняка.
    И как же в симфонии он используется? Там автороутинг по именам классов. Возиться с путями не нужно и есть готовые хелперы, поэтому никогда не приходится задумываться «как оно работает». Цель топика я как бы описал в первом же посте.
    Но так никто ничего и не смог объяснить. Дока..дока. Я эту доку точно также вижу как и примеры, которые не работают.
    Окей вот текущий затупок:
    Код (Text):
    1. **Pux**
    2. $mux->post('/product/:id', ['Controllers\Product', 'productAction'], [
    3.     'require' => ['id' => '\d+',],
    4.     'default' => ['id' => '1',]
    5. ]);
    6.  
    7. **Controller**
    8. class Product extends Controller {
    9.     public function productAction($id) {
    10.         print json_encode(["response" => $id]);
    11.     }
    12. }
    Код (Javascript):
    1. **View:**
    2. $.ajax({
    3. url: "/product/",
    4. type: "POST",
    5. data: {id: "20"},
    6. dataType: "JSON"
    7. });
    Ничего не приходит... Ошибка Argument 1 Passed to Executer::execute().
    Код (Javascript):
    1. var $id = 20;
    2. $.ajax({
    3. url: "/product/" + $id,
    4. type: "POST",
    5. dataType: "JSON"
    6. });
    Так приходит. Но это бред, должна же регулярка отрабатывать.

     
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Нет, не должна.
    PHP:
    1. $route = $mux->dispatch( $_SERVER['PATH_INFO'] );
    Регулярка сравнивает с шаблоном непосредственно $_SERVER['PATH_INFO'], а в нём только url без домена, больше ничего. Туда POST-данные автоматом PHP не включает! Я вам об этом уже писал - ловить данные из POST таким образом не выйдет. Работайте с ними из функции как обычно. А что, в Symfony POST-данные подставляются в маршрут? По поводу роутинга в симфони был не прав, но я с ним не работал. Работал с Silex, который позиционируется как мими-сифони, поэтому думал, что также. В Laravel точно также.
     
  11. rukisalat

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

    С нами с:
    18 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    Только так. НО тогда игнорируется регулярное выражение в маршруте!
    А по шаблону /product/:id ничерта не работает.
    [​IMG]
    [​IMG]

    Не понял о чем речь. В смысле в формы? Так то хз, я привык все асинхронно отправлять, не обращал внимания. Ну суть что там записывается именно так. Data отправляется отдельно. Хотя черт его знает, может он еще как то обрабатывается.

    Может так понятнее будет, о чем я тут второй третий вещаю.
    В дополнение к скринам.
    PHP:
    1. namespace Controllers;
    2.  
    3. use app\Pux\Controller;
    4. use app\Pux\Mux;
    5. use app\Pux\Executor;
    6.  
    7. spl_autoload_register(function ($className) {
    8.     require_once $_SERVER["DOCUMENT_ROOT"] . "/$className.php";
    9. });
    10.  
    11. class Product extends Controller {
    12.  
    13.     public function productAction($id) {
    14.         print json_encode([$id]);
    15.     }
    16. }
    17.  
    18. $mux = new Mux;
    19. $mux->get('/', ['Controllers\Hello', 'indexAction']);
    20. $mux->post('/product/:id', ['Controllers\Product', 'productAction'], [
    21.     'require' => ['id' => '\d+',],
    22.     'default' => ['id' => '1',]
    23. ]);
    24. $mux->get('/product:id', ['Controllers\Product', 'productAction'], [
    25.     'default' => ['id' => '1',]
    26. ]);
    27. $route = $mux->dispatch($_SERVER["REQUEST_URI"]);
    28. Executor::execute($route);
     
    #36 rukisalat, 6 янв 2017
    Последнее редактирование: 6 янв 2017
  12. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ничего не игнорируется. Если вы ID передаёте в POST, то его нету в маршруте. Маршрут - это урл. Никак не могу понять, что в этом сложного.
     
  13. rukisalat

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

    С нами с:
    18 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    Да как нету то? :) $_POST приходит спокойно без маршрута если его отдельно обрабатывать. В смысле не через мапер роутера, а просто принимать в вызываемой функции.

    PHP:
    1. public function productAction() {
    2.         print json_encode([$_POST]);
    3.     }
    Код (Javascript):
    1. $data = {id : $("#id", this).val()}
    2.                 $.ajax({
    3.                     url: "/product",
    4.                     type: "POST",
    5.                     data: $data,
    6.                     dataType: "JSON",
    [​IMG]
     
  14. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Он есть в $_POST, а регуляркой вы обрабатываете $_SERVER["PATH_INFO"], вот в $_SERVER["PATH_INFO"] его нету.
    --- Добавлено ---
    Маршрут не включает то, что передано через POST. По идее, даже то, что передано через GET конкретно в $_SERVER["PATH_INFO"] отсутствует
     
  15. rukisalat

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

    С нами с:
    18 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    Да при чем тут path_info, когда request_uri.
     
  16. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    В REQUEST_URI тоже нету POST-параметров :) Их вообще нету в URI
    --- Добавлено ---
    Вы var_export($_SERVER) хоть раз изучали?
     
  17. rukisalat

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

    С нами с:
    18 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    Короч можно дропать топик.... Лучше на стаковере буду спамить.
     
  18. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    И тебе там ответят тоже самое - нефиг в урле искать POST-параметры :)
     
  19. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    спасибо за тёплые слова. Тебе конечно она ни за чем. На нём хорошо делтаь то, что хочет господин ТС, как раз - мелкий сайт с парой форм.
     
  20. rukisalat

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

    С нами с:
    18 сен 2013
    Сообщения:
    39
    Симпатии:
    0
    Как раз таки вообще ни разу:)
    Сам сайт не «мелкий», а вот урлов для API всего 5 и находятся они на поддомене. Для него и нужен был роутер.
    Как и говорил поднимать там отдельно фрейворк было глупо. В общем разобрался в итоге более менее.
     
  21. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а, понял
    такой роутер можно было бы написать самому на коленке за 10 минут, прости :D