Раз пишу об этом, значит так и считаю. Логично? Нашел вот диииико простой одноклассовый роутер. И все равно не понимаю что он должен делать? http://altorouter.com PHP: $router->map( 'GET', '/', 'render_home', 'home' ); По корневому пути вызывает функцию PHP: render_home из класса PHP: home Так что ли? Но это не работает?
ну судя по примеру, ты можешь писать в функцию всё что хочешь. В примере как раз инклудится файл, который ты хочешь, чтобы грузился по этому пути. А мой суперклёвый движочек делает то же самое, только автоматически.
Да ну? Я тебе всё объяснил, и почему твои поделки не работают, и что делать дальше... Конфиг ngnix ты отказался выложить, чтоб тебе помогли его поправить. А так Pux вполне себе рабочий вариант, и странно, что после Symfony с таким же роутером ты не можешь пользоваться этой штуковиной. @SamyRed, поищи темы @igordata, он его бесплатно в git и composer выложил, пользуйся-не хочу. Любопытная штучка, на самом деле, просто не знаю, зачем она лично мне. --- Добавлено --- За 5 секунд находим в доках, как этой штукой пользоваться: PHP: // match current request url $match = $router->match(); // call closure or throw 404 status if( $match && is_callable( $match['target'] ) ) { call_user_func_array( $match['target'], $match['params'] ); } else { // no route was matched header( $_SERVER["SERVER_PROTOCOL"] . ' 404 Not Found'); } Первый повеселее будет, имхо.
Дело не в нем. И я сказал что на локалке поставил апач и воспользовался htaccess`ом - чтобы наверняка. И как же в симфонии он используется? Там автороутинг по именам классов. Возиться с путями не нужно и есть готовые хелперы, поэтому никогда не приходится задумываться «как оно работает». Цель топика я как бы описал в первом же посте. Но так никто ничего и не смог объяснить. Дока..дока. Я эту доку точно также вижу как и примеры, которые не работают. Окей вот текущий затупок: Код (Text): **Pux** $mux->post('/product/:id', ['Controllers\Product', 'productAction'], [ 'require' => ['id' => '\d+',], 'default' => ['id' => '1',] ]); **Controller** class Product extends Controller { public function productAction($id) { print json_encode(["response" => $id]); } } Код (Javascript): **View:** $.ajax({ url: "/product/", type: "POST", data: {id: "20"}, dataType: "JSON" }); Ничего не приходит... Ошибка Argument 1 Passed to Executer::execute(). Код (Javascript): var $id = 20; $.ajax({ url: "/product/" + $id, type: "POST", dataType: "JSON" }); Так приходит. Но это бред, должна же регулярка отрабатывать.
Нет, не должна. PHP: $route = $mux->dispatch( $_SERVER['PATH_INFO'] ); Регулярка сравнивает с шаблоном непосредственно $_SERVER['PATH_INFO'], а в нём только url без домена, больше ничего. Туда POST-данные автоматом PHP не включает! Я вам об этом уже писал - ловить данные из POST таким образом не выйдет. Работайте с ними из функции как обычно. А что, в Symfony POST-данные подставляются в маршрут? По поводу роутинга в симфони был не прав, но я с ним не работал. Работал с Silex, который позиционируется как мими-сифони, поэтому думал, что также. В Laravel точно также.
Только так. НО тогда игнорируется регулярное выражение в маршруте! А по шаблону /product/:id ничерта не работает. Спойлер: Скриншот 1 Спойлер: Скриншот 2 Не понял о чем речь. В смысле в формы? Так то хз, я привык все асинхронно отправлять, не обращал внимания. Ну суть что там записывается именно так. Data отправляется отдельно. Хотя черт его знает, может он еще как то обрабатывается. Может так понятнее будет, о чем я тут второй третий вещаю. В дополнение к скринам. Спойлер: PHP PHP: namespace Controllers; use app\Pux\Controller; use app\Pux\Mux; use app\Pux\Executor; spl_autoload_register(function ($className) { require_once $_SERVER["DOCUMENT_ROOT"] . "/$className.php"; }); class Product extends Controller { public function productAction($id) { print json_encode([$id]); } } $mux = new Mux; $mux->get('/', ['Controllers\Hello', 'indexAction']); $mux->post('/product/:id', ['Controllers\Product', 'productAction'], [ 'require' => ['id' => '\d+',], 'default' => ['id' => '1',] ]); $mux->get('/product:id', ['Controllers\Product', 'productAction'], [ 'default' => ['id' => '1',] ]); $route = $mux->dispatch($_SERVER["REQUEST_URI"]); Executor::execute($route);
Ничего не игнорируется. Если вы ID передаёте в POST, то его нету в маршруте. Маршрут - это урл. Никак не могу понять, что в этом сложного.
Да как нету то? $_POST приходит спокойно без маршрута если его отдельно обрабатывать. В смысле не через мапер роутера, а просто принимать в вызываемой функции. PHP: public function productAction() { print json_encode([$_POST]); } Код (Javascript): $data = {id : $("#id", this).val()} $.ajax({ url: "/product", type: "POST", data: $data, dataType: "JSON", Спойлер: Скриншот
Он есть в $_POST, а регуляркой вы обрабатываете $_SERVER["PATH_INFO"], вот в $_SERVER["PATH_INFO"] его нету. --- Добавлено --- Маршрут не включает то, что передано через POST. По идее, даже то, что передано через GET конкретно в $_SERVER["PATH_INFO"] отсутствует
В REQUEST_URI тоже нету POST-параметров Их вообще нету в URI --- Добавлено --- Вы var_export($_SERVER) хоть раз изучали?
спасибо за тёплые слова. Тебе конечно она ни за чем. На нём хорошо делтаь то, что хочет господин ТС, как раз - мелкий сайт с парой форм.
Как раз таки вообще ни разу Сам сайт не «мелкий», а вот урлов для API всего 5 и находятся они на поддомене. Для него и нужен был роутер. Как и говорил поднимать там отдельно фрейворк было глупо. В общем разобрался в итоге более менее.