Изменение файлов маршрутов на основе пути URI в Slim 3

Итак, у меня есть 4 папки, каждая из которых имеет свой собственный файл route.php. Поэтому я хотел бы указать путь к каждой папке на основе пути URI. Так, например, если мой путь к веб-сайту www.example.com/user, то для инфраструктуры Slim потребуется путь к контроллеру / пользователям / маршрутам. Я пытаюсь добиться этого с помощью промежуточного программного обеспечения, но когда я тестирую его, я получаю "Вызов функции-члена", как мне это исправить.

Вот мой код ниже:

 //determine the uri path then add route path based upon uri
$app->add(function (Request $request, Response $response, $next) {
    if (strpos($request->getAttribute('route'), "/user") === 0) {
        require_once('controllers/users/routes.php');
    } elseif (strpos($request->getUri()->getPath(), "/public") === 0) {
        require_once('controllers/public/routes.php');
    } elseif (strpos($request->getUri()->getPath(), "/brand") === 0) {
        require_once('controllers/brands/routes.php');
    }elseif (strpos($request->getUri()->getPath(), "/admin") === 0) {
        require_once('controllers/admin/routes.php');
    }elseif (strpos($request->getUri()->getPath(), "/") === 0) {
        require_once('routes.php');
    }

    $response = $next($request, $response);
    return $response;
});

Поэтому прежде чем фреймворк определит маршрут, затем добавит требуемый путь. Но что-то не работает правильно, есть идеи?

1 ответ

Решение

Ну, вы не должны этого делать, потому что регистрация всех маршрутов не займет много времени.

Но если вы хотите сделать это, вы должны внести некоторые изменения в свой код:

  1. $request->getAttribute('route') не возвращает путь, он возвращает объект маршрута Slim

    Если вы хотите использовать путь, используйте $request->getUri()->getPath() вместо этого (это не начинается с / так что маршрут f.ex есть (/customRoute/test это возвращается customRoute/test

  2. Вам нужно использовать $app как $this в этом контексте является ContainerInterface от прыщей, а не приложение тонкого

  3. Убедитесь, что вы не установили determineRouteBeforeAppMiddleware в настройках true поскольку он проверяет, какой маршрут выполнить до выполнения промежуточного программного обеспечения.

Вот бегущий пример:

$app = new \Slim\App();
$app->add(function($req, $res, $next) use ($app) {
    if(strpos($req->getUri()->getPath(), "customPath" ) === 0) {
        $app->get('/customPath/test', function ($req, $res, $arg) {
            return $res->write("WUII");
        });
    }
    return $next($req, $res);
});
$app->run();
Другие вопросы по тегам