当前位置: 首页 > 知识库问答 >
问题:

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

子车超英
2023-03-14

我想在Laravel中制作一个API第一应用程序。我不知道什么是最好的方法来做到这一点,我会解释我正在努力做什么,但请随意给出答案如何以不同的方式做到这一点。

我不希望我所有的前端都是用javascript编写的,并用angular.js或类似的东西解析API的JSON输出。我希望我的Laravel应用程序产生超文本标记语言视图。我试图走下去的道路上有两个控制器一个对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。现在我想把我所有的逻辑放在APIUserController中,并从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内容,但我无法获取标头和状态代码(它们是Illumate\Http\JsonResents的受保护属性)。

我认为我的方法可能不是最好的,所以我愿意接受如何制作这个应用程序的建议。

编辑:Drew Lewis已经回答了如何获得响应的标题和状态的问题,但我仍然认为可能有更好的方法来设计这个

共有3个答案

李云
2023-03-14

检查Laravel的RESTful控制器:

http://laravel.com/docs/controllers#restful-控制器

他们的医生做得很好。

但更好的是这个教程:

http://code.tutsplus.com/tutorials/laravel-4-a-start-at-a-restful-api-updated--net-29785

邓昀
2023-03-14

您应该为此设计使用存储库。

例子-

//UserRepository Class
class UserRepository {
    public function getById($id)
    {
      return User::find($id);
    }
}

// WebUser Controller
class WebUserController extends BaseController {
    protected $user;

    public function __construct(UserRepository $user)
    {
        $this->user = $user;
    }

    public function show($id)
    {
        return View::make('user.view')->with('data', $this->user->getById($id));
    }
}

// APIUser Controller
class UserController extends BaseController {
    protected $user;

    public function __construct(UserRepository $user)
    {
        $this->user = $user;
    }

    public function show($id)
    {
        $data =>$this->user->getById($id);
        return Response::json(array('success'=>true,'user'= $data->toArray()));
    }
}
丁星火
2023-03-14

您应该使用存储库/网关设计模式:请在此处查看答案。

例如,在处理用户模型时,首先创建一个用户存储库。用户存储库的唯一职责是与数据库通信(执行CRUD操作)。此用户存储库扩展了公共基础存储库,并实现了一个包含所有所需方法的界面:

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)

}

然后,创建一个服务提供者,它将您的用户存储库接口绑定到您雄辩的用户存储库。只要您需要用户存储库(通过IoC容器解析它或在构造函数中注入依赖项),Laravel就会自动为您提供刚刚创建的雄辩用户存储库的实例。这样,如果您将ORM更改为Elount以外的内容,您只需更改此服务提供商,无需对代码库进行其他更改:

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);
        }

}

最后,创建您的用户web控制器。此控制器与您的用户网关对话:

class UserController extends BaseController 
{
    public function __construct(UserGatway $userGateway)
    {
        $this->userGateway = $userGateway;
    }

    public function create()
    {
        $user = $this->userGateway->createUser(Input::all());

    }
}

通过以这种方式构建应用程序的设计,您可以获得几个好处:您可以实现非常清晰的关注点分离,因为您的应用程序将遵循单一责任原则(通过将业务逻辑与数据库逻辑分离)。这使您能够以更简单的方式执行单元和集成测试,使控制器尽可能纤薄,并允许您在将来根据需要轻松地将Elount替换为任何其他数据库。

例如,如果从Eloquent更改为Mongo,则只需要更改服务提供者绑定以及创建实现UserRepository接口的MongouseRepository。这是因为存储库是唯一与数据库通信的东西——它不知道其他任何东西。因此,新的MongouseRepository可能看起来像:

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接口绑定到新的MongoUserRepository:

 $this->app->bind(
        'lib\Repositories\UserRepository',       
        'lib\Repositories\MongoUserRepository'
);

在您的所有网关中,您一直在引用UserRepository,因此通过进行此更改,您实际上是在告诉Laravel使用新的MongoUserRepository,而不是旧的雄辩库。不需要其他更改。

 类似资料:
  • 主要内容:创建 Node.js 应用,Gif 实例演示如果我们使用 PHP 来编写后端的代码时,需要 Apache 或者 Nginx 的 HTTP 服务器,并配上 mod_php5 模块和 php-cgi。 从这个角度看,整个"接收 HTTP 请求并提供 Web 页面"的需求就不需要 PHP 来处理。 不过对 Node.js 来说,概念完全不一样了。使用 Node.js 时,我们不仅仅 在实现一个应用,同时还实现了整个 HTTP 服务器。事实上,我们

  • 如果我们使用PHP来编写后端的代码时,需要Apache 或者 Nginx 的HTTP 服务器,并配上 mod_php5 模块和php-cgi。 从这个角度看,整个"接收 HTTP 请求并提供 Web 页面"的需求根本不需 要 PHP 来处理。 不过对 Node.js 来说,概念完全不一样了。使用 Node.js 时,我们不仅仅 在实现一个应用,同时还实现了整个 HTTP 服务器。事实上,我们的 W

  • 创建我的第一个应用 视频地址:http://pan.baidu.com/s/1i3FBKUx 本文通过一个简单的hello案例介绍使用WeX5开发一个手机应用的过程 第一步,环境准备 第二步,应用开发 第三步,调试运行,本地打包 介绍谷歌浏览器调试、真机调试,其中真机调试可使用模拟器和手机两种方法。 第四步,打包发布,部署运行 详见《WeX5平台生成App包过程详解》   第一步,环境准备 1.

  • 问题内容: 我有一个用create-react-app创建的React应用,没有弹出。我正在尝试使用网络工作者。我已经尝试过worker- loader软件包(https://github.com/webpack-contrib/worker- loader )。 如果我尝试开箱即用(- )的worker-loader ,我将收到一条错误消息,告诉我Create React App不支持Webpa

  • 我正在Clojure中使用luminus和Ring构建一个web应用程序。我使用lein uberjar构建我的应用程序,然后用undertow服务器构建它。 我的问题是,什么时候对应用程序的请求在单独的非阻塞线程中运行? 我通过对执行的页面执行请求来测试应用程序的并发性。如果我同时在Chrome中的两个选项卡中访问此页面,第二个选项卡将在第一个选项卡加载后大约20秒内才加载。因此,这两次访问似乎

  • 我新安装了MongoDB 3.2,并尝试创建第一个抛出以下错误的用户。 “错误:无法添加用户:未经管理员授权执行命令” 我遵循mongoDB 3.2文档,https://docs.mongodb.org/manual/tutorial/enable-authentication/ 为了添加管理员,我尝试了以下代码,导致了上述错误 创建用户管理员。添加具有userAdminAnyDatabase角色