根据 Slim 3 中的 URI 路径更改路由文件
Change route files based upon URI path in Slim 3
好的,我有 4 个文件夹,每个文件夹都有自己的 route.php。所以我想根据 uri 路径要求每个文件夹的路径。因此,例如,如果我的网站路径是 www.example.com/user,那么 Slim 框架将需要 controller/users/routes 的路径。我正在尝试使用中间件来实现这一点,但是当我测试它时,我得到了一个 "Call to a member function error" 那么我该如何解决这个问题。
下面是我的代码:
//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;
});
因此,在框架确定路由之前,先添加所需的路径。但是有些东西运行不正常,有什么想法吗?
你不应该这样做,因为注册所有路由不会花费太多时间。
但是如果你想这样做,你需要对你的代码进行一些更改:
$request->getAttribute('route')
不是 return 路径,它 return 是 slim
的路由对象
如果您想使用路径,请改用 $request->getUri()->getPath()
(它不以 /
开头,因此路径 f.ex 是(/customRoute/test
它 returns customRoute/test
您需要使用 $app
因为 $this
在这种情况下是 Pimple 的 ContainerInterface
而不是 slim
确保您没有将设置中的 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();
好的,我有 4 个文件夹,每个文件夹都有自己的 route.php。所以我想根据 uri 路径要求每个文件夹的路径。因此,例如,如果我的网站路径是 www.example.com/user,那么 Slim 框架将需要 controller/users/routes 的路径。我正在尝试使用中间件来实现这一点,但是当我测试它时,我得到了一个 "Call to a member function error" 那么我该如何解决这个问题。
下面是我的代码:
//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;
});
因此,在框架确定路由之前,先添加所需的路径。但是有些东西运行不正常,有什么想法吗?
你不应该这样做,因为注册所有路由不会花费太多时间。
但是如果你想这样做,你需要对你的代码进行一些更改:
的路由对象$request->getAttribute('route')
不是 return 路径,它 return 是 slim如果您想使用路径,请改用
$request->getUri()->getPath()
(它不以/
开头,因此路径 f.ex 是(/customRoute/test
它 returnscustomRoute/test
您需要使用
$app
因为$this
在这种情况下是 Pimple 的ContainerInterface
而不是 slim确保您没有将设置中的
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();