1. Go to this page and download the library: Download alirah/laravel-rest library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
alirah / laravel-rest example snippets
// In your providers array.
'providers' => [
...
Alirah\LaravelRest\Provider\LaravelRestServiceProvider::class,
],
// In your aliases array.
'aliases' => [
...
'Rest' => Alirah\LaravelRest\Facade\Rest::class,
],
// to use swagger you have to install darkaonline/l5-swagger
'swagger' => false,
'swagger_route_prefix' => 'api',
'model' => true,
'migration' => true,
'factory_seeder' => true,
'test' => true,
'route' => true,
// file in the routes' folder
// if you have another folder in routes use this pattern: v1/api.php
'route_path' => 'api.php'
/**
* @return JsonResponse
*/
public function index(): JsonResponse
{
$users = User::paginate(20);
return Rest::ok(UserResource::collection($users));
}
artisan rest:make Blog
artisan test
artisan l5-swagger:generate
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Blog extends Model
{
use HasFactory;
protected $guarded = [
'id'
];
}
namespace App\Http\Controllers\Blog;
use Alirah\LaravelRest\Facade\Rest;
use App\Http\Controllers\Controller;
use App\Http\Request\Blog\StoreRequest;
use App\Http\Request\Blog\UpdateRequest;
use Illuminate\Http\JsonResponse;
use App\Models\Blog;
use App\Http\Resource\Blog\BlogResource;
class BlogController extends Controller
{
/**
* @OA\Get(
* path="/api/blogs",
* operationId="getBlogsList",
* tags={"Blogs"},
* summary="Get list of blogs",
* description="Returns list of blogs",
* @OA\Response(
* response=200,
* description="Successful operation",
* @OA\JsonContent
* ),
* @OA\Response(
* response=401,
* description="Unauthenticated",
* @OA\JsonContent
* ),
* @OA\Response(
* response=403,
* description="Forbidden",
* @OA\JsonContent
* )
* )
*/
public function index(): JsonResponse
{
$blogs = Blog::paginate(20);
// TODO handle query
return Rest::ok(BlogResource::collection($blogs));
}
/**
* @OA\Post(
* path="/api/blogs",
* operationId="storeBlog",
* tags={"Blogs"},
* summary="Store new blog",
* description="Returns blog data",
* @OA\RequestBody(
* * response=400,
* description="Bad Request",
* @OA\JsonContent
* ),
* @OA\Response(
* response=401,
* description="Unauthenticated",
* @OA\JsonContent
* ),
* @OA\Response(
* response=403,
* description="Forbidden",
* @OA\JsonContent
* ),
* @OA\Response(
* response=404,
* description="Blog Not Found",
* @OA\JsonContent
* )
* )
*/
public function show(Blog $blog): JsonResponse
{
// you can load relationships by using
// $blog->load('relation-1', 'relation-2');
return Rest::ok(new BlogResource($blog));
}
/**
* @OA\Put(
* path="/api/blogs/{id}",
* operationId="updateBlog",
* tags={"Blogs"},
* summary="Update existing blog",
* description="Returns updated blog data",
* @OA\Parameter(
* name="id",
* description="Blog id",
*
namespace App\Http\Request\Blog;
use Illuminate\Foundation\Http\FormRequest;
class StoreRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize(): bool
{
return true;
}
protected function prepareForValidation()
{
//
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules(): array
{
// TODO validation
return [
//
];
}
}
namespace App\Http\Request\Blog;
use Illuminate\Foundation\Http\FormRequest;
class UpdateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize(): bool
{
return true;
}
protected function prepareForValidation()
{
//
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules(): array
{
// TODO validation
return [
//
];
}
}
namespace App\Http\Resource\Blog;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
use JsonSerializable;
class BlogResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param Request $request
* @return array|Arrayable|JsonSerializable
*/
public function toArray($request): array|JsonSerializable|Arrayable
{
// TODO return Blog fields
return [
'id' => $this->id,
// your fields
'createdAt' => $this->created_at
];
}
}
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
if (!Schema::hasTable('blogs')) {
Schema::create('blogs', function (Blueprint $table) {
$table->id();
// TODO table fields
$table->timestamps();
});
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('blogs');
}
};
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends Factory
*/
class BlogFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array
*/
public function definition(): array
{
// TODO factory fields
return [
// for example: 'title' => $this->faker->sentence(1),
];
}
}
namespace Database\Seeders;
use App\Models\Blog;
use Illuminate\Database\Seeder;
class BlogSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
// TODO handle factory
// TODO you should add it to DatabaseSeeder
// for example:
// public function run()
// {
// $this->call([
// BlogSeeder::class
// ]);
// }
Blog::factory(10)->create();
}
}
namespace Tests\Feature\Blog;
use App\Models\Blog;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Symfony\Component\HttpFoundation\Response;
use Tests\TestCase;
class BlogTest extends TestCase
{
use RefreshDatabase;
protected array $dataStruct;
protected array $testData;
protected Blog $blog;
public function setUp(): void
{
parent::setUp();
$this->dataStruct = [
'id',
// TODO Enter fields that return from BlogResource
// e.g title
'createdAt'
];
$this->testData = [
// TODO Enter test data for store and update methods
// e.g 'title' => 'title'
];
Blog::factory(10)->create();
$this->blog = Blog::inRandomOrder()->first();
}
public function test_index()
{
$response = $this->json('get', '/api/blogs');
$response->assertStatus(Response::HTTP_OK)
->assertJsonStructure([
'data' => [
$this->dataStruct
]
]);
}
public function test_store()
{
$response = $this->json('post', '/api/blogs', $this->testData);
$response->assertStatus(Response::HTTP_ACCEPTED)
->assertJsonStructure([
'data' => $this->dataStruct
])->assertJson([
'data' => $this->testData
]);
}
public function test_show()
{
$response = $this->json('get', "/api/blogs/{$this->blog->id}");
$response->assertStatus(Response::HTTP_OK)
->assertJsonStructure([
'data' => $this->dataStruct
]);
}
public function test_update()
{
$response = $this->json('put', "/api/blogs/{$this->blog->id}", $this->testData);
$response->assertStatus(Response::HTTP_ACCEPTED)
->assertJsonStructure([
'data' => $this->dataStruct
])->assertJson([
'data' => $this->testData
]);
}
public function test_delete()
{
$response = $this->json('delete', "/api/blogs/{$this->blog->id}");
$response->assertStatus(Response::HTTP_ACCEPTED);
}
}
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
.
..
...
Route::apiResource('blogs', \App\Http\Controllers\Blog\BlogController::class);