- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想在 Laravel 中创建一个 API 优先的应用程序。我不知道执行此操作的最佳方法是什么,我将解释我正在尝试做什么,但请随时回答如何以不同的方式执行此操作。
我不希望我的所有前端都用 javascript 编写并使用 angular.js 或类似的东西解析 API 的 JSON 输出。我希望我的 Laravel 应用程序生成 HTML View 。我正试图走上拥有两个 Controller 的道路,一个用于 API,一个用于网络。对于显示用户操作,我的 routes.php 如下所示:
# the web controller
Route::controller('user', 'WebUserController');
# the api controller
Route::group(array('prefix' => 'api'), function() {
Route::resource('user', 'UserController');
});
所以 /user
将带我到 WebUserController
而 /api/user
将带我到 UserController
.现在我想将所有逻辑放在 API UserController
中,并从 WebUserController
调用它的操作。这是它们的代码:
class UserController extends BaseController
{
public function show($id)
{
$user = User::find($id);
return Response::json(array('success'=>true,'user'=>$user->toArray()));
}
}
class WebUserController extends UserController
{
public function getView($id)
{
# call the show method of the API's User Controller
$response = $this->show($id);
return View::make('user.view')->with('data', $response->getData());
}
}
在 WebUserController
中,我能够使用 getData()
获取响应的 json 内容,但我无法获取 header 和状态代码(它们是 Illuminate\Http\JsonResponse
的 protected 属性。
我认为我的方法可能不是最好的,所以我愿意接受有关如何制作此应用的建议。
编辑:Drew Lewis 已经回答了如何获取标题和响应状态的问题。 , 但我仍然认为可能有更好的方法来设计这个
最佳答案
您应该使用存储库/网关设计模式:请参阅答案 here .
例如,在处理 User 模型时,首先创建一个 User Repository。用户存储库的唯一职责是与数据库通信(执行 CRUD 操作)。此用户存储库扩展了一个公共(public)基础存储库并实现了一个包含您需要的所有方法的接口(interface):
class EloquentUserRepository extends BaseRepository implements UserRepository
{
public function __construct(User $user) {
$this->user = $user;
}
public function all() {
return $this->user->all();
}
public function get($id){}
public function create(array $data){}
public function update(array $data){}
public function delete($id){}
// Any other methods you need go here (getRecent, deleteWhere, etc)
}
然后,创建一个服务提供者,它将您的用户存储库接口(interface)绑定(bind)到您的 eloquent 用户存储库。每当您需要用户存储库时(通过 IoC 容器解析它或在构造函数中注入(inject)依赖项),Laravel 会自动为您提供您刚刚创建的 Eloquent 用户存储库的实例。这样一来,如果您将 ORM 更改为 eloquent 以外的其他内容,您可以简单地更改此服务提供者,而无需对您的代码库进行其他更改:
use Illuminate\Support\ServiceProvider;
class RepositoryServiceProvider extends ServiceProvider {
public function register() {
$this->app->bind(
'lib\Repositories\UserRepository', // Assuming you used these
'lib\Repositories\EloquentUserRepository' // namespaces
);
}
}
接下来,创建一个用户网关,其目的是与任意数量的存储库通信并执行应用程序的任何业务逻辑:
use lib\Repositories\UserRepository;
class UserGateway {
protected $userRepository;
public function __construct(UserRepository $userRepository) {
$this->userRepository = $userRepository;
}
public function createUser(array $input)
{
// perform any sort of validation first
return $this->userRepository->create($input);
}
}
最后,创建您的用户网络 Controller 。此 Controller 与您的用户网关对话:
class UserController extends BaseController
{
public function __construct(UserGatway $userGateway)
{
$this->userGateway = $userGateway;
}
public function create()
{
$user = $this->userGateway->createUser(Input::all());
}
}
通过以这种方式构建应用程序的设计,您可以获得几个好处:您实现了非常清晰的关注点分离,因为您的应用程序将遵守 Single Responsibility Principle (通过将您的业务逻辑与您的数据库逻辑分开)。这使您能够以更简单的方式执行单元和集成测试,使您的 Controller 尽可能纤薄,并且如果您将来需要,您可以轻松地将 Eloquent 替换为任何其他数据库。
例如,如果从 Eloquent 更改为 Mongo,您唯一需要更改的是服务提供者绑定(bind)以及创建实现 UserRepository 接口(interface)的 MongoUserRepository。这是因为存储库是唯一与您的数据库对话的东西——它不知道其他任何东西。因此,新的 MongoUserRepository 可能类似于:
class MongoUserRepository extends BaseRepository implements UserRepository
{
public function __construct(MongoUser $user) {
$this->user = $user;
}
public function all() {
// Retrieve all users from the mongo db
}
...
}
现在服务提供者会将 UserRepository 接口(interface)绑定(bind)到新的 MongoUserRepository:
$this->app->bind(
'lib\Repositories\UserRepository',
'lib\Repositories\MongoUserRepository'
);
在所有网关中,您一直在引用 UserRepository,因此通过进行此更改,您实际上是在告诉 Laravel 使用新的 MongoUserRepository 而不是旧的 Eloquent。无需进行其他更改。
关于php - 如何在 Laravel 中创建 REST API 第一个 Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23115291/
我有一个几乎可以构建的Maven / Grails应用,但在web.xml上找不到[my-app]\webapp\WEB-INF\web.xml。但是目录结构像往常一样包含web-app文件夹,而不是
正如我在标题中提到的:我想知道 web-service 和 web-socket 之间的区别?我们什么时候使用每一个? 谢谢! 最佳答案 一个web service是一个响应客户端 SOAP/REST
让我们看一个示例场景: 客户端打开一个网站并找到他从文本框中输入的两个数字的总和。然后单击“添加”按钮。两个参数通过 HTTP GET 发送到服务器,在服务器上写入 PHP 代码以添加数字,结果为回声
我知道这是一个老问题,肯定已经被回答了数百次,但我还无法找到令人满意的答案。 我正在创建一个应用程序,其他应用程序(移动/网络)将使用该应用程序来获取数据。现在我有两个选择: 将我的应用程序创建为简单
通过 Web 作业部署新功能有 3 种方法: 创建一个新的 Web 应用,并部署一个包含该函数的 Web 作业。 向现有 Web 作业添加一项新函数(这样您现在在一个 Web 作业中就拥有了多个函数)
我收到来自网络场景的通知,上面写着“问题”和“确定”。我想在问题发生时包含网络响应的内容。我不担心标题值,只担心网页的内容. 这是我可以在通知设置中引用的变量吗? 最佳答案 不幸的是 zabbix 不
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
嗨,这是一个理论问题,但我真的无法弄清楚 Web 应用程序、基于 Web 的应用程序和基于云的应用程序之间的区别。这个你能帮我吗。 最佳答案 @Matt 是对的 - 这真的无关紧要,但是,为了清楚起见
我正在尝试使用多个 Web 服务,这些服务在它们的 wsdl 中重新定义了一些相同的公共(public)类。我目前在网站中引用了它们,但我想转换为 Web 应用程序。 由于一些相同的类是从多个 Web
一个。我必须考虑哪些事项?b.当前应用程序正在执行多个存储过程。如果我创建等效的方法来执行这些过程,会有什么风险或挑战。 最佳答案 在架构上,将网络应用程序转换为网络服务时必须考虑的一件事是,对方法和
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 5年前关闭。 Improve thi
网络 API 和网络服务之间有什么区别吗?或者它们是同一个吗? 最佳答案 网络服务通常提供 WSDL您可以从中自动创建客户端 stub 。 Web 服务基于 SOAP protocol 。ASP.NE
我已经获得了我需要的所有资源。我将 Web 服务放入应用程序服务环境中,然后将 NSG 连接到应用程序服务环境使用的子网。然后,我允许 VNET 内的应用程序与 Web 服务进行通信,但它无法正常工作
我已经获得了我需要的所有资源。我将 Web 服务放入应用程序服务环境中,然后将 NSG 连接到应用程序服务环境使用的子网。然后,我允许 VNET 内的应用程序与 Web 服务进行通信,但它无法正常工作
我正在使用 stub 将我的网络服务相关测试与实际网络服务隔离开来。 你/我应该如何合并测试以确保我制作的响应与实际的网络服务匹配(我无法控制它)? 我不想知道怎么做,而是何时何地? 我应该为测试数据
我在互联网上搜索了很多,但我仍然没有得到网络服务和网络 API 之间的明显区别?我在某处读到所有 Web 服务都是 API,但所有 API 都不是 Web 服务。如何? 我所知道的是两者都允许利用其他
假设我已经完成了使用 JavaEE 制作的 Web 应用程序。这个 Web 应用程序包含登录系统,但最后它是非常基本的 Web 应用程序。我使用的是 GlassFish 3.1.2.2。 我想知道一旦
我希望设计者能够打开与我相同的解决方案文件。这可以通过 Expressions Web 实现吗? 最佳答案 简短的回答是“不”;但这是一个非常常见的请求,我知道很多人都希望下一个版本(无论何时)对此有
我正在尝试在 CF10 中创建一个 Web 服务对象。我已验证它在 SoapUI 中按预期工作。但是,当我在 CF 中运行它时,我得到一个错误,它无法找到在 WSDL 的导入语句中导入的 XSD。这是
我的要求是开发一个 Web 服务,充当外部 Web 服务和客户端之间的中间人。 我知道,我可以为我的服务设计一个wsdl,然后将外部wsdl映射到代码中我的wsdl。我的问题是有一个开源 api/工具
我是一名优秀的程序员,十分优秀!