рдкрд░рд┐рдЪрдп
рд╣реИрд▓реЛ, рдкреНрд░рд┐рдп рдЦрд╛рдмрд░реЛрд╡рдЪрдиред
рдПрдкреАрдЖрдИ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдЕрдкрдиреЗ рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди, рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рддрд░реАрдХреЗ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рдпрд╛ред рдХрд╛рд░реНрдп рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдкрд╣реБрдВрдЪ рдирд┐рдпрдВрддреНрд░рдг рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рдХрд╛рдлреА рд╡реНрдпрд╛рдкрдХ рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЗрд╕реА рд╕рдордп, рдЙрдирдореЗрдВ рд╕реЗ рдЬреНрдпрд╛рджрд╛рддрд░ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реАрдЖрд░рдпреВрдбреА рдкрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдзрд┐рдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рдФрд░ рд▓рдЪреАрд▓реА рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╢рдВрдХреБ рдереЗ, рдХреНрдпреЛрдВрдХрд┐ рдЗрди рд▓реЗрдЦреЛрдВ рдореЗрдВ рдореИрдВрдиреЗ рдЬреЛ рдХреБрдЫ рдХрд┐рдпрд╛ рдЙрд╕рдХрд╛ рдХреБрдЫ рд╣рдж рддрдХ рд╕рд░рд▓реАрдХреГрдд рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред
рдореИрдВ рдЕрд▓рдЧ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ - рд╕рд╛рдордЧреНрд░реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рд╣реИ, рдФрд░ рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рдпрд╣ рдЖрд▓реЗрдЦ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдФрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рд╢реЗрдбреНрдпреВрд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпрд╣ рд╕рдм рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рднрд╛рдЧ 1. рдореЙрдбрд▓, рдирд┐рдпрдВрддреНрд░рдХ
рддреЛ, рдХрд╛рд░реНрдп: рдХрдИ рдореЙрдбрд▓ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рдВрдЦреНрдпрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдмрдврд╝ рдФрд░ рдШрдЯ рд╕рдХрддреА рд╣реИред
рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рднреВрдорд┐рдХрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдЕрдзрд┐рдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
CRUD, рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд╛рд▓реЗ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдпрд╛рдд, рдирд┐рд░реНрдпрд╛рдд ) рдЬреИрд╕реА рд╕рд░рд▓ рдХреНрд░рд┐рдпрд╛рдПрдВ рд╣реИрдВ ред
рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдХрд╛рдо (рдЕрдкрдиреЗ рдкреНрд░рд┐рдп рдХреЗ рд▓рд┐рдП) рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЙрдбрд▓ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдирд╛ред
рд▓реЗрдЦ рдПрдХ рдПрдкреАрдЖрдИ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдорд╛рдзрд╛рди рди рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред
рдирдореВрдирд╛
Post. ( ) app.
app/Models Posts. ( , -).
. :
php artisan make:model Models/Post --api --migration
php artisan migrate
: , . , .
PostController CRUD
Controller.
ModelController Controller , , PostController.
PostController тАФ import() export(Post $post).
, .
Laravel Illuminate\Foundation\Auth\Access\AuthorizesRequests.
App\Http\Controllers\Controller ModelController. Controller , .
authorizeResource($model).
, (Middleware) .
:
can:viewAny,App\Models\Post
can:view,post
can:update,post
, , тАФ :
- viewAny view apiResource
- , тАФ .
:
. resourceAbilityMap() .
<?php
protected function resourceAbilityMap()
{
return [
'index' => 'viewAny',
'show' => 'view',
'create' => 'create',
'store' => 'create',
'edit' => 'update',
'update' => 'update',
'destroy' => 'delete',
];
}
. Laravel . , . index() , show(Post $post) . resourceMethodsWithoutModels()
<?php
protected function resourceMethodsWithoutModels()
{
return ['index', 'create', 'store'];
}
(ModelController)
app/Http/Controllers ModelController. :
- $guardedMethods ┬л ┬╗ => ┬л ┬╗.
(Policy) , , (Gate). .
- $methodsWithoutModels .
- getModelClass() .
.
- authorizeResource($this->getModelClass()) . ( (Route), )
- resourceAbilityMap() resourceMethodsWithoutModels() , , .
<?php
namespace App\Http\Controllers;
abstract class ModelController extends Controller
{
protected $guardedMethods = [];
protected $methodsWithoutModels = [];
protected abstract function getModelClass(): string;
public function __construct()
{
$this->authorizeResource($this->getModelClass());
}
protected function resourceAbilityMap()
{
$base = parent::resourceAbilityMap();
return array_merge($base, $this->guardedMethods);
}
protected function resourceMethodsWithoutModels()
{
$base = parent::resourceMethodsWithoutModels();
return array_merge($base, $this->methodsWithoutModels);
}
}
(PostController)
:
- getModelClass() .
- $methodsWithoutModels ┬л ┬╗ => ┬л ┬╗ . . , =. , , .
- $methodsWithoutModels , . import
- тАФ , . тАФ .
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends ModelController
{
protected $guardedMethods = [
'export' => 'export',
'import' => 'import',
];
protected $methodsWithoutModels = ['import'];
protected function getModelClass(): string
{
return Post::class;
}
public function index()
{ }
public function store(Request $request)
{ }
public function show(Post $post)
{ }
public function update(Request $request, Post $post)
{ }
public function destroy(Post $post)
{ }
public function import()
{ }
public function export(Post $post)
{ }
}
(Routes)
.
'routes/api.php' ( 'routes/web.php', ) .
, , .
тАФ ( ) , Route::apiResource('posts', 'PostController'). Laravel. .
тАФ 'auth:api'. , .
<?php
use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;
Route::group(['middleware' => ['auth:api']], static function () {
Route::post('posts/import', 'PostController@import')->name('posts.import');
Route::get('posts/{post}/export', 'PostController@export')->name('posts.export');
Route::apiResource('posts', 'PostController');
});
. :
php artisan route:list
тАФ ( )
+-----------------------+---------------------------+-------------------------------+
|URI |Action |Middleware |
+-----------------------+---------------------------+-------------------------------+
|api/posts |...\PostController@index |...,can:viewAny,App\Models\Post|
|api/posts |...\PostController@store |...,can:create,App\Models\Post |
|api/posts/import |...\PostController@import |...,can:import,App\Models\Post |
|api/posts/{post} |...\PostController@show |...,can:view,post |
|api/posts/{post} |...\PostController@update |...,can:update,post |
| рдПрдкреАрдЖрдИ / рдкреЛрд╕реНрдЯ / {рдкреЛрд╕реНрдЯ} | ... \ рдкреЛрд╕реНрдЯрдХрдВрдЯреНрд░реЛрд▓рд░ @ рдирд╖реНрдЯ | ...,: рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдкреЛрд╕реНрдЯ |
| рдПрдкреАрдЖрдИ / рдкреЛрд╕реНрдЯ / {рдкреЛрд╕реНрдЯ} / рдирд┐рд░реНрдпрд╛рдд | ... \ рдкреЛрд╕реНрдЯрдХрдВрдЯреНрд░реЛрд▓рд░ @ рдирд┐рд░реНрдпрд╛рдд | ..., рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдирд┐рд░реНрдпрд╛рдд, рдкреЛрд╕реНрдЯ
+ ----------------------- + ------------------------- - + ------------------------------- +
рдЕрдЧрд▓рд╛ рдЪрд░рдг рд▓рд┐рдВрдХ рдЧреЗрдЯ (рдЧреЗрдЯ) <-> рдиреАрддрд┐ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдЕрдзрд┐рдХ ред