Всем привет, может кто-то сможет подсказать: Код (Text): $file = include __DIR__ . '/routs.php'; $file['2est'] = ['controller' => 'TestController', 'action' => 'Testlook']; file_put_contents(__DIR__ . '/routs.php', '<?php' . PHP_EOL . 'return' . PHP_EOL . var_export($file, true) . ';'); Идея в следующем: Взять существующие роуты, добавить новый и заново перезаписать файл. Мне моя реализация, кажется аляпистой, может кто-то подскажет более красивое решение?)
Чтобы сделать свободное ЧПУ --- Добавлено --- Не быть привязанным к /news/news1/ А например: /sport/nahiPro/ /mma/m1/ --- Добавлено --- Не быть привязанным к /news/news1/ А Еще есть плюшки, очень простой фронт. Без регулярок и лишних движений, я регулярки пока не знаю) Код (Text): <?php namespace App\Controllers; class FrontController { protected $uri; protected $routs; public function __construct() { $this->uri = parse_url($_SERVER['REQUEST_URI'])['path']; $this->routs = include __DIR__ . '/../routs.php'; } protected function rout() { if(isset($this->routs[$this->uri])){ $class = '\App\Controllers\\' . $this->routs[$this->uri]['controller']; $controller = new $class; $controller->action($this->routs[$this->uri]['action']); } else { $controller = new \App\Controllers\NotFound; $controller->action('display'); } } public function __invoke() { $this->rout(); } }
Я не въезжаю, почему этот файл надо генерировать через PHP, а не просто поправить текстовым редактором --- Добавлено --- P.S. По мне, регулярки идут раньше, чем MVC, по градиенту, но дело ваше
Не быть привязанным к /news/news1/ А Еще есть плюшки, очень простой фронт. Без регулярок и п Код (Text): <?php namespace App\Controllers; class FrontController { protected $uri; protected $routs; public function __construct() { $this->uri = parse_url($_SERVER['REQUEST_URI'])['path']; $this->routs = include __DIR__ . '/../routs.php'; } protected function rout() { if(isset($this->routs[$this->uri])){ $class = '\App\Controllers\\' . $this->routs[$this->uri]['controller']; $controller = new $class; $controller->action($this->routs[$this->uri]['action']); } else { $controller = new \App\Controllers\NotFound; $controller->action('display'); } } public function __invoke() { $this->rout(); } } Это файл маршрутов. Код (Text): <?php return [ '/news/' => ['controller' => 'NewsController', 'action' => 'allNews'], '/news/sport/' => ['controller' => 'NewsController', 'action' => 'allNews'], '/' => ['controller' => 'IndexController', 'action' => 'home'], '/news/article/' => ['controller' => 'ArticleController', 'action' => 'getArticle'], '/admin/' => ['controller' => 'AdminController', 'action' => 'getAdmin'], '/admin/news/' => ['controller' => 'AdminArticleController', 'action' => 'updateArticle'], '/admin/delete/' => ['controller' => 'AdminDeleteArticleController', 'action' => 'deleteArticle'], '/look/article/' => ['controller' => 'NewsController', 'action' => 'look'], ]; --- Добавлено --- Регулярные выражения надо учить, вы правы на все 100%
Ну поскольку пользователь вряд ли имеет дело с твоими контроллерами, то ты хочешь добавлять в роутер урл каждой статьи. Это ад. Учи регулярки http://phpfiddle.org/lite/code/v3ht-bjsw
Сегодня только начал учить, лучше что-то писать, чем просто сидеть Есть закрытая часть интерфейса пользователя - админка, а контроллер работает с пользовательскими данными $_POST, $_GET, $_REQUES. Я могу реализовать так: panel -> UrlController -> routs.php --- Добавлено --- Это больше учебные задания, я в реальных задачах это применять не буду Но все ровно, спасибо за указание правильного пути
@kentkent7, в 100% случаев достаточно предопределенного формата адресов для однотипных страниц, например news/(.+), а если хотите к странице произвольный адрес прикреплять сразу пишите его в БД, за одно и контроль на дубли сразу будет.
Это больше учебные задания, я в реальных задачах это применять не буду Но все ровно, спасибо за указание пра А как насчет нагрузки на базу?) --- Добавлено --- А дубли я могу контролировать обычным in_array --- Добавлено --- Однако, регулярки - наше все
Файл шерстить при каждом запросе – тоже еще то удовольствие. В БД по крайней мере проиндексировать поле можно. --- Добавлено --- В более простом случае можно и без них обойтись. Первый слаг можете связать с записью в какой-либо корневой таблице, второй (или целиком концовку пути) – с записью в таблице объектов конкретного типа. --- Добавлено --- Хотя для валидации формата адреса тоже можно регулярку использовать, но одну единственную. --- Добавлено --- Это модель данных используется во многих наших движках. --- Добавлено --- Роуты вообще не нужны.