Merhaba arkadaşlar,
Geliştirdiğim bir projede işlevsel kodları controller içine değil de api içine yazmaya karar verdim. Şimdi gerekli olmasa da müşterinin sözlerinden anlaşıldığı üzere ileride api gerekecek. Bu nedenle tüm kodları taşıyorum.
Örnek olması açısından aşağıda 2 modeli, 2 api içeriğini ve rotalarını inceleyebilirsiniz. Şimdilik takıldığım bir yer yok ama doğru yoldan gitmek adına sizin bu gibi bir durumda hangi işlemleri yaptığınızı merak ediyorum. 2 tane sorum var.
1) Gördüğünüz gibi rotalar 2 model için de çok sade olarak tanımlı. Siz olsanız Resource yapısını kullanmadan ilişkisel verileri çekmek için hangi yöntemi kullanırdınız? Ben bir kullanıcıya ait ilanları listelemek için
/users/{user}/advertisements adında bir alt route olupturup
User modeli içinde bir method oluşturmayı veya içeride yönlendirme yaparak
/advertisements rotasına parametre ile veri göndermeyi düşünüyorum. Şimdilik karar vermedim.
2) Arayüzde kullanıcı bir ilan oluştururken veya yönetici panelde bir kullanıcı oluştururken formdan gelen bilgileri veritabanına kaydetmek için siz olsaydınız nasıl bir yol izlerdiniz ? Bu işlemleri eksiksiz yapan kodlar api tarafında olduğu için Frontend veya Backend tarafında bu işlemleri gerçekleştirmeden doğrudan api tarafına parametre ile bilgi mi gönderirdiniz yoksa aynı kodları kopyalayıp 2 tarafta da işlemleri gerçekleştirir miydiniz ?
Not: Api kodları bu kadar basit olarak kalmayacak. Sayfalama, form doğrulama, arama gibi işlemleri kod kalabalığı olmaması açısından eklemedim.
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
public function advertisements(){
return $this->hasMany(App\Models\Advertisement::class);
}
}
namespace App\Models;
class Advertisement extends Model
{
public function user(){
return $this->hasOne(App\Models\User::class);
}
}
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
class ApiController extends Controller
{
}
namespace App\Http\Controllers\Api;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class UserApi extends ApiController
{
public function login(Request $request)
{
$user = User::where('email', $request->email)->first();
if (Hash::check($request->password, $user->password)) {
$user->api_token = str_random(60);
$user->save();
return response()->json([
'status' => 200,
'api_token' => $user->api_token,
'username' => $user->name,
'email' => $user->email,
'id' => $user->id
]);
}
return response()->json([
'status' => 401,
'message' => 'Unauthenticated.'
]);
}
public function logout(Request $request)
{
$user = Auth::guard('api')->user();
if ($user) {
$user->api_token = null;
$user->save();
return response()->json([
'status' => 401,
'message' => 'User logged out.'
]);
}else{
return response()->json([
'status' => 401,
'message' => 'Unauthenticated.'
]);
}
}
public function me()
{
$user = Auth::guard('api')->user();
if (!$user) {
return response()->json([
'status' => 401,
'message' => 'Unauthenticated.'
]);
}
return $user;
}
public function index()
{
return User::all();
}
public function show(User $article)
{
return $article;
}
public function store(Request $request)
{
$article = User::create($request->all());
return response()->json($article, 201);
}
public function update(Request $request, User $article)
{
$article->update($request->all());
return response()->json($article, 200);
}
public function delete(User $article)
{
try {
$article->delete();
} catch (\Exception $e) {
return $e->getMessage();
}
return response()->json(null, 204);
}
}
namespace App\Http\Controllers\Api;
use App\Models\Advertisement;
use Illuminate\Http\Request;
class AdvertisementApi extends ApiController
{
public function index()
{
return Advertisement::all();
}
public function show(Advertisement $article)
{
return $article;
}
public function store(Request $request)
{
$article = Advertisement::create($request->all());
return response()->json($article, 201);
}
public function update(Request $request, Advertisement $article)
{
$article->update($request->all());
return response()->json($article, 200);
}
public function delete(Advertisement $article)
{
try {
$article->delete();
} catch (\Exception $e) {
return $e->getMessage();
}
return response()->json(null, 204);
}
}
Route::post('/login', 'Api\UserApi@login');
Route::post('/logout', 'Api\UserApi@logout');
Route::group(['middleware' => 'auth:api'], function () {
// User
Route::get('users/me', 'Api\UserApi@me');
Route::get('users', 'Api\UserApi@index');
Route::get('users/{user}', 'Api\UserApi@show');
Route::post('users', 'Api\UserApi@store');
Route::put('users/{user}', 'Api\UserApi@update');
Route::delete('users/{user}', 'Api\UserApi@delete');
// Advertisement
Route::get('advertisements', 'Api\AdvertisementApi@index');
Route::get('advertisements/{advertisement}', 'Api\AdvertisementApi@show');
Route::post('advertisements', 'Api\AdvertisementApi@store');
Route::put('advertisements/{advertisement}', 'Api\AdvertisementApi@update');
Route::delete('advertisements/{advertisement}', 'Api\AdvertisementApi@delete');
});
Şimdiden teşekkürler.