Tutorial ini melanjutkan project dari tutorial sebelum nya dengan nama ‘PHP Lumen
Authorization. Pada tutorial ini kita akan menambahkan fitur relationship antara model (tabel).
Tujuan praktek ini adalah untuk:
1. Memahami konsep relationship
2. Mampu implementasi fitur relationship
Prasyarat
Harus menyelesaikan dulu modul dengan judul ‘PHP Lumen Authorization’.
Endpoint Untuk Public User
Untuk public user bisa melakukan Read All dan Read Detail. Untuk mengakomodir kebutuhan
ini kita akan membuat routes dan controller baru.
Method : GET
Endpoint : /pubic/posts
File: app/Http/Controllers/PublicController/PostsController.php
Method : GET
Endpoint : /public/post/{postID}
File: app/Http/Controllers/PublicController/PostsController.php
Menambahkan Fungsi Public Read
Untuk menambahkan fungsi public read all, mari kita ikuti langkah-langkah berikut ini:
1. Buka file routes/web.php, tambahkan code dibawah ini:
2. Buat file controller baru dengan nama
app/Http/Controllers/PublicController/PostsController.php, kemudian tambahkan code
dibawah ini:
Selanjutnya tambahkan Login terlebih dahulu dan tambahkan comment ada salah satu postnya :
Authorization. Pada tutorial ini kita akan menambahkan fitur relationship antara model (tabel).
Tujuan praktek ini adalah untuk:
1. Memahami konsep relationship
2. Mampu implementasi fitur relationship
Prasyarat
Harus menyelesaikan dulu modul dengan judul ‘PHP Lumen Authorization’.
Endpoint Untuk Public User
Untuk public user bisa melakukan Read All dan Read Detail. Untuk mengakomodir kebutuhan
ini kita akan membuat routes dan controller baru.
Method : GET
Endpoint : /pubic/posts
File: app/Http/Controllers/PublicController/PostsController.php
Method : GET
Endpoint : /public/post/{postID}
File: app/Http/Controllers/PublicController/PostsController.php
Menambahkan Fungsi Public Read
Untuk menambahkan fungsi public read all, mari kita ikuti langkah-langkah berikut ini:
1. Buka file routes/web.php, tambahkan code dibawah ini:
$router->get('/public/posts', 'PublicController\PostController@index');
$router->get('/public/post/{id}', 'PublicController\PostController@show');
2. Buat file controller baru dengan nama
app/Http/Controllers/PublicController/PostsController.php, kemudian tambahkan code
dibawah ini:
<?php
namespace App\Http\Controllers\PublicController;
use App\Models\Post;
use App\Http\Controllers\Controller;
class PostController extends Controller
{
public function index()
{
$post = Post::with('user')->OrderBy("id", "DESC")->paginate(10)->toArray();
if (!$post) {
\abort(404);
}
$output = [
"total_count"=>$post["total"],
"limit"=>$post["per_page"],
"pagination"=>[
"next_page"=>$post["next_page_url"],
"current_page"=>$post["current_page"]
],
"data"=>$post["data"]
];
return response()->json($output, 200);
}
public function show($id)
{
$post = Post::with(['user'=>function ($q) {
$q->select('id','name');
}])->find($id);
if (!$post) {
\abort(404);
}
return response()->json($post, 200);
}
}
3. Buka file app/Models/Post.php, tambahkan code dibawah ini sebelum penutup Class:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
protected $table ='posts';
protected $fillable = array('title','content','status','user_id');
public function user()
{
return $this->belongsTo(User::class);
}
}
4. Buka file app/Models/User.php, tambahkan code dibawah ini sebelum penutup Class:
public function posts()
{
return $this->hasMany(Post::class);
}
5. Buka url http://localhost:8000/public/posts?page=1 di postman:
6. Buka url http://localhost:8000/public/post/{ID} di postman:
Tantangan
Untuk menambah keahlian kita, mari kita ikuti tantangan dibawah ini:
1. Implementasi fitur comment
2. User bisa memberikan komentar pada salah satu post
3. Jadi perlu menyediakan minimal 2 endpoint:
- Endpoint untuk create comment
- Endpoint untuk get comment based on post. List komentar nya harus
mengandung object user
4. Gunakan konsep relationship
1. Buat migrasi / tabel baru dengan nama comments
Langkahnya : php artisan make:migration create_comments_table
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateCommentsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->increments('id');
$table->integer('post_id')->unsigned()->foreign('post_id')->references('id')->on('posts')->onDelete('cascade')->onUpdate('cascade');
$table->integer('user_id')->unsigned()->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
$table->string('comment')->nullable();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('comments');
}
}
Lalu buat modelnya :
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'post_id', 'comment','user_id',
];
public function posts()
{
return $this->belongsTo(Post::class);
}
public function user()
{
return $this->belongsTo(User::class);
}
}
Buat CommentController untuk membuat comment, list comment dan comment by id:
<?php
namespace App\Http\Controllers;
use App\Models\Comment;
use Illuminate\Support\Facades\Auth;
use Laravel\Lumen\Routing\Controller;
use Illuminate\Http\Request;
class CommentController extends Controller
{
public function index()
{
$comment = Comment::OrderBy("id", "DESC")->paginate(10)->toArray();
if (!$comment) {
\abort(404);
}
$output = [
"total_count"=>$comment["total"],
"limit"=>$comment["per_page"],
"pagination"=>[
"next_page"=>$comment["next_page_url"],
"current_page"=>$comment["current_page"]
],
"data"=>$comment["data"]
];
return response()->json($output, 200);
}
public function show($id)
{
$comment = Comment::find($id);
if (!$comment) {
\abort(404);
}
return response()->json($comment, 200);
}
public function store(Request $request)
{
$input = $request->all();
$comment = Comment::create([
"post_id"=>$input['post_id'],
"user_id"=>Auth::user()->id,
"comment"=>$input['comment']
]);
return response()->json($comment, 200);
}
}
Lalu pada public controller rubah PostController menjadi seperti dibawah :
<?php
namespace App\Http\Controllers\PublicController;
use App\Models\Post;
use App\Http\Controllers\Controller;
class PostController extends Controller
{
public function index()
{
$post = Post::with(['comment'=>function ($q) {
$q->with(['user']);
}])->OrderBy("id", "DESC")->paginate(10)->toArray();
if (!$post) {
\abort(404);
}
$output = [
"total_count"=>$post["total"],
"limit"=>$post["per_page"],
"pagination"=>[
"next_page"=>$post["next_page_url"],
"current_page"=>$post["current_page"]
],
"data"=>$post["data"]
];
return response()->json($output, 200);
}
public function show($id)
{
$post = Post::with(['comment'=>function ($q) {
$q->with(['user']);
}])->find($id);
if (!$post) {
\abort(404);
}
return response()->json($post, 200);
}
}
Tambahkan juga relasi di model post nya dengan model comment :
public function comment()
{
return $this->hasMany(Comment::class);
}
Tambahkan di route nya untuk CommentController dan PublicController post nya :
Route::group(['middleware'=>['auth']], function ($router) {
$router->get('/posts', 'PostController@index');
$router->post('/post', 'PostController@store');
$router->get('/post/{id}', 'PostController@show');
$router->put('/post/{id}', 'PostController@update');
$router->delete('/post/{id}', 'PostController@delete');
$router->get('/comments', 'CommentController@index');
$router->get('/comment/{id}', 'CommentController@show');
$router->post('/comment', 'CommentController@store');
});
$router->get('/public/posts', 'PublicController\PostController@index');
$router->get('/public/post/{id}', 'PublicController\PostController@show');
Selanjutnya tambahkan Login terlebih dahulu dan tambahkan comment ada salah satu postnya :
Dan check juga endpoint Pubic PostController
Akan muncul response comment nya.
Sekinan tutorial ini semoga bermanfaat.
Labels:
PHP
0 Komentar untuk "Membuat Service PHP Menggunakan Lumen Framework Part 7 Resource Relationship"