За последние 24 часа нас посетили 18785 программистов и 1651 робот. Сейчас ищут 934 программиста ...

Запись routs в файл

Тема в разделе "PHP для новичков", создана пользователем kentkent7, 11 июн 2018.

  1. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Всем привет, может кто-то сможет подсказать:

    Код (Text):
    1.  
    2. $file = include __DIR__  . '/routs.php';
    3. $file['2est'] = ['controller' => 'TestController', 'action' => 'Testlook'];
    4. file_put_contents(__DIR__ . '/routs.php', '<?php' . PHP_EOL . 'return' . PHP_EOL . var_export($file, true) . ';');
    Идея в следующем:
    Взять существующие роуты, добавить новый и заново перезаписать файл.
    Мне моя реализация, кажется аляпистой, может кто-то подскажет более красивое решение?)
     
    #1 kentkent7, 11 июн 2018
    Последнее редактирование: 11 июн 2018
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Нормальная реализация, делают так. Только для роутов как-то странно: зачем это делать динамически?
     
    kentkent7 нравится это.
  3. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Чтобы сделать свободное ЧПУ
    --- Добавлено ---
    Не быть привязанным к /news/news1/
    А например:
    /sport/nahiPro/
    /mma/m1/
    --- Добавлено ---
    Не быть привязанным к /news/news1/
    А
    Еще есть плюшки, очень простой фронт.
    Без регулярок и лишних движений, я регулярки пока не знаю)

    Код (Text):
    1. <?php
    2.  
    3. namespace App\Controllers;
    4.  
    5. class FrontController
    6. {
    7.       protected $uri;
    8.       protected $routs;
    9.  
    10.       public function __construct()
    11.       {
    12.             $this->uri = parse_url($_SERVER['REQUEST_URI'])['path'];
    13.             $this->routs = include __DIR__ . '/../routs.php';
    14.       }
    15.      
    16.       protected function rout()
    17.       {
    18.             if(isset($this->routs[$this->uri])){
    19.                   $class = '\App\Controllers\\' . $this->routs[$this->uri]['controller'];
    20.                   $controller = new $class;
    21.                   $controller->action($this->routs[$this->uri]['action']);
    22.             } else {
    23.                   $controller = new \App\Controllers\NotFound;
    24.                   $controller->action('display');
    25.             }
    26.       }
    27.  
    28.       public function __invoke()
    29.       {
    30.             $this->rout();
    31.       }
    32. }
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Я не въезжаю, почему этот файл надо генерировать через PHP, а не просто поправить текстовым редактором
    --- Добавлено ---
    P.S. По мне, регулярки идут раньше, чем MVC, по градиенту, но дело ваше
     
  5. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Не быть привязанным к /news/news1/
    А
    Еще есть плюшки, очень простой фронт.
    Без регулярок и п

    Код (Text):
    1. <?php
    2.  
    3. namespace App\Controllers;
    4.  
    5. class FrontController
    6. {
    7.       protected $uri;
    8.       protected $routs;
    9.  
    10.       public function __construct()
    11.       {
    12.             $this->uri = parse_url($_SERVER['REQUEST_URI'])['path'];
    13.             $this->routs = include __DIR__ . '/../routs.php';
    14.       }
    15.    
    16.       protected function rout()
    17.       {
    18.             if(isset($this->routs[$this->uri])){
    19.                   $class = '\App\Controllers\\' . $this->routs[$this->uri]['controller'];
    20.                   $controller = new $class;
    21.                   $controller->action($this->routs[$this->uri]['action']);
    22.             } else {
    23.                   $controller = new \App\Controllers\NotFound;
    24.                   $controller->action('display');
    25.             }
    26.       }
    27.  
    28.       public function __invoke()
    29.       {
    30.             $this->rout();
    31.       }
    32. }
    Это файл маршрутов.
    Код (Text):
    1. <?php
    2.  
    3. return
    4. [
    5.     '/news/' => ['controller' => 'NewsController', 'action' => 'allNews'],
    6.     '/news/sport/' => ['controller' => 'NewsController', 'action' => 'allNews'],
    7.     '/' => ['controller' => 'IndexController', 'action' => 'home'],
    8.     '/news/article/' => ['controller' => 'ArticleController', 'action' => 'getArticle'],
    9.     '/admin/' => ['controller' => 'AdminController', 'action' => 'getAdmin'],
    10.     '/admin/news/' => ['controller' => 'AdminArticleController', 'action' => 'updateArticle'],
    11.     '/admin/delete/' => ['controller' => 'AdminDeleteArticleController', 'action' => 'deleteArticle'],
    12.     '/look/article/' => ['controller' => 'NewsController', 'action' => 'look'],
    13. ];
    --- Добавлено ---
    Регулярные выражения надо учить, вы правы на все 100%
     
  6. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ещё раз. Зачем тебе его генерировать пыхой? Ведь сюда маршрут можно добавить обычным редактором
     
  7. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Чтобы когда пользователь добавляет страницу в интерфейсе, Она появлялась в маршрутах
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ну поскольку пользователь вряд ли имеет дело с твоими контроллерами, то ты хочешь добавлять в роутер урл каждой статьи. Это ад. Учи регулярки
    http://phpfiddle.org/lite/code/v3ht-bjsw
     
  9. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Сегодня только начал учить, лучше что-то писать, чем просто сидеть :)
    Есть закрытая часть интерфейса пользователя - админка, а контроллер работает с пользовательскими данными $_POST, $_GET, $_REQUES.
    Я могу реализовать так: panel -> UrlController -> routs.php
    --- Добавлено ---
    Это больше учебные задания, я в реальных задачах это применять не буду :)
    Но все ровно, спасибо за указание правильного пути ;)
     
  10. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    @kentkent7, в 100% случаев достаточно предопределенного формата адресов для однотипных страниц, например news/(.+), а если хотите к странице произвольный адрес прикреплять сразу пишите его в БД, за одно и контроль на дубли сразу будет.
     
  11. kentkent7

    kentkent7 Новичок

    С нами с:
    30 июн 2017
    Сообщения:
    72
    Симпатии:
    5
    Это больше учебные задания, я в реальных задачах это применять не буду :)
    Но все ровно, спасибо за указание пра
    А как насчет нагрузки на базу?)
    --- Добавлено ---
    А дубли я могу контролировать обычным
    in_array
    --- Добавлено ---
    Однако, регулярки - наше все ;)
     
  12. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    657
    Файл шерстить при каждом запросе – тоже еще то удовольствие. В БД по крайней мере проиндексировать поле можно.
    --- Добавлено ---
    В более простом случае можно и без них обойтись. Первый слаг можете связать с записью в какой-либо корневой таблице, второй (или целиком концовку пути) – с записью в таблице объектов конкретного типа.
    --- Добавлено ---
    Хотя для валидации формата адреса тоже можно регулярку использовать, но одну единственную.
    --- Добавлено ---
    Это модель данных используется во многих наших движках.
    --- Добавлено ---
    Роуты вообще не нужны.