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

标签 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。但我不想将所有内容都放在一个文件中,也不想加载我不需要的每个 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/

相关文章:

java - Spring REST Hibernate 应用设计

php - 按钮重定向 HTML 中的错误表单

php - 在 C 中制作准系统,启用 PHP 的 Web 服务器?

winapi - 什么 Win32 API 可用于查找打开给定文件的进程?

json - Wiremock:如何匹配不具有特定属性的 JSON 请求?

android - 使用 android-async-http (loopj) 发布 JSON/XML

php - 我想通过php上传图片到数据库,图片没有上传到数据库

php/symfony2 从 URL 中隐藏 app.php

javascript - 应用程序每个页面上的 Angularjs Popover

api - postman 多次运行相同的请求