• В чем суть роутера на php?

    onqu
    @onqu
    weasy
    1. Здесь пугают всякими контроллерами, ларавелями. Давайте жить проще. Для начала дадим определение модному слову роутер. Это маршрутизатор. Что делает маршрутизатор? Правильно. Обрабатывает маршруты, являясь связующим звеном. Маршрутом для web сайта принято считать метод запроса [GET, POST, PUT и другие] и компоненты URI.

    например: https://ru.wikipedia.org/wiki/URI?foo=bar#title
    [схема: https] :// [источник: ru.wikipedia.org] [путь: /wiki/URI] [запрос: ?foo=bar] [фрагмент: #title]


    Но для определения маршрута может браться любая другая информация передаваемая серверу, определение выше это лишь наиболее употребляемые параметры.

    Сама работа, как правило проста: от клиента приходит запрос, маршрутизатор перебирает все заданные ему пути до первого совпадения. При совпадении вызывается определенная вами функция, которая возвращает ответ клиенту.

    2. Он необходим, если в приложении одна точка входа, когда любой запрос приходит на один файл.

    3. Простой пример
    // файл index.php
    
    // Маршруты
    // [маршрут => функция которая будет вызвана]
    $routes = [
        // срабатывает при вызове корня или /index.php
        '/' => 'hello',
        // срабатывает при вызове /about или /index.php/about
        '/about' => 'about',
        // динамические страницы
        '/page' => 'page'
    ];
    
    // возвращает путь запроса
    // вырезает index.php из пути
    function getRequestPath() {
        $path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
    
        return '/' . ltrim(str_replace('index.php', '', $path), '/');
    }
    
    // наш роутер, в который передаются маршруты и запрашиваемый путь
    // возвращает функцию если маршшрут совпал с путем
    // иначе возвращает функцию notFound
    function getMethod(array $routes, $path) {
        // перебор всех маршрутов
        foreach ($routes as $route => $method) {
            // если маршрут сопадает с путем, возвращаем функцию
            if ($path === $route) {
                return $method;
            }
        }
    
        return 'notFound';
    }
    
    // функция для корня
    function hello() {
        return 'Hello, world!';
    }
    
    // функция для страницы "/about"
    function about() {
        return 'About us.';
    }
    
    // чуть более сложный пример
    // функция отобразит страницу только если
    // в запросе приходит id и этот id равен
    // 33 или 54
    // [/page?id=33]
    function page() {
    
        $pages = [
            33 => 'Сага о хомячках',
            54 => 'Мыши в тумане'
        ];
    
        if (isset($_GET['id']) && isset($pages[$_GET['id']])) {
            return $pages[$_GET['id']];
        }
    
        return notFound();
    }
    
    // метод, который отдает заголовок и содержание для маршрутов,
    // которые не существуют
    function notFound() {
        header("HTTP/1.0 404 Not Found");
    
        return 'Нет такой страницы';
    }
    
    
    // Роутер
    // получаем путь запроса
    $path = getRequestPath();
    // получаем функцию обработчик
    $method = getMethod($routes, $path);
    // отдаем данные клиенту
    echo $method();


    На практике используют более сложные маршрутизаторы, у которых гораздо большие возможности.

    4. Обойтись без него можно. Если каждая страница в вашем приложении будет являться отдельным файлом, который отвечает за отдачу информации.
    index.php
    about.php
    contact.php
    ...


    Это олдскульная структура, в новых проектах почти не применяется.
    Ответ написан
    13 комментариев
  • Как писать в прототипном стиле?

    @grom111
    JackShcherbakov Если уж вы взялись писать код в стиле ООП, то должны понять 1 простую суть. Класс это просто описание объекта и он содержит в себе методы для управления этим объектом.

    Объясню на вашем примере:
    У вас есть class Table {}, в нем сохраняются методы для работы с таблицей (добавление рядков, удаление и т.д), но не штуки подобно newH1Element или output(их можно вынести в те же самые методы).

    Подводя итог:
    class Table {
        constructor(name, columns, rows, defaultText) {
            this.name = name;
            this.columns = columns;
            this.rows = rows;
            this.defaultText = defaultText;
        }
        save() {
            localStorage.setItem(this.name, document.getElementById("rightControlPanel").innerHTML)
        }
        add() {
            /..создаете тот же tr и т.д../
        }
        delete() {}
    }
    Ответ написан
    Комментировать
  • Хорошие каналы по вёрстке и фронтэнду?

    Ilyasyakubov
    @Ilyasyakubov
    Муж, Логист ВЭД, IT-блогер
    Этот очень нравится: https://www.youtube.com/channel/UC7enHM_oJRYJOnyJr...
    Ответ написан
    Комментировать
  • Ребят robots_ssl.txt или robots.txt?

    kopcap_va
    @kopcap_va
    SEO Consultant
    Есть ситуации, когда защищенный протокол https используется только для отдельных страниц на сайте (обычно это форма контактов, форма заказа и другие страницы, на которых пользователи могут вводить личные данные).

    Для закрытия от индексации таких страниц делают отдельную версию инструкций, которая будет доступна по защищенному протоколу.

    Создают файл robots_ssl.txt (можно использовать любое название файла) и настраивают параметры сервера таким образом, чтобы при запросе httрs://domain.com/robots.txt открывался файл robots_ssl.txt

    Для этого в .htaccess прописывают нужные параметры:
    RewriteEngine on 
    Options +FollowSymlinks 
    RewriteCond %{SERVER_PORT} ^443$ 
    RewriteRule ^robots.txt$ robots_ssl.txt

    443 порт используется для защищенных соединений, вместо стандартного 80.
    Ответ написан
    Комментировать
  • Что прописать в index.html, что бы сразу перебрасывало на другой сайт?

    @entermix
    <meta http-equiv="Refresh" content="0; URL=https://toster.ru/" />

    xiper.net/manuals/html/meta-tags/http-equiv/refresh
    Ответ написан
    Комментировать