За последние 24 часа нас посетили 54060 программистов и 1779 роботов. Сейчас ищут 888 программистов ...

ЧПУ своими руками.

Тема в разделе "Прочие вопросы по PHP", создана пользователем miciew, 7 июл 2015.

  1. miciew

    miciew Новичок

    С нами с:
    7 июл 2015
    Сообщения:
    1
    Симпатии:
    0
    Доброго времени суток. У меня загвоздка на ЧПУ. Прописал правила в .htaccess, чтоб все запросы шли на index.php. Дальше парсю полученную ссылку и подгружаю нужный класс и его метод. Вот тут главный вопрос! Как определить, что вызван метод, которому нужно передавать аргументы?
    Например, есть 2 метода
    Код (Text):
    1. viewOne($id)
    и
    Код (Text):
    1. viewAll()
    .
    Код (Text):
    1. exmp.ru/city/viewOne/3
    . вызываю метод view класса city и передаю туда цифру 3.
    Код (Text):
    1. exmp.ru/city/viewAll/
    вызываю метод view класса city без параметров.

    Как определить на момент include_once в index.php какой метод вызывается и сколько параметров нужно передать?
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
  3. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    А не правильней ли сделать так, чтобы не надо было этого определять?

    Если URL совпал с неким шаблоном маршрута (включая все аргументы, конечно), то вызываем нужный метод. Если аргументы отсутствуют, значит URL не совпал с шаблоном и метод не будет вызван. Схематично так:
    Код (PHP):
    1. if (preg_match('~^/user/(\d+)$~', $uri, $matches)) {
    2.   $userController->showAction($matches[1]);
    3. } elseif (preg_match('~^/topic/move/(\w+)/(\w+)$~', $uri, $matches)) {
    4.   $topicController->moveAction($matches[1], $matches[2]);
    5. }
    Как можно вызвать эти методы неправильно?!

    Ну а если применить эту схему к списку маршрутов и обработке в цикле, то call_user_func_array() поможет повторить этот фокус с произвольным числом аргументов.

    Альтернативное решение: у всех подобных методов использовать один набор аргументов. Типа: myAction(array $args) и только так.