我正在尝试使用 Slim,但我不确定我是否可以使用这样的结构进行扩展:
$app->group('/robots', function () use ($app) {
include_once('controller/RobotController.php');
$controller = new RobotController();
$app->get('/:id', array($controller, 'getRobot'))
->conditions(array('id' => '[0-9]'));
});
我只想拥有一个类似 Controller (瘦)模型(胖)的结构并响应 json。但我不想将所有内容都放在一个文件中,也不想加载我不需要的每个 Controller 。
你有什么方法?
不幸的是,这个 URL 没有帮助: http://www.slimframework.com/2011/09/24/how-to-organize-a-large-slim-framework-application.html
最佳答案
请记住,使用 $app->group 不会隔离其中包含的任何语句。在您的情况下,无论路由是否匹配, Controller 都将被实例化。
考虑这个例子:
$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"
}
},
这将延迟 Controller 的实例化,直到您有匹配的路由。
您还可以使用其他技巧,例如将不同的路由组保存在不同的文件中,然后只包含与请求的 url 的第一部分匹配的那个(在您的情况下,路由将是 robots.php
)
关于php - 您如何使用 SLIM Microframework 组织大型 Rest API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31116566/