如何使用SLIM微框架组织大型Rest APIs?

4

我正在尝试使用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]'));
});

我希望有一个控制器(瘦)模型(胖)的结构并响应json。但我不想把所有内容都放在一个文件中,也不想加载我不需要的每个控制器。
你有什么解决方案?
很遗憾,这个网址无法提供帮助: http://www.slimframework.com/2011/09/24/how-to-organize-a-large-slim-framework-application.html

1
你使用的 Slim 版本是什么? - Davide Pastore
1个回答

1
请记住,使用 $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)。

你如何让自动加载程序“知道”? - Joseph Astrahan
嗨@JosephAstrahan,我添加了一个我所指的澄清。一旦你运行composer install(或者composer dump-autoload),那个映射将会被添加到你的自动加载器中。 - ffflabs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接