@dev400

Вопрос по роутингу. Как убрать один из элементов?

Система работает так: "site.ru/news/horoshaya-novost"
Тоесть `news` это класс-контроллер, а `horoshaya-novost` это аргумент метода в этом классе.
Каким способом можно убрать `news` из адресной строки, если мы будем обращаться к конкретной новости?
Хотелось бы сделать по адресу "site.ru/news" вывод всех новостей, а по адресу "site.ru/horoshaya-novost" вывод конкретной новости
  • Вопрос задан
  • 273 просмотра
Пригласить эксперта
Ответы на вопрос 3
Ну можно через магический метод __call. Он вызовется если не найден метод. Так же можно все ссылки хранить в базе и там хранить класс и метод с параметром вызова.
Ответ написан
Комментировать
@danforth
Вы сами писали код? Если да, то сами должны разобраться. А если нет, то нам нужно понять как у вас вообще устроена система. Кто инициализирует нужные контроллеры? Используете ли вы Router?

Я бы сделал так
Router::get("/{$params}", function(){
\Controller\News::init();
});


В самом классе News::init() проверяем $params. Если там ничего нету - News::indexAction();. Если есть, News::getActionByUri($params), и делаем запрос в базу вроде SELECT * FROM news WHERE uri = $params.
Естественно, фильтруйте запросы в базу.

P.S. Сам новичок, поэтому на приз за лучшую реализацию не претендую, но исходя из своих собственных знаний на данный момент - делал бы это как-то так.

UPD: у меня в вопросах есть тема про Router vs FrontController. Там есть касательно роутинга немного, вдруг что-то подчерпнёте.
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Статические роуты. В роутере перечислены все возможные значения для контроллеров (в вашем случае news), все остальное работает как параметры к определенному контроллеру/экшену, можно задавать правила обработки для каких-то хитрых параметров типа "good_news_everyone_news" - где последнее слово после андерскора будет говорить о том что это новость. Это уже тонкости реализации имхо.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы