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

时间:2015-02-01 15:43:08

标签: php api laravel laravel-4

我想为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);
    }
}

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

1 个答案:

答案 0 :(得分:5)

是的,我会考虑这种常见做法。我个人甚至认为在内部使用自己的API是一种好习惯。它肯定有助于保持代码干燥( D ont R epeat 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()