帮酷LOGO
  • 显示原文与译文双语对照的内容
Rest API Bolerplate for Lumen micro-framework.

  • 源代码名称:rest-api-with-lumen
  • 源代码网址:http://www.github.com/hasib32/rest-api-with-lumen
  • rest-api-with-lumen源代码文档
  • rest-api-with-lumen源代码下载
  • Git URL:
    git://www.github.com/hasib32/rest-api-with-lumen.git
  • Git Clone代码到本地:
    git clone http://www.github.com/hasib32/rest-api-with-lumen
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/hasib32/rest-api-with-lumen
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • 带流明 5.5 REST API Build Status

    Lumen微框架的RESTful API样板。 包括的功能包括:

    正在启动

    首先,克隆 repo:

    $ git clone git@github.com:hasib32/rest-api-with-lumen.git
    Laravel Homestead

    你可以在全球范围内或者每个项目中使用 Laravel 。 遵循安装指南

    安装依赖项
    $ cd rest-api-with-lumen
    $ composer install
    配置环境

    创建 .env file:

    $ cat. env.example>. env

    如果你希望你可以编辑数据库名称,数据库用户名和数据库密码。

    迁移并使用假数据对数据库进行种子处理

    首先,我们需要连接到数据库。 对于homestead用户,使用默认的homestead用户名和密码登录:

    $ mysql -uhomestead -psecret

    然后创建一个数据库:

    mysql> CREATE DATABASE restapi;

    同时创建测试数据库:

    mysql> CREATE DATABASE restapi_test;

    使用种子运行工匠迁移命令:

    $ php artisan migrate --seed

    创建"个人访问权限"和"口令授予"客户端,这些客户端将用于生成访问令牌:

    $ php artisan passport:install

    你可以在 oauth_clients 表中找到这些。

    API路由

    HTTP方法路径操作范围 Desciption
    获取/用户索引users:list获取所有用户
    POST/用户商店users:create创建用户
    获取/users/{user_id}显示"%s"users:read按id获取用户
    放置/users/{user_id}更新users:write按标识更新用户
    删除/users/{user_id}销毁users:delete按id删除用户

    注意:users/me 是获取当前认证用户的特殊路由。 如果要执行所有操作,则所有用户路由的'用户'作用域都可用。

    OAuth2路由

    访问 dusterio/流明 passport 查看所有可用的OAuth2 路由。

    创建 access_token

    因为 Laravel Passport不限制任何用户创建任何有效作用域。 必须创建路由和控制器才能限制用户仅使用允许的作用域创建访问令牌。 为了创建 access_token,我们必须使用 accessToken 路由。 下面是使用邮差创建grant_type密码的access_token示例。

    http://stackoverflow.com/questions/39436509/laravel-passport-scopes

    access_token creation

    创建新资源

    创造一个新的资源是非常容易和直接的。 按照以下简单步骤创建新资源。

    步骤 1: 创建路由

    创建新的路由名称 messages 。 打开 routes/web.php 文件并添加以下代码:

    $route->post('messages', ['uses'=>'MessageController@store','middleware'=>"scope:messages,messages:create"]);$route->get('messages', ['uses'=>'MessageController@index','middleware'=>"scope:messages,messages:list"]);$route->get('messages/{id}', ['uses'=>'MessageController@show','middleware'=>"scope:messages,messages:read"]);$route->put('messages/{id}', ['uses'=>'MessageController@update','middleware'=>"scope:messages,messages:write"]);$route->delete('messages/{id}', ['uses'=>'MessageController@destroy','middleware'=>"scope:messages,messages:delete"]);

    有关更多信息,请访问 Lumen 路由页面。

    步骤1: 创建模型的模型和迁移

    App/Models 目录中创建 Message 模型并使用Lumen命令创建迁移。

    消息模型

    <?phpnamespaceAppModels;useIlluminateDatabaseEloquentModel;classMessageextendsModel{/** * The database table used by the model. * * @var string*/protected$table='messages';/** * The attributes that are mass assignable. * * @var array*/protected$fillable= ['uid','userId','subject','message', ];}

    访问 Laravel Eloquent页面了解有关模型的更多信息。

    为消息表创建迁移

    php artisan make:migration create_messages_table --create=messages

    迁移文件

    classCreateMessagesTableextendsMigration{publicfunctionup() {Schema::create('messages', function (Blueprint$table) {$table->increments('id');$table->string('uid', 36)->unique();$table->integer('userId')->unsigned();$table->string('subject')->nullable();$table->longText('message');$table->timestamps();$table->foreign('userId')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade'); }); }}

    有关更多信息,请访问 Laravel 迁移电子邮件页。

    步骤 3: 创建存储库

    创建 MessageRepository 和存储库名称 EloquentMessageRepository的实现。

    MessageRepository

    <?phpnamespaceAppRepositoriesContracts;interfaceMessageRepositoryextendsBaseRepository{}

    EloquentMessageRepository

    <?phpnamespaceAppRepositories;useAppModelsMessage;useAppRepositoriesContractsMessageRepository;classEloquentMessageRepositoryextendsAbstractEloquentRepositoryimplementsMessageRepository{/** * Model name. * * @var string*/protected$modelName=Message::class;}

    接下来,更新 RepositoriesServiceProvider 以绑定实现:

    <?phpnamespaceAppProviders;useIlluminateSupportServiceProvider;useAppRepositoriesContractsUserRepository;useAppRepositoriesEloquentUserRepository;useAppRepositoriesContractsMessageRepository;useAppRepositoriesEloquentMessageRepository;classRepositoriesServiceProviderextendsServiceProvider{/** * Indicates if loading of the provider is deferred. * * @var bool*/protected$defer=true;/** * Register any application services. * * @return void*/publicfunctionregister() {$this->app->bind(UserRepository::class, function () {returnnewEloquentUserRepository(newUser()); });$this->app->bind(MessageRepository::class, function () {returnnewEloquentMessageRepository(newMessage()); }); }/** * Get the services provided by the provider. * * @return array*/publicfunctionprovides() {return [UserRepository::class,MessageRepository::class, ]; }}

    访问流明文档了解有关服务提供商的更多信息。

    步骤 4: 创建分形转换器

    分形为复杂数据输出提供了一个表示和转换层,如在 RESTful api中发现的,并且使用 JSON 。 把它当作你的JSON/YAML/etc.的一个视图层

    app/Transformers 目录中创建新的变压器名称 MessageTransformer:

    <?phpnamespaceAppTransformers;useAppModelsMessage;useLeagueFractalTransformerAbstract;classMessageTransformerextendsTransformerAbstract{publicfunctiontransform(Message$message) {return ['id'=>$message->uid,'userId'=>$message->userId,'subject'=>$message->subject,'message'=>$message->message,'createdAt'=> (string) $message->created_at,'updatedAt'=> (string) $message->updated_at, ]; }}

    访问分形官方网页了解更多信息。

    步骤 5: 创建策略

    对于授权,我们需要创建策略,以基本用户不能显示或者编辑其他用户消息。

    MessagePolicy

    <?phpnamespaceAppPolicies;useAppModelsUser;useAppModelsMessage;classMessagePolicy{/** * Intercept checks. * * @param User $currentUser * @return bool*/publicfunctionbefore(User$currentUser) {if ($currentUser->isAdmin() && (!$currentUser->tokenCan('basic') ||$currentUser->tokenCan('undefined'))) {returntrue; } }/** * Determine if a given user has permission to show. * * @param User $currentUser * @param Message $message * @return bool*/publicfunctionshow(User$currentUser, Message$message) {return$currentUser->id===$message->userId; }/** * Determine if a given user can update. * * @param User $currentUser * @param Message $message * @return bool*/publicfunctionupdate(User$currentUser, Message$message) {return$currentUser->id===$message->userId; }/** * Determine if a given user can delete. * * @param User $currentUser * @param Message $message * @return bool*/publicfunctiondestroy(User$currentUser, Message$message) {return$currentUser->id===$message->userId; }}

    接下来,更新 AuthServiceProvider 以使用策略:

    Gate::policy(Message::class, MessagePolicy::class);

    将作用域添加到 Passport::tokensCan:

    [
     'messages' => 'Messages scope',
     'messages:list' => 'Messages scope',
     'messages:read' => 'Messages scope for reading records',
     'messages:write' => 'Messages scope for writing records',
     'messages:create' => 'Messages scope for creating records',
     'messages:delete' => 'Messages scope for deleting records'
    ]

    访问 Lumen 授权页面了解有关策略的更多信息。

    最后一步:创建控制器

    最后,让我们创建 MessageController 。 在这里我们使用英镑,MessageTransformer和 MessagePolicy 。

    <?phpnamespaceAppHttpControllers;useAppModelsMessage;useAppRepositoriesContractsMessageRepository;useIlluminateHttpRequest;useAppTransformersMessageTransformer;classMessageControllerextendsController{/** * Instance of MessageRepository. * * @var MessageRepository*/private$messageRepository;/** * Instanceof MessageTransformer. * * @var MessageTransformer*/private$messageTransformer;/** * Constructor. * * @param MessageRepository $messageRepository * @param MessageTransformer $messageTransformer*/publicfunction__construct(MessageRepository$messageRepository, MessageTransformer$messageTransformer) {$this->messageRepository=$messageRepository;$this->messageTransformer=$messageTransformer;parent::__construct(); }/** * Display a listing of the resource. * * @param Request $request * @return IlluminateHttpJsonResponse*/publicfunctionindex(Request$request) {$messages=$this->messageRepository->findBy($request->all());return$this->respondWithCollection($messages, $this->messageTransformer); }/** * Display the specified resource. * * @param $id * @return IlluminateHttpJsonResponse|string*/publicfunctionshow($id) {$message=$this->messageRepository->findOne($id);if (!$messageinstanceofMessage) {return$this->sendNotFoundResponse("The message with id {$id} doesn't exist"); }// Authorization$this->authorize('show', $message);return$this->respondWithItem($message, $this->messageTransformer); }/** * Store a newly created resource in storage. * * @param Request $request * @return IlluminateHttpJsonResponse|string*/publicfunctionstore(Request$request) {// Validation$validatorResponse=$this->validateRequest($request, $this->storeRequestValidationRules($request));// Send failed response if validation failsif ($validatorResponse!==true) {return$this->sendInvalidFieldResponse($validatorResponse); }$message=$this->messageRepository->save($request->all());if (!$messageinstanceofMessage) {return$this->sendCustomResponse(500, 'Error occurred on creating Message'); }return$this->setStatusCode(201)->respondWithItem($message, $this->messageTransformer); }/** * Update the specified resource in storage. * * @param Request $request * @param $id * @return IlluminateHttpJsonResponse*/publicfunctionupdate(Request$request, $id) {// Validation$validatorResponse=$this->validateRequest($request, $this->updateRequestValidationRules($request));// Send failed response if validation failsif ($validatorResponse!==true) {return$this->sendInvalidFieldResponse($validatorResponse); }$message=$this->messageRepository->findOne($id);if (!$messageinstanceofMessage) {return$this->sendNotFoundResponse("The message with id {$id} doesn't exist"); }// Authorization$this->authorize('update', $message);$message=$this->messageRepository->update($message, $request->all());return$this->respondWithItem($message, $this->messageTransformer); }/** * Remove the specified resource from storage. * * @param $id * @return IlluminateHttpJsonResponse|string*/publicfunctiondestroy($id) {$message=$this->messageRepository->findOne($id);if (!$messageinstanceofMessage) {return$this->sendNotFoundResponse("The message with id {$id} doesn't exist"); }// Authorization$this->authorize('destroy', $message);$this->messageRepository->delete($message);return response()->json(null, 204); }/** * Store Request Validation Rules * * @param Request $request * @return array*/privatefunctionstoreRequestValidationRules(Request$request) {return ['userId'=>'required|exists:users,id','subject'=>'required','message'=>'required', ]; }/** * Update Request validation Rules * * @param Request $request * @return array*/privatefunctionupdateRequestValidationRules(Request$request) {return ['subject'=>'','message'=>'', ]; }}

    访问 Lumen 控制器页面了解有关控制器的更多信息。

    教程

    要查看循序渐进的教程,我如何创建这里模板,请访问我们的博客 devnootes.net 。

    贡献。问题和评论均受欢迎并鼓励。 对于代码捐赠提交请求请求。

    Credits

    ,,,,,。

    许可证

    MIT许可证




    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语