请记住,使用 $app->group 并不会隔离其中包含的任何语句。在您的情况下,无论路由是否匹配,控制器都将被实例化。
考虑以下示例:
$app->group('/group1', function () use ($app) {
$app->get('/route1', function () use ($app) {
echo '<br> group1 route1';
});
echo '<br>group1';
});
$app->group('/group2', function () use ($app) {
echo '<br> group2';
});
$app->group('/group3', function () use ($app) {
echo '<br> group3';
});
请求 /group1/route1
将输出
group1
group2
group3
group1 route1
在您的情况下,更好的做法是组织文件夹结构以利用PSR自动加载。如果您已经使用composer,这应该很容易实现。然后您的组将如下所示:
$app->group('/robots', function () use ($app) {
$app->get('/:id', 'controller\RobotController:getRobot')
->conditions(array('id' => '[0-9]'));
});
如果您的自动加载程序知道命名空间“controller”映射到“controller”文件夹,那么您就不需要手动包含该类。
请注意,我使用冒号
:
而不是paamayim
::
,因为我希望Slim实例化RobotController并调用该实例上的非静态方法。
澄清:让自动加载程序“知道”意味着在您的
composer.json
中添加适当的映射,指定一个
autoloader
条目。这允许将命名空间映射到我们方便的任意文件夹。
"autoload": {
"psr-4": {
"controller\\": "src/controllers_folder",
"model\\": "src/doctrine_models"
}
},
这将延迟实例化您的控制器,直到您有一个匹配的路由。
还有其他技巧可以使用,例如将不同的路由组保存在不同的文件中,然后仅包含与请求的URL的第一部分相匹配的文件(在您的情况下,路由将是
robots.php
)。