Laravel рдХреЗ рд▓рд┐рдП рдХреЛрдб рдЬрдирд░реЗрдЯрд░ - OAS рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП, JSON-API рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП

рднрд╛рд╡реА рдкреАрдврд╝реА рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдПрдХ рд╣реА рдирд┐рдпрдВрддреНрд░рдХ, рдореЙрдбрд▓, рд░рд╛рдЙрдЯрд░, рдорд┐рдбрд▓рд╡реЗрдпрд░, рдорд╛рдЗрдЧреНрд░реЗрд╢рди, рдХрдВрдХрд╛рд▓, рдлрд┐рд▓реНрдЯрд░, рд╕рддреНрдпрд╛рдкрди рдЖрджрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкрд░рд┐рдЪрд┐рдд рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ), рдпрд╣ рдореБрдЭреЗ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрд╛ред

рдореИрдВрдиреЗ рдУрдкрдирдПрдкреАрдЖрдИ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛, рдореБрдЭреЗ рдЗрд╕рдХреА рд░реИрдЦрд┐рдХрддрд╛ рдФрд░ рдХрд┐рд╕реА рднреА рдЗрдХрд╛рдИ рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ 1-3 рд╕реНрддрд░реЛрдВ рдкрд░ рдЧрд╣рд░реА рдкрд╕рдВрдж рдЖрдИред рдЪреВрдВрдХрд┐ рдЙрд╕ рд╕рдордп рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рд░рд╡реЗрд▓ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдерд╛ (Yii2 рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реАрдЖрдИ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рд╡реЗ рдХрдо рд▓реЛрдХрдкреНрд░рд┐рдп рдереЗ), рд╕рд╛рде рд╣реА рд╕рд╛рде json-api рдбреЗрдЯрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рд░реВрдк - рдкреВрд░реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдПрдХ рдЬреБрдбрд╝реЗ рд╣реБрдП рдЧреНрд░рд╛рдл рдХреЗ рд╕рд╛рде рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рдиреАрдЪреЗ рдЪрд▓реА рдЧрдИред



рдЪрд▓рд┐рдП рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред

рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ OAS рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдХрд╛рдИ рд╣реИ:

ArticleAttributes: description: Article attributes description type: object properties: title: required: true type: string minLength: 16 maxLength: 256 facets: index: idx_title: index description: required: true type: string minLength: 32 maxLength: 1024 facets: spell_check: true spell_language: en url: required: false type: string minLength: 16 maxLength: 255 facets: index: idx_url: unique show_in_top: description: Show at the top of main page required: false type: boolean status: description: The state of an article enum: ["draft", "published", "postponed", "archived"] facets: state_machine: initial: ['draft'] draft: ['published'] published: ['archived', 'postponed'] postponed: ['published', 'archived'] archived: [] topic_id: description: ManyToOne Topic relationship required: true type: integer minimum: 1 maximum: 6 facets: index: idx_fk_topic_id: foreign references: id on: topic onDelete: cascade onUpdate: cascade rate: type: number minimum: 3 maximum: 9 format: double date_posted: type: date-only time_to_live: type: time-only deleted_at: type: datetime 

рдЕрдЧрд░ рд╣рдо рдХрдорд╛рдВрдб рдЪрд▓рд╛рддреЗ рд╣реИрдВ

 php artisan api:generate oas/openapi.yaml --migrations 

рддрдм рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрддреНрдкрдиреНрди рд╡рд╕реНрддреБрдПрдБ рдорд┐рд▓рддреА рд╣реИрдВ:

1) рдЗрдХрд╛рдИ рдирд┐рдпрдВрддреНрд░рдХ

 <?php namespace Modules\V1\Http\Controllers; class ArticleController extends DefaultController { } 

рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА GET / POST / PATCH / DELETE рдЬрд╛рдирддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╡рд╣ рдореЙрдбрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЯреЗрдмрд▓ рдкрд░ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдорд╛рдЗрдЧреНрд░реЗрд╢рди рднреА рдЬреЗрдирд░реЗрдЯ рд╣реЛрдЧрд╛ред DefaultController рд╣рдореЗрд╢рд╛ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ, рддрд╛рдХрд┐ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛред

2) рдЕрдиреБрдЪреНрдЫреЗрдж рдЗрдХрд╛рдИ рдореЙрдбрд▓

 <?php namespace Modules\V2\Entities; use Illuminate\Database\Eloquent\SoftDeletes; use rjapi\extension\BaseModel; class Article extends BaseModel { use SoftDeletes; // >>>props>>> protected $dates = ['deleted_at']; protected $primaryKey = 'id'; protected $table = 'article'; public $timestamps = false; public $incrementing = false; // <<<props<<< // >>>methods>>> public function tag() { return $this->belongsToMany(Tag::class, 'tag_article'); } public function topic() { return $this->belongsTo(Topic::class); } // <<<methods<<< } 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдпрд╣рд╛рдБ рджрд┐рдЦрд╛рдИ рджреАрдВ >> >>> props >>> рдФрд░ // >>> рд╡рд┐рдзрд┐рдпрд╛рдБ >>> - рдХреЛрдб-рд╕реНрдкреЗрд╕ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб-рд╕реНрдкреЗрд╕ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдПрдХ рдЯреИрдЧ / рд╡рд┐рд╖рдп рд╕рдВрдмрдВрдз рднреА рд╣реИ - belognsToMany / рдЕрдВрддрд░реНрдЧрддред рдХреНрд░рдорд╢рдГ, рдЬреЛ рдЕрдиреБрдЪреНрдЫреЗрдж рдЗрдХрд╛рдИ рдХреЛ рдЯреИрдЧ / рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╣реА GET рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдзреЛрдВ json-api рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рд▓реЗрдЦ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛ред

3) рд░реЛрд▓рдмреИрдХ рд╕рдорд░реНрдерди (рдкреНрд░рддрд┐рдмрд┐рдВрдм / рдкрд░рдорд╛рдгреБ) рдХреЗ рд╕рд╛рде рдЗрдХрд╛рдИ рдкреНрд░рд╡рд╛рд╕рди:

 <?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateArticleTable extends Migration { public function up() { Schema::create('article', function(Blueprint $table) { $table->bigIncrements('id'); $table->string('title', 256); $table->index('title', 'idx_title'); $table->string('description', 1024); $table->string('url', 255); $table->unique('url', 'idx_url'); // Show at the top of main page $table->unsignedTinyInteger('show_in_top'); $table->enum('status', ["draft","published","postponed","archived"]); // ManyToOne Topic relationship $table->unsignedInteger('topic_id'); $table->foreign('topic_id', 'idx_fk_topic_id')->references('id')->on('topic')->onDelete('cascade')->onUpdate('cascade'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('article'); } } 

рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЬрдирд░реЗрдЯрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдд (рд╕рдордЧреНрд░ рд╡рд╛рд▓реЗ рд╕рд╣рд┐рдд) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

4) рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рд░рд╛рдЙрдЯрд░:

 // >>>routes>>> // Article routes Route::group(['prefix' => 'v2', 'namespace' => 'Modules\\V2\\Http\\Controllers'], function() { // bulk routes Route::post('/article/bulk', 'ArticleController@createBulk'); Route::patch('/article/bulk', 'ArticleController@updateBulk'); Route::delete('/article/bulk', 'ArticleController@deleteBulk'); // basic routes Route::get('/article', 'ArticleController@index'); Route::get('/article/{id}', 'ArticleController@view'); Route::post('/article', 'ArticleController@create'); Route::patch('/article/{id}', 'ArticleController@update'); Route::delete('/article/{id}', 'ArticleController@delete'); // relation routes Route::get('/article/{id}/relationships/{relations}', 'ArticleController@relations'); Route::post('/article/{id}/relationships/{relations}', 'ArticleController@createRelations'); Route::patch('/article/{id}/relationships/{relations}', 'ArticleController@updateRelations'); Route::delete('/article/{id}/relationships/{relations}', 'ArticleController@deleteRelations'); }); // <<<routes<<< 

рд░реВрдЯ рдХреЛ рди рдХреЗрд╡рд▓ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдмрд▓реНрдХрд┐ рдЕрдиреНрдп рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рд╛рде рднреА рд╕рдВрдмрдВрдз рдереЗ, рдЬреЛ 1 рдХреНрд╡реЗрд░реА рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рджреНрд╡рд╛рд░рд╛ рдмрд▓реНрдХ рдореЗрдВ рдбреЗрдЯрд╛ рдмрдирд╛рдиреЗ / рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ / рд╣рдЯрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдмрд▓реНрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЦреАрдВрдЪреЗ рдЬрд╛рдПрдВрдЧреЗред

5) рдкреВрд░реНрд╡-рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг / рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк:

 <?php namespace Modules\V1\Http\Requests; use rjapi\extension\BaseFormRequest; class ArticleFormRequest extends BaseFormRequest { // >>>props>>> public $id = null; // Attributes public $title = null; public $description = null; public $url = null; public $show_in_top = null; public $status = null; public $topic_id = null; public $rate = null; public $date_posted = null; public $time_to_live = null; public $deleted_at = null; // <<<props<<< // >>>methods>>> public function authorize(): bool { return true; } public function rules(): array { return [ 'title' => 'required|string|min:16|max:256|', 'description' => 'required|string|min:32|max:1024|', 'url' => 'string|min:16|max:255|', // Show at the top of main page 'show_in_top' => 'boolean', // The state of an article 'status' => 'in:draft,published,postponed,archived|', // ManyToOne Topic relationship 'topic_id' => 'required|integer|min:1|max:6|', 'rate' => '|min:3|max:9|', 'date_posted' => '', 'time_to_live' => '', 'deleted_at' => '', ]; } public function relations(): array { return [ 'tag', 'topic', ]; } // <<<methods<<< } 

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рд╕рдВрдмрдВрдзреЛрдВ рдХреА рдкрджреНрдзрддрд┐ рдореЗрдВ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рд╛рде рдореБрдЦреНрдп рдЗрдХрд╛рдИ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрдгреЛрдВ рдФрд░ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рдирд┐рдпрдо рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВред

рдЕрдВрдд рдореЗрдВ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХреНрд╡реЗрд░реА рдЙрджрд╛рд╣рд░рдг рд╣реИ:

 http://example.com/v1/article?include=tag&page=2&limit=10&sort=asc 

рдПрдХ рд▓реЗрдЦ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ, рд╕рдВрдмрдВрдзреЛрдВ рдореЗрдВ рдЗрд╕рдХреЗ рд╕рднреА рдЯреИрдЧреЛрдВ рдХреЛ рдХрд╕ рд▓реЗрдВ, рдкреГрд╖реНрда 2 рдкрд░ рдкреЗрдЬреЗрд╢рди, 10 рдХреА рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде, рдФрд░ рдЙрдореНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВред

рдЕрдЧрд░ рд╣рдореЗрдВ рд▓реЗрдЦ рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ:

 http://example.com/v1/article/1?include=tag&data=["title", "description"] 

рдХрдИ рдХреНрд╖реЗрддреНрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдХреНрд░рдордмрджреНрдз рдХрд░реЗрдВ:

 http://example.com/v1/article/1?include=tag&order_by={"title":"asc", "created_at":"desc"} 

рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ (рдпрд╛ рдЬреЛ рднреА рд╡рд╣рд╛рдБ рд╕реНрдерд┐рдд рд╣реИ):

 http://example.com/v1/article?include=tag&filter=[["updated_at", ">", "2018-01-03 12:13:13"], ["updated_at", "<", "2018-09-03 12:13:15"]] 

рдПрдХ рдЗрдХрд╛рдИ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд▓реЗрдЦ):

 POST http://laravel.loc/v1/article { "data": { "type":"article", "attributes": { "title":"Foo bar Foo bar Foo bar Foo bar", "description":"description description description description description", "fake_attr": "attr", "url":"title title bla bla bla", "show_in_top":1 } } } 

рдЙрддреНрддрд░ рд╣реИ:

 { "data": { "type": "article", "id": "1", "attributes": { "title": "Foo bar Foo bar Foo bar Foo bar", "description": "description description description description description", "url": "title title bla bla bla", "show_in_top": 1 }, "links": { "self": "laravel.loc/article/1" } } } 

рд▓рд┐рдВрдХ рдореЗрдВ рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВ-> рд╕реНрд╡? рдЖрдк рддреБрд░рдВрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
 GET http://laravel.loc/article/1 
рдпрд╛ рдЗрд╕реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬреЗрдВред

 GET http://laravel.loc/v1/article?include=tag&filter=[["updated_at", ">", "2017-01-03 12:13:13"], ["updated_at", "<", "2019-01-03 12:13:15"]] { "data": [ { "type": "article", "id": "1", "attributes": { "title": "Foo bar Foo bar Foo bar Foo bar 1", "description": "The quick brovn fox jumped ower the lazy dogg", "url": "http://example.com/articles_feed 1", "show_in_top": 0, "status": "draft", "topic_id": 1, "rate": 5, "date_posted": "2018-02-12", "time_to_live": "10:11:12" }, "links": { "self": "laravel.loc/article/1" }, "relationships": { "tag": { "links": { "self": "laravel.loc/article/1/relationships/tag", "related": "laravel.loc/article/1/tag" }, "data": [ { "type": "tag", "id": "1" } ] } } } ], "included": [ { "type": "tag", "id": "1", "attributes": { "title": "Tag 1" }, "links": { "self": "laravel.loc/tag/1" } } ] } 

рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реМрдЯрд╛ рджреА, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдЗрд╕ рд╡рд╕реНрддреБ рдХрд╛ рдкреНрд░рдХрд╛рд░, рдЗрд╕рдХреА рдЖрдИрдбреА, рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдкреВрд░рд╛ рд╕реЗрдЯ, рдлрд┐рд░ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ, рдпреВрдЖрд░рдПрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЧрдП рд╕рдВрдмрдВрдзреЛрдВ рдореЗрдВ = рдЯреИрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рдВрдмрдВрдзреЛрдВ рдкрд░ рдХреЛрдИ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, = = рдЯреИрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╡рд┐рд╖рдп, рд╢рд╣рд░ рдФрд░ рдЙрди рд╕рднреА рдХреЛ рд░рд┐рд╢реНрддреЗ рдмреНрд▓реЙрдХ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЙрдирдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрджрд┐ рд╣рдо 1 рд▓реЗрдЦ рдФрд░ рдЙрд╕рдХреЗ рд╕рднреА рд░рд┐рд╢реНрддреЛрдВ / рд░рд┐рд╢реНрддреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

 GET http://laravel.loc/v1/article/1?include=tag&data=["title", "description"] { "data": { "type": "article", "id": "1", "attributes": { "title": "Foo bar Foo bar Foo bar Foo bar 123456", "description": "description description description description description 123456", }, "links": { "self": "laravel.loc/article/1" }, "relationships": { "tag": { "links": { "self": "laravel.loc/article/1/relationships/tag", "related": "laravel.loc/article/1/tag" }, "data": [ { "type": "tag", "id": "3" }, { "type": "tag", "id": "1" }, { "type": "tag", "id": "2" } ] } } }, "included": [ { "type": "tag", "id": "3", "attributes": { "title": "Tag 4" }, "links": { "self": "laravel.loc/tag/3" } }, { "type": "tag", "id": "1", "attributes": { "title": "Tag 2" }, "links": { "self": "laravel.loc/tag/1" } }, { "type": "tag", "id": "2", "attributes": { "title": "Tag 3" }, "links": { "self": "laravel.loc/tag/2" } } ] } 


рдФрд░ рдпрд╣рд╛рдБ рдПрдХ рдореМрдЬреВрджрд╛ рд╕рдВрд╕реНрдерд╛ рд╕реЗ рд░рд┐рд╢реНрддреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ - рдПрдХ рдЕрдиреБрд░реЛрдз:

 PATCH http://laravel.loc/v1/article/1/relationships/tag { "data": { "type":"article", "id":"1", "relationships": { "tag": { "data": [{ "type": "tag", "id": "2" },{ "type": "tag", "id": "3" }] } } } } 

рдЙрддреНрддрд░ рд╣реИ:

 { "data": { "type": "article", "id": "1", "attributes": { "title": "Foo bar Foo bar Foo bar Foo bar 1", "description": "The quick brovn fox jumped ower the lazy dogg", "url": "http://example.com/articles_feed 1", "show_in_top": 0, "status": "draft", "topic_id": 1, "rate": 5, "date_posted": "2018-02-12", "time_to_live": "10:11:12" }, "links": { "self": "laravel.loc/article/1" }, "relationships": { "tag": { "links": { "self": "laravel.loc/article/1/relationships/tag", "related": "laravel.loc/article/1/tag" }, "data": [ { "type": "tag", "id": "2" }, { "type": "tag", "id": "3" } ] } } }, "included": [ { "type": "tag", "id": "2", "attributes": { "title": "Tag 2" }, "links": { "self": "laravel.loc/tag/2" } }, { "type": "tag", "id": "3", "attributes": { "title": "Tag 3" }, "links": { "self": "laravel.loc/tag/3" } } ] } 

рдЖрдк рдХрдВрд╕реЛрд▓ рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдХрд▓реНрдк рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 php artisan api:generate oas/openapi.yaml --migrations --regenerate --merge=last 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЖрдк рдЬрдирд░реЗрдЯрд░ рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ - рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдХреЛрдб рдмрдирд╛рдПрдВ (рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЗрд╕реЗ рджреЗрдЦрд╛ рдерд╛) рдФрд░ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЗрдирд░реЗрдЯ рдХрд░реЗрдВ, рдЗрд╕реЗ рд╕рд╣реЗрдЬреЗ рдЧрдП рдЗрддрд┐рд╣рд╛рд╕ рд╕реЗ рдирд╡реАрдирддрдо рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реБрдП, рдХреЛрдб рдХреЗ рдХрд╕реНрдЯрдо рд╕реЗрдХреНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд╡реЗ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реБрдП рдереЗ (рдмрд╕, рдЙрди) , рдЬреЛ рдХреЛрдб рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реЗрд╖ рдмреНрд▓реЙрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрд░рдг рд╡рд╛рдкрд╕ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ: --merge = 9 (рдкреАрдврд╝реА 9 рдХрджрдо рдкреАрдЫреЗ рд░реЛрд▓ рдХрд░реЗрдВ), рдХреЛрдб рдкреАрдврд╝реА рдЕрддреАрдд рдореЗрдВ рджрд┐рдирд╛рдВрдХ --merge = "2017-07-29 11:35:32" ред

рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ - - theests рд╡рд┐рдХрд▓реНрдк рдЬреЛрдбрд╝рдХрд░ рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреА API рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИред

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЖрдк рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╡реЗ рд╕рднреА рд▓рдЪреАрд▓реЗ рд░реВрдк рд╕реЗ рд╡рд┐рдиреНрдпрд╛рд╕рдХрд░реНрддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЬреЛ рдЙрддреНрдкрдиреНрди рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ - рдЙрджрд╛рд╣рд░рдг: /Modules/V2/Config/config.php ):

 <?php return [ 'name' => 'V2', 'query_params'=> [ //    - 'limit' => 15, 'sort' => 'desc', 'access_token' => 'db7329d5a3f381875ea6ce7e28fe1ea536d0acaf', ], 'trees'=> [ //      'menu' => true, ], 'jwt'=> [ // jwt  'enabled' => true, 'table' => 'user', 'activate' => 30, 'expires' => 3600, ], 'state_machine'=> [ // finite state machine 'article'=> [ 'status'=> [ 'enabled' => true, 'states'=> [ 'initial' => ['draft'], 'draft' => ['published'], 'published' => ['archived', 'postponed'], 'postponed' => ['published', 'archived'], 'archived' => [''], ], ], ], ], 'spell_check'=> [ //       'article'=> [ 'description'=> [ 'enabled' => true, 'language' => 'en', ], ], ], 'bit_mask'=> [ //     permissions ( true/false /  ) 'user'=> [ 'permissions'=> [ 'enabled' => true, 'flags'=> [ 'publisher' => 1, 'editor' => 2, 'manager' => 4, 'photo_reporter' => 8, 'admin' => 16, ], ], ], ], 'cache'=> [ //    'tag'=> [ 'enabled' => false, //    tag  'stampede_xfetch' => true, 'stampede_beta' => 1.1, 'ttl' => 3600, ], 'article'=> [ 'enabled' => true, //    article  'stampede_xfetch' => true, 'stampede_beta' => 1.5, 'ttl' => 300, ], ], ]; 

рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╕рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ / рдмрдВрдж рдмрд┐рдВрджреБ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВред рдпреЛрдЧрджрд╛рдиреЛрдВ рдХрд╛ рд╣рдореЗрд╢рд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди, рд░рдЪрдирд╛рддреНрдордХ рд╕рдлрд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд▓реЗрдЦ рд╕рдВрд╕рд╛рдзрди:

Source: https://habr.com/ru/post/hi427741/


All Articles