为我的php应用程序(社交应用程序)创建API版本控制

Kár*_*rás 7 php versioning api

我目前正在开发社交应用程序。

我想在我的PHP后端上安装一个版本控制系统,但是我不知道从哪里开始:我在网上查找了很多文章,但是我真的不明白我所发现的内容。

假设我的应用程序是v1.0。然后,我创建了一个新版本v2.0,当然我也更新了PHP文件。此后,如果某人尚未从v1.0更新其应用程序,我希望他们能够访问myapp.com/v1.0/该应用程序,以免该应用程序崩溃。

你会推荐什么?

我的一个典型的PHP文件如下所示:

<?php

// Include files

include_once ('../../config.php');

include_once (ROOT_DIR . '/config/includes.php');

$_USERDATA = Validator::validateUser($_POST["userId"], $_POST["session"]);

// Valid session

$qry = $db->prepare('SELECT n.id, n.type, n.time, n.isRead, n.postId, n.commentId, n.text, n.inReplyToCommentId, u.id as byUserId, 
    ( SELECT COUNT(nu.id)
    FROM notificationUsers AS nu
    WHERE nu.notificationId = n.id ) as detail1,
    ( SELECT nu2.userId
    FROM notificationUsers AS nu2
    WHERE nu2.notificationId = n.id ORDER BY nu2.id DESC LIMIT 1 ) as latestUserId FROM notifications AS n LEFT JOIN userData AS u ON n.byUserId = u.id
    WHERE n.userId = :userId ORDER BY n.time DESC');
$qry->bindParam(':userId', $_USERDATA["userId"], PDO::PARAM_INT);
$qry->execute();

$notificationsArray = $qry->fetchAll(PDO::FETCH_ASSOC);


$returnValue = array();
$returnValue["status"] = "1";
$returnValue["title"] = "Success";
$returnValue["message"] = "Downloaded notifications";
$returnValue["data_notifications"] = $notificationsArray;
exit(json_encode($returnValue));



?>
Run Code Online (Sandbox Code Playgroud)

...

更新1

因此,我决定执行以下操作:

将每个未共享的文件放置在文件夹中,如下所示:

/api/v1.0/file.php
Run Code Online (Sandbox Code Playgroud)

但是每个资源(例如图像)都在API之外

/resources/images/profilepictures/image.jpg
Run Code Online (Sandbox Code Playgroud)

如果进行较小的更改,则只更新文件api/v1.0/夹中的文件。

然后,所有正在使用的用户都在Application v1.1请求myapp.com/api/v1.1/,但是我将他们重定向到api / v1.0 /,在那里我可以向用户提供正确的数据(取决于请求是来自v1.0还是v1.1)

如果这些版本加起来并且发布了更大的更新,我将创建一个名称为的新文件夹v2.0,这样就可以了...

还是你觉得呢?我该怎么办?

dee*_*eej 6

您正在定义您的架构以验证您的设计,这是很好的第一步。

如果你使用像 Laravel 或 Symfony 这样的框架,你可以保持你的 Models 和 Helpers 目录通用,同时使用 v1.x、v2.x 等子目录对 Controllers 目录进行版本控制。

如果您使用路由机制,它可以让您的生活变得轻松,所以让我们说例如您的 v1.0 有 50 个 API 端点,并且您计划修改其中的 5 个以实现 v1.2 不向后兼容,在这种情况下所有其余 45 个 API 端点仍然与 v1.0 相同,您不希望在 v1.2 目录中复制它们。

<?php

$versions = ["v1.0", "v1.2"];

route("/api/v1.0/foobar", "Controllers/v1.0/FoobarController@doSomething");
route("/api/v1.0/footar", "Controllers/v1.0/FoobarController@doTar");

route("/api/v1.2/foobar", "Controllers/v1.2/FoobarController@doSomething");

function route($endpoint, $controller)
{
    // Logic to call function of a respective class/file 
    // and call previous version of an API if function/endpoint is not redefined in current version
}
?>
Run Code Online (Sandbox Code Playgroud)

所以在上面的例子中,当客户端调用/api/v1.2/footar时,它应该为API使用者执行/api/v1.0/footar。

我希望它有帮助。