如何使用超薄路由器动态调用方法?
How to dynamically call methods with slim router?
我正在设置 slim router v4,我希望能够使用路由中的 placeholder 动态调用控制器方法。
即当向 'example.com/users/{action}' 发出请求时,路由器会自动从 Users.php 控制器调用方法,而无需我手动指定路由。
基本上,当它们都在 /user 路由下时,我试图避免手动添加超过 100 个 group->get(...)。
namespace core\router;
use Slim\Interfaces\RouteCollectorProxyInterface;
use app\controllers\users;
$app->group('/user', function(RouteCollectorProxyInterface $group){
$group->get('/get-name', '\Users:name')
$group->get('/get-personality', '\Users:personality');
});
提供了进一步的解释 here 但我不确定如何去做。
我建议这样做的方法是使用一个占位符捕获所有路由。然后,您可以将操作设置为可调用控制器,并根据路由参数执行方法。
路线:
$app->get('/user/{method}', Users::class);
控制器
class Users
{
public function __invoke(Request $request, Response $response, $args)
{
if (empty($args['method'])) {
throw new InvalidArgumentException();
}
$methodName = toCamelCase($args['method']);
if (!method_exists($this, $methodName)) {
throw new InvalidArgumentException();
}
return $this->{$methodName};
}
public function getName(Request $request, Response $response)
{
// ...
}
public function getPersonality(Request $request, Response $response)
{
// ...
}
}
我正在设置 slim router v4,我希望能够使用路由中的 placeholder 动态调用控制器方法。
即当向 'example.com/users/{action}' 发出请求时,路由器会自动从 Users.php 控制器调用方法,而无需我手动指定路由。
基本上,当它们都在 /user 路由下时,我试图避免手动添加超过 100 个 group->get(...)。
namespace core\router;
use Slim\Interfaces\RouteCollectorProxyInterface;
use app\controllers\users;
$app->group('/user', function(RouteCollectorProxyInterface $group){
$group->get('/get-name', '\Users:name')
$group->get('/get-personality', '\Users:personality');
});
提供了进一步的解释 here 但我不确定如何去做。
我建议这样做的方法是使用一个占位符捕获所有路由。然后,您可以将操作设置为可调用控制器,并根据路由参数执行方法。
路线:
$app->get('/user/{method}', Users::class);
控制器
class Users
{
public function __invoke(Request $request, Response $response, $args)
{
if (empty($args['method'])) {
throw new InvalidArgumentException();
}
$methodName = toCamelCase($args['method']);
if (!method_exists($this, $methodName)) {
throw new InvalidArgumentException();
}
return $this->{$methodName};
}
public function getName(Request $request, Response $response)
{
// ...
}
public function getPersonality(Request $request, Response $response)
{
// ...
}
}