如何使用SLIM Microframework组织大型Rest API?

时间:2015-06-29 13:07:29

标签: php api rest slim

我试图使用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。但是我不希望将所有内容都放在一个文件中,而且我不想加载我不需要的每个控制器。

您有什么方法?

遗憾的是,此网址没有帮助: http://www.slimframework.com/2011/09/24/how-to-organize-a-large-slim-framework-application.html

1 个答案:

答案 0 :(得分:1)

请注意,使用$ app->组不会隔离其中包含的任何语句。在您的情况下,无论路由是否匹配,控制器都将被实例化。

考虑这个例子:

postRegister

请求$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

在您的情况下,最好组织您的文件夹结构以利用PSR自动加载。如果你已经在使用作曲家,这应该是微不足道的。然后你的小组看起来像

group1
group2
group3
group1 route1

如果您的自动加载器知道名称空间“controller”映射到“controller”文件夹,那么您不需要手动包含所述类。

请注意我使用冒号$app->group('/robots', function () use ($app) { $app->get('/:id', 'controller\RobotController:getRobot') ->conditions(array('id' => '[0-9]')); }); 而不是paamayim :,因为我希望Slim实例化RobotController并在该实例上调用非静态方法。

澄清:让自动加载器“知道”意味着添加正确的映射,在::中指定autoloader条目。这允许将命名空间映射到我们方便的任意文件夹

composer.json

这将延迟控制器的实例化,直到您找到匹配的路径。

您可以使用其他技巧,例如将不同的路由组保存在不同的文件中,然后只包括与请求的网址的第一部分匹配的路由组(在您的情况下,路由将是"autoload": { "psr-4": { "controller\\": "src/controllers_folder", "model\\": "src/doctrine_models" } },