【问题标题】:API Internal requests on own website?自己网站上的 API 内部请求?
【发布时间】:2015-03-31 14:49:23
【问题描述】:

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

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

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

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

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

在控制器中

class UsersController
{

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

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

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

【问题讨论】:

    标签: php api laravel laravel-4


    【解决方案1】:

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

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

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

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

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

    当然,它仍然不是很多代码,您也可以轻松地在另一个控制器中执行相同的操作。但是想象一下,您想为急切加载添加一个新关系。您需要在两个地方更改您的代码。 (如果你忘记了一个,你可能甚至都不会注意到它......)

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

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

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

    然后使用依赖注入使类的实例在您的控制器中可用:(同样这还不完整,您需要更多的东西来设置 DI)

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

    在您的其他控制器中,您可以使用完全相同的调用 getAll()

    【讨论】:

    • 感谢您的回答。您能否提供代码示例,“保持 API 控制器非常平坦,并将大部分逻辑放在其他地方(在模型、存储库或服务层中)是什么意思。我建议无论如何都这样做。”
    • 当然。你为什么不使用你的 API 控制器的方法之一(一个多于 2 行的方法)更新你的问题,这样我就可以给你一个从你自己的代码派生的例子 :)
    • 我已经更新了我的问题,希望这是一个清晰的例子 :)
    • 谢谢。尽管使用它作为示例非常困难,因为它非常简单:return User::all()。没有太多东西可以搬到别处。你有更复杂的 API 端点吗?
    • 没有一个存储库是由(API)控制器使用的东西。它有点像调用模型的方法集合。我回答中的最后一个代码示例展示了如何使用控制器中的存储库。
    猜你喜欢
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    相关资源
    最近更新 更多