php - 如何在 Laravel 中创建 REST API 第一个 Web 应用程序

标签 php api rest laravel controller

我想在 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/

相关文章:

rest - 通过 REST 查询 Cloud Firestore 子集合

java - 将对象转换为 HTTP 请求参数(键/值对)

php - 如何在 Symfony 2 表单中验证日期时间格式 "yyyy-MM-ddTHH:mm:ss.sssZ"

javascript - 在执行了一些 javascript 指令后,如何加载 html 文档?

java - 开发基于 REST 的客户端程序的必要组件和策略是什么?

php - 如何将JSON对象缓存到单个文件中以加快页面加载时间

javascript - 从 addCard trello API 创建 trello 卡后如何捕获它的链接?

php - MySQL - 合并表并按最大日期排序

php - 除了通过引用传递来做我想做的事之外,还有另一种方法吗

php - DOMPDF - 背景 url(linux 与 windows)