Merhaba arkadaşlar,
Udemy üzerinden Vue JS'i ve Laravel ile nasıl kullanacağımızı öğreten yabancı bir kurs tamamladım. Kafama takılan bir kaç soru hakkında size danışmak istedim.
Eğitmen routes/web.php içerisinde şöyle bir tanımlama yaptı;
Route::get('/{any?}', function () {
return view('welcome');
})->where('any', '^(?!api\/)[\/\w\.\,-]*');
Şimdi burada api/ hariç her şeyi kabul ederek welcome.blade'e gönderiyor. Oradan da Vue JS devralıyor. Vue Router'da tanımlı. Buraya kadar bir problem yok.
Örnek api route (routes/api.php);
Route::apiResource('bookables','Api\BookableController')->only(['index','show']);
Api\BookableController:
<?php
namespace App\Http\Controllers\Api;
use App\Bookable;
use App\Http\Controllers\Controller;
use App\Http\Resources\BookableIndexResource;
use App\Http\Resources\BookableShowResource;
use Illuminate\Http\Request;
class BookableController extends Controller
{
public function index(Request $request)
{
return BookableIndexResource::collection(Bookable::all());
}
public function show(Request $request, $id)
{
return new BookableShowResource(Bookable::findOrFail($id));
}
}
Şimdi burada her şey normal çalışıyor. Ancak ben gidip tarayıcımın URL'inde doğrudan api/bookables yazarak gitmeye çalışırsam çirkin bir şekilde bütün veriler JSON formatında browserda görüntüleniyor.
Aslında Vue Router ile rotalarımı tanımladığım alanda tüm rotaların sonunda şu şekilde bir 404'de ayarladım:
{
path:"*",
component: NotFound,
name: "notfound"
}
Ben istiyorum ki api/ ile bir GET isteği yapamasın tarayıcıdan. Onları zaten axios ile Vue template içerisinde ben gönderiyorum.
Aklıma ilk gelen çözüm şu oldu;
public function index(Request $request)
{
if ($request->isXmlHttpRequest()) {
return BookableIndexResource::collection(
Bookable::all()
);
} else {
return view('welcome');
}
}
Ama bu sefer Api Controllerım içinde her action için if tanımlaması yapmam gerekecek. Bunun farklı bir yolu var mıdır?
Biraz uzun oldu, kusura bakmayın.
Şimdiden teşekkürler 🙂