php - 自己网站上的 API 内部请求?

标签 php api laravel laravel-4

我想为 Android 和 Apple 开发一个网站和应用程序。应用程序将通过 API 从我们的域获取数据。

假设在我们的网站上,它将显示产品列表或创建用户帐户;在 Controller 中,我可以使用内部 API 请求,然后通过 MySQL 获取数据,而不是直接使用 MySQL 查询方法。这是常见做法还是不好的做法?

这是 dingo/api 内部请求 (Laravel) 的示例:

Route::api(['version' => 'v1', 'prefix' => 'api'], function () {

    Route::get('users', function () {
        // fetch from database
        return User:all();
        });
});

在 Controller 中

class UsersController
{

    public function showUsers()
    {
        $users = API::get('users');

        return View::make('users-list')->with('users', $users);
    }
}

在此示例中,他们在 users 处为 get 方法设置了 API 路由,并且 API::get('users'); 将为此发出内部请求指向并返回该方法返回的内容

最佳答案

是的,我会考虑这种常见做法。我个人甚至认为在内部使用自己的 API 是一个很好的做法。它绝对有助于保持代码干燥(Dont R重复Y我们自己)。

当然,与直接方法调用相比,它会导致一些开销,但我怀疑它会很明显。无论如何,出于您的考虑,另一种选择是保持 API Controller 非常扁平,并将大部分逻辑放在其他地方(在模型、存储库或服务层中)。无论如何我建议这样做。这意味着您可以轻松地在“普通” Controller 中执行与 API Controller 中相同的操作,因为它基本上只是对另一个类的(几次)调用。

这是一个例子来说明我的意思

假设您的 users 端点有点复杂(这包括一些预先加载和过滤)

public function index(){
    return User::has('profile')
               ->with('profile', 'city')
               ->active()
               ->get();
}

现在当然它仍然不是很多代码,您也可以轻松地在其他 Controller 中执行相同的操作。但想象一下,您想向急切加载添加新的关系。您需要在两个地方更改代码。 (如果您忘记了一个,您可能根本不会注意到它......)

此问题的一个解决方案是创建一个存储库。我不会详细介绍如何实现这种模式(互联网上有很多关于此的资源),但基本上最终您会得到一个像这样的类:

class UserRepository {
    public function getAll(){
        return User::has('profile')
               ->with('profile', 'city')
               ->active()
               ->get();
    }
}

(理想情况下,您还应该有一个定义存储库的接口(interface)...)

然后使用依赖注入(inject)使该类的实例在您的 Controller 中可用:(这仍然不完整,您需要更多的东西来设置 DI)

public function __construct(UserRepository $repo){
    $this->user = $repo;
}

public function index(){
    return $this->user->getAll();
}

并且在您的其他 Controller 中,您可以使用完全相同的调用getAll()

关于php - 自己网站上的 API 内部请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28264501/

相关文章:

python - telegram.org 服务器返回的错误代码 35 是什么

php - 仅从连接表中获取指定列

php - SQL插入行并将插入的自动增量ID复制到另一列

php在同一个命名空间中找不到类

angularjs - 在 angularJS CRUD 应用程序中管理数据的最佳方式

php - Laravel 5 数据库关系类型

node.js - Laravel 5.4 中 Assets 编译失败

javascript - 更新同一页面内的 php 变量而无需重新加载页面

PHP - 获取可用数据库名称的下拉列表。

api - Twilio 的可用电话号码 API