首页 > 解决方案 > 如何使用超薄路由器动态调用方法?

问题描述

我正在设置苗条路由器 v4,我希望能够使用路由中的占位符动态调用控制器方法。

即,当向“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');
});

这里提供了进一步的解释,但我不知道该怎么做。

标签: phpurl-routingslim

解决方案


我建议这样做的方法是使用一个占位符来捕获所有路线。然后,您可以将操作设置为可调用控制器,并根据路由参数执行方法。

路线:

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

推荐阅读