در این آموزش ما قصد داریم به شما نحوه ی ساخت RESTful API در لاراول به همراه احراز هویت با استفاده از پکیج passport را آموزش دهیم.ما قصد داریم برای ساخت RESTful API از API resources لاراول استفاده کنیم.در این مقاله ما به عنوان مثال API ، ثبت نام ، ورود ، عملیات CRUD محصول کتاب را ایجاد می کنیم.
برای هر پروژه لاراول ما نیاز داریم که لاراول را نصب کنیم. به همین دلیل ما یک مقاله در رابطه با چگونگی نصب و پیکربندی اولیه لاراول آماده کرده ایم که می توانید از اینجا ان را مشاهده نمایید : آموزش نصب لاراول به همراه تنظیمات اولیه
composer require laravel/passport
ما باید PassportServiceProvider را به فایل app.php اضافه کنیم. فایل مذکور را از مسیر config / app.php را باز کنید و خط زیر را به آن اضافه کنید:
'providers' =>[
Laravel\Passport\PassportServiceProvider::class,
],
در اینجا ما نیاز داریم که دستور migration را اجرا کنیم.بعد از اجرای دستور migration چندین جدول برای ما ساخته می شود که می توانید انها را در دیتابیس پروژه خود مشاهده نمایید :
php artisan migrate
بعد از اجرای دستور migration ما برای نصب Passport باید دستور زیر را اجرا کنیم:
php artisan passport:install
در ادامه ما باید سه فایل User.php ، AuthServiceProvider.php و auth.php را پیکربندی کنیم . فایل User.php را از مسیر app/User.php باز کنید و کدهای زیر را در آن وارد کنید:
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Laravel\Passport\HasApiTokens;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements MustVerifyEmail
{
use HasApiTokens, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}
app/Providers/AuthServiceProvider.php را ویرایش کنید و کدهای زبر را در آن بنویسید:
<?php
namespace App\Providers;
use Laravel\Passport\Passport;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
}
همچنین فایل config/auth.php را باز کنید و کدهای زیر را در آن وار کنید:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
با اجرای دستور زیر جدول books را ایجاد کنید:
php artisan make:migration create_books_table
به پوشه database/migrations بروید و فایل migration که اخیرا ایجاد کردید را پیدا کنید و کدهای زیر را در آن وارد کنید:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateBooksTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('books', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->text('author');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('books');
}
}
اکنون دستور زیر را برای migrate کردن ایجاد کنید:
php artisan migrate
ما قصد داریم یک مدل و دو کنترلر برای این پروژه ایجاد کنیم. ابتدا دستور زیر را برای ایجاد مدل Book اجرا کنید:
php artisan make:model Book
مدل Book را از مسیر app/Book.php باز کنید و کدهای زیر را در آن بنویسید:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Book extends Model
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'author'
];
}
در ادامه با اجرای دستور زیر کنترلر BookController را در پوشه API ایجاد کنید:
php artisan make:controller API/BookController
کدهای زیر را در کنترلرBookController وارد کنید:
<?php
namespace App\Http\Controllers\API;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Book;
use Validator;
class BookController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$books = Book::all();
$data = $books->toArray();
$response = [
'success' => true,
'data' => $data,
'message' => 'Books retrieved successfully.'
];
return response()->json($response, 200);
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$input = $request->all();
$validator = Validator::make($input, [
'name' => 'required',
'author' => 'required'
]);
if ($validator->fails()) {
$response = [
'success' => false,
'data' => 'Validation Error.',
'message' => $validator->errors()
];
return response()->json($response, 404);
}
$book = Book::create($input);
$data = $book->toArray();
$response = [
'success' => true,
'data' => $data,
'message' => 'Book stored successfully.'
];
return response()->json($response, 200);
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$book = Book::find($id);
$data = $book->toArray();
if (is_null($book)) {
$response = [
'success' => false,
'data' => 'Empty',
'message' => 'Book not found.'
];
return response()->json($response, 404);
}
$response = [
'success' => true,
'data' => $data,
'message' => 'Book retrieved successfully.'
];
return response()->json($response, 200);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, Book $book)
{
$input = $request->all();
$validator = Validator::make($input, [
'name' => 'required',
'author' => 'required'
]);
if ($validator->fails()) {
$response = [
'success' => false,
'data' => 'Validation Error.',
'message' => $validator->errors()
];
return response()->json($response, 404);
}
$book->name = $input['name'];
$book->author = $input['author'];
$book->save();
$data = $book->toArray();
$response = [
'success' => true,
'data' => $data,
'message' => 'Book updated successfully.'
];
return response()->json($response, 200);
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy(Book $book)
{
$book->delete();
$data = $book->toArray();
$response = [
'success' => true,
'data' => $data,
'message' => 'Book deleted successfully.'
];
return response()->json($response, 200);
}
}
حالا کنترلر UserController را در پوشه API ایجاد کنید:
php artisan make:controller API/UserController
حالا کدهای زیر را در آن وارد کنید:
<?php
namespace App\Http\Controllers\API;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use App\User;
use Validator;
class UserController extends Controller
{
/**
* Register api
*
* @return \Illuminate\Http\Response
*/
public function register(Request $request)
{
$validator = Validator::make($request->all(), [
'name' => 'required',
'email' => 'required|email',
'password' => 'required',
'c_password' => 'required|same:password',
]);
if ($validator->fails()) {
$response = [
'success' => false,
'data' => 'Validation Error.',
'message' => $validator->errors()
];
return response()->json($response, 404);
}
$input = $request->all();
$input['password'] = bcrypt($input['password']);
$user = User::create($input);
$success['token'] = $user->createToken('MyApp')->accessToken;
$success['name'] = $user->name;
$response = [
'success' => true,
'data' => $success,
'message' => 'User register successfully.'
];
return response()->json($response, 200);
}
/**
* Login api
*
* @return \Illuminate\Http\Response
*/
public function login()
{
if (Auth::attempt(['email' => request('email'), 'password' => request('password')])) {
$user = Auth::user();
$success['token'] = $user->createToken('MyApp')->accessToken;
return response()->json(['success' => $success], 200);
} else {
return response()->json(['error' => 'Unauthorised'], 401);
}
}
}
در این مرحله ما قصد داریم مسیرهای (Routes) API را ایجاد کنیم ، برای این منظور routes/api.php را باز کنید و کدهای زیر را در آن وارد کنید:
<?php
/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
Route::post('register', 'API\RegisterController@register');
Route::post('login', 'API\UserController@login');
Route::middleware('auth:api')->group( function () {
Route::resource('books', 'API\BookController');
});
کدنویسی مربوط به این بخش به پایان رسید ، با اجرای دستور زیر برنامه خود را اجرا کنید:
php artisan serve
در حال حاضر برنامه در حال اجرا می باشد ، ما باید API ها را با استفاده از Postman صدا بزنیم.ما باید این جزئیات هدر را پاس بدیم یا منتقل کنیم :
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer '.$accessToken,
]
برنامه postman را باز کنید و API ها را مانند زیر صدا بزنید.
توجه: من یک دامنه سفارشی برای این پروژه ایجاد کرده ام. لینک API شما باید مانند http://localhost: 8000/api/ باشد. اگر می خواهید مانند من از یک دامنه سفارشی استفاده کنید، این مقاله را بخوانید: نحوه اضافه کردن دامنه سفارشی و نصب SSL بر روی لوکال هاست
API مربوط به ثبت نام: Verb: POST ، URL: http://laravel_api.test/api/register
API مربوط به ورود: Verb: POST ، URL: http://laravel_api.test/api/login
API مربوط به افزودن کتاب: Verb: POST ، URL: http://laravel_api.test/api/books
API مربوط به گرفتن همه کتاب ها: Verb: GET ، URL: http://laravel_api.test/api/books
API مربوط به نمایش یک کتاب: Verb: GET ، URL: http://laravel_api.test/api/books/1
API مربوط به بروزرسانی یک کتاب: Verb: PUT ، URL: http://laravel_api.test/api/books/1
API مربوط به حذف یک کتاب: Verb: DELETE ، URL: http://laravel_api.test/api/books/1
امیدوارم این مقاله به شما کمک کرده باشد.
4 Comments
عالی بود
بسیار عالی و با کیفیت کامل توضیح داده شده بود
خیلی عالی بود، به من که خیلی کمک کرد
متشکرم !
مختصر و مفید بود 🙂