我想为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);
}
}
在此示例中,他们有一个 API 路由设置,用于 get 方法users
API::get('users');
将向该端点发出内部请求,并返回该方法返回的内容
是的,我会考虑这种常见的做法。我个人甚至认为在内部使用自己的 API 是一种很好的做法。它绝对有助于保持你的代码干燥(Dont Repeat 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()
。