PHP Маршрутизатор, .htaccess и переписывание строки запроса - PullRequest
0 голосов
/ 09 января 2020

Я пытался найти эту проблему, но не нашел что-то, что решает мою проблему - я почти уверен, что не набираю правильные поиски, так как я думаю, что это было проблемой и для других. Если я бью мертвую лошадь, пожалуйста, укажите мне правильное направление, спасибо.

Существующий код

Я создаю своего рода MVC фреймворк ,

.htaccess направляет все запросы в индекс . php.

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php [QSA,L]
<?php

require_once "./core/init.php";

Router::create( "./core/router/routes.php" )->direct( Request::uri(), Request::method() );

Мой router.class. php файл:

<?php

class Router {

    protected $routes = array(

        "GET" => array(),

        "POST" => array()

    );

    public static function create( $routes ) {

        $router = new static;

        include $routes;

        return $router;

    }

    public function get( $uri, $controller ) {

        $this->routes[ "GET" ][ $uri ] = $controller;

    }

    public function post( $uri, $controller ) {

        $this->routes[ "POST" ][ $uri ] = $controller;

    }

    public function direct( $uri, $method ) {

        if ( array_key_exists( $uri, $this->routes[ $method ] ) ) {

            include $this->routes[ $method ][ $uri ];

        } else {

            include $this->routes[ "GET" ][ "not-found" ];

        }

    }

}

Маршруты определены в маршрутах. php примерно так (только соответствующий маршрут показан):

$router->get( "post", "controllers/get/post.controller.php" );

Мой вопрос

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

/post?p=my-post-name

Как я могу переписать свой маршрутизатор или .htaccess, чтобы тот же пост показывался по следующему URL?

/post/my-post-name

1 Ответ

0 голосов
/ 12 января 2020

Итак, в конце концов я решил эту проблему, создав проверку перед направлением маршрутизатора, не совсем уверенный, что это «правильный» путь.

Это в основном проверяет URI по отношению к массиву, и если URI содержит одно из этих установленных значений, то оно деконструируется, последнее значение сохраняется в переменной с именем get, а затем URI восстанавливается минус поддельная строка запроса:

// index.php

require_once "./core/init.php";

$uri = Request::uri();

/*
 * Fake query strings
 */
$uriParts = explode( "/", $uri );
$queryPages = array( "post", "category", "edit-post" );

foreach ( $queryPages as $queryPage ) {

    if ( in_array( $queryPage, $uriParts ) ) {

        $get = $uriParts[ count( $uriParts ) - 1 ];
        array_pop( $uriParts );
        $uri = "";

        for ( $i = 0; $i < ( count( $uriParts ) ); $i++ ) {

            $uri .= $uriParts[ $i ] . "/";

        }

        $uri = trim( $uri, "/" );
        break;

    }

}

Router::create( "./core/router/routes.php" )->direct( $uri, Request::method() );

Вышеуказанное работает с URI различной глубины:

post/my-post
category/general
admin/posts/edit-post/my-post

«Строка запроса» может использоваться в контроллерах с global $get;, а затем использоваться на месте $_GET. Это не сработает для нескольких запросов, но идеально подходит для моих требований.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...