I'l*_*ack 2 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();
});
});
Run Code Online (Sandbox Code Playgroud)
在控制器中
class UsersController
{
public function showUsers()
{
$users = API::get('users');
return View::make('users-list')->with('users', $users);
}
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,他们为get方法设置了一个API路由设置users
, API::get('users');
并将对该端点发出内部请求,并返回该方法返回的内容
是的,我会考虑这种常见做法.我个人甚至认为在内部使用自己的API是一种好习惯.它绝对有助于保持你的代码DRY(D ont R epeat Y selfelf ).
当然,与直接方法调用相比,它会产生一些开销,但我怀疑它会引人注意.无论如何,为了您的考虑,另一种方法是保持API控制器非常扁平,并将大部分逻辑放在其他地方(在模型,存储库或服务层中).无论如何我建议这样做.这意味着您可以轻松地在"正常"控制器中执行与在API控制器中相同的操作,因为它基本上只是对另一个类的(少数)调用.
假设你的users
端点有点复杂(这包括一些急切的加载和过滤)
public function index(){
return User::has('profile')
->with('profile', 'city')
->active()
->get();
}
Run Code Online (Sandbox Code Playgroud)
当然,它仍然不是很多代码,你也可以轻松地在其他控制器中做同样的事情.但想象一下,您想要为急切负载添加新关系.您需要在两个位置更改代码.(如果你忘了一个,你甚至可能都不会注意到它......)
该问题的一个解决方案是创建存储库.我不会详细介绍如何实现这种模式(在互联网上有很多关于这方面的资源),但基本上你最终会有这样一个类:
class UserRepository {
public function getAll(){
return User::has('profile')
->with('profile', 'city')
->active()
->get();
}
}
Run Code Online (Sandbox Code Playgroud)
(理想情况下,您还可以使用定义存储库的界面...)
然后使用依赖注入来使控制器中的类的实例可用:(再次,这不完整,您需要更多的东西来设置DI)
public function __construct(UserRepository $repo){
$this->user = $repo;
}
public function index(){
return $this->user->getAll();
}
Run Code Online (Sandbox Code Playgroud)
在您的其他控制器中,您可以使用完全相同的呼叫getAll()
.
归档时间: |
|
查看次数: |
932 次 |
最近记录: |