【问题标题】:Slim 3 multiple routes to one function?Slim 3 多条路线到一个功能?
【发布时间】:2021-03-09 13:32:34
【问题描述】:

我一直在网上寻找,找不到任何告诉您如何为一个回调分配多条路由的信息。比如我想搬家:

$app->get('/sign-in', function($request, $response) {
    return $this->view->render($response, 'home.twig');
});

$app->get('/login', function($request, $response) {
    return $this->view->render($response, 'home.twig');
});

变成类似:

$app->get(['/sign-in', '/login'], function($request, $response) {
    return $this->view->render($response, 'home.twig');
});

有没有办法用 Slim 3 做到这一点?我在网上发现,在 Slim 2 中,您可以在末尾使用 conditions([]); 函数将多个路由链接到一个回调。

【问题讨论】:

  • 既然您已经在使用类似 MVC 的结构,您是否考虑过使用控制器而不是直接在路由文件中放置闭包?
  • @Bytewave 我对这种类型的结构很陌生,您介意更详细地解释一下您的意思吗?也许提供一个代码示例?谢谢!
  • 控制器在评论中有点难以解释,但我会在答案中试一试。
  • @Bytewave 谢谢,非常感谢!
  • 实际上,在另一个答案上查看您的 cmets 时,我不确定这是否是解决问题的方法。无论如何,我建议使用控制器,以保持您的逻辑独立并帮助您保持井井有条,但这可能不相关。我不确定有没有办法只用一组路由路径来做到这一点——似乎你必须通过重复的->get() 调用来做到这一点。

标签: php rest slim slim-3


【解决方案1】:

您似乎可以简单地定义一个数组并循环遍历它以在一个函数上创建多个路由。

$routes = [
    '/',
    '/home', 
    '/sign-in',
    '/login',
    '/register',
    '/sign-up',
    '/contact'
];

foreach ($routes as $route) {
    $app->get($route, function($request, $response) {
        return $this->view->render($response, 'home.twig');
    });
}

【讨论】:

  • 这肯定行得通,所以+1。虽然我个人觉得它不如使用共享函数/方法的显式路由直观。
  • @Steve 是的。我看到了这两种方法的好处。我更喜欢我找到的那个,因为使用我的应用程序,我可以简单地向数组添加一个新路由,它就完成了,而不必创建另一个 get。
【解决方案2】:

只需将函数创建为闭包并将其作为参数传递:

$home = function($request, $response) {
    return $this->view->render($response, 'home.twig');
};

$app->get('/sign-in', $home);

$app->get('/login',   $home);

或者使用命名函数:

function home($request, $response) {
    return $this->view->render($response, 'home.twig');
};
$app->get('/sign-in', 'home');

$app->get('/login',   'home');

【讨论】:

  • 这很容易工作,但我更喜欢一种可以将一组路由传递给$app->get()的方法。这甚至可能吗?
  • 不是一个经常使用 Slim 的用户,所以我只能指出你的位置:stackoverflow.com/questions/11521264/… 但我个人更喜欢有明确的路由,即使它们共享回调(或者确实是 @Bytewave 建议的控制器方法)
  • 仅供参考@Steve,该问题/答案适用于 Slim 2,不幸的是不再相关。
  • @Bytewave 是的,在没有当前框架知识的情况下回复时,这总是一个问题。希望其他人可以提供替代方案,尽管我坚持我对显式路由的偏好,无论框架或编程语言如何
【解决方案3】:

FastRoute 不会做你想做的事,但是,你可以使用一个通过正则表达式限制到你想要使用的 url 列表的参数:

$app->get("/{_:sign-in|login}", function ($request, $response) {
    $response->write("Hello!");
    return $response;
});

请注意,您必须有一个参数名称,所以我使用了_,因为它没有冒犯性。

【讨论】:

    【解决方案4】:

    我正在使用正则表达式来做这个技巧:

    $app->get('/{router:login|sign-in}', function ($request, $response, $args) {
      echo "Hello, " . $args['router'];
    });
    

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 2020-12-30
      • 2017-01-20
      • 1970-01-01
      • 2016-04-07
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多