如何使用超薄路由器动态调用方法?

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)
    {
        // ...
    }
}