Laravel Rotalarında Uzmanlaşma
Yayınlanan: 2022-12-12Arka uç söz konusu olduğunda, geliştiriciler sonunda rotalarla karşılaşır. Sunucunun aldığı her istek, istekleri denetleyicilere veya eylemlere eşleyen bir yönlendirme listesi aracılığıyla bir denetleyiciye yönlendirildiğinden, yollar arka ucun omurgası olarak kabul edilebilir.
Laravel bizim için birçok uygulama detayını gizler ve hem yeni hem de deneyimli geliştiricilerin web uygulamalarını geliştirmelerine yardımcı olmak için pek çok sözdizimsel şekerle birlikte gelir.
Laravel'de rotaların nasıl yönetileceğine yakından bakalım.
Laravel'de Arka Uç Yönlendirme ve Siteler Arası Komut Dosyası Çalıştırma
Bir sunucuda hem genel hem de özel yollar vardır. Genel yollar, sizi ve kullanıcılarınızı kötü niyetli aktörlere karşı savunmasız bırakabilecek bir tür enjeksiyon saldırısı olan siteler arası komut dosyası çalıştırma (XSS) olasılığı nedeniyle endişe kaynağı olabilir.
Sorun şu ki, bir kullanıcı oturum belirteci gerektirmeyen bir rotadan bunu gerektiren bir rotaya yönlendirilebilir ve yine de belirteç olmadan erişime sahip olur.
Bu sorunu çözmenin en basit yolu, bu senaryoyu hafifletmek için yola "yönlendiren" ekleyerek yeni bir HTTP başlığı uygulamaktır:
'main' => [ 'path' => '/main', 'referrer' => 'required,refresh-empty', 'target' => Controller\DashboardController::class . '::mainAction' ]
Laravel Temel Yönlendirme
Laravel'de yollar, kullanıcıların uygun isteği istenen denetleyiciye yönlendirmesine izin verir. En temel Laravel Rotası, bir Tekdüzen Varlık Tanımlayıcısını (rota yolunuz) ve hem işlev hem de sınıf olabilen bir kapanışı kabul eder.
Laravel'de rotalar web.php ve api.php dosyaları içinde oluşturulur. Laravel varsayılan olarak iki yolla gelir: biri WEB için ve diğeri API için.
Bu yollar, route/ klasöründe bulunur, ancak Providers/RouteServiceProvider.php dosyasına yüklenir.
Bunu yapmak yerine, route/ klasörünü tamamen atlayarak, rotaları doğrudan RouteServiceProvider.php içine yükleyebiliriz.
Yönlendirmeler
Bir rota tanımladığımızda, genellikle ona erişen kullanıcıyı yeniden yönlendirmek isteriz ve bunun nedenleri çok değişkendir. Bunun nedeni, kullanımdan kaldırılmış bir yol olması ve arka ucu veya sunucuyu değiştirmiş olmamız olabilir ya da iki faktörlü kimlik doğrulama (2FA) vb. yüklemek istiyor olmamız olabilir.
Laravel'in bunu yapmanın kolay bir yolu var. Çerçevenin basitliği sayesinde, giriş rotasını ve yönlendirilecek rotayı kabul eden Route cephesinde yönlendirme yöntemini kullanabiliriz.
İsteğe bağlı olarak üçüncü parametre olarak yönlendirme için durum kodunu verebiliriz. permanentRedirect
yöntemi, her zaman bir 301 durum kodu döndürmesi dışında, redirect
yöntemiyle aynı şeyi yapar:
// Simple redirect Route::redirect("/class", "/myClass"); // Redirect with custom status Route::redirect("/home", "/office", 305); // Route redirect with 301 status code Route::permanentRedirect("/home", "office");
Yönlendirme yollarının içinde “hedef” ve “durum” anahtar kelimelerini parametre olarak kullanmamız Laravel tarafından rezerve edildiğinden yasaklanmıştır.
// Illegal to use Route::redirect("/home", "/office/{status}");
Görüntüleme
Görünümler . Laravel uygulamamızın ön yüzünü oluşturmak için kullandığımız blade.php dosyaları. Blade şablon oluşturma motorunu kullanır ve yalnızca Laravel kullanarak tam yığın uygulama oluşturmanın varsayılan yoludur.
Rotamızın bir görünüm döndürmesini istiyorsak, yalnızca Rota cephesinde görüntüleme yöntemini kullanabiliriz. Görünüme iletilecek bir rota parametresini, bir görünüm adını ve isteğe bağlı bir değer dizisini kabul eder.
// When the user accesses my-domain.com/homepage // the homepage.blade.php file will be rendered Route::view("/homepage", "homepage");
Görüşümüzün, bu parametre ile isteğe bağlı bir dizi geçirerek “Merhaba {name}
” demek istediğini varsayalım. Bunu aşağıdaki kodla yapabiliriz (görünümde eksik parametre gerekliyse, istek başarısız olur ve bir hata atar):
Route::view('/homepage', 'homepage', ['name' => "Kinsta"]);
Rota Listesi
Uygulamanızın boyutu büyüdükçe, yönlendirilmesi gereken isteklerin sayısı da artacaktır. Ve büyük miktarda bilgi büyük bir kafa karışıklığına neden olabilir.
artisan route:list command
bize yardımcı olabileceği yer burasıdır. Uygulamada tanımlanan tüm yollara, bunların ara katmanlarına ve denetleyicilerine genel bir bakış sağlar.
php artisan route:list
Ara yazılımlar olmadan tüm yolların bir listesini görüntüler. Bunun için -v
bayrağını kullanmalıyız:
php artisan route:list -v
Rotalarınızın yollarında belirli adlara sahip olduğu etki alanına dayalı tasarım kullanıyor olabileceğiniz bir durumda, bu komutun filtreleme özelliklerinden şu şekilde yararlanabilirsiniz:
php artisan route:list –path=api/account
Bu, yalnızca api/account ile başlayan yolları gösterecektir.
Öte yandan, –except-vendor
veya –only-vendor
seçeneklerini kullanarak Laravel'e üçüncü taraf tanımlı rotaları hariç tutma veya dahil etme talimatı verebiliriz.
Rota Parametreleri
Bazen, bir kullanıcı kimliği veya jeton gibi, rota ile URI'nin segmentlerini yakalamanız gerekebilir. Bunu, her zaman kaşlı ayraçlar ( {}
) içinde yer alan ve yalnızca alfabetik karakterlerden oluşması gereken bir rota parametresi tanımlayarak yapabiliriz.
Rotalarımızın geri aramaları içinde bağımlılıkları varsa, Laravel hizmet kapsayıcısı bunları otomatik olarak enjekte eder:
use Illuminate\Http\Request; use Controllers/DashboardController; Route::post('/dashboard/{id}, function (Request $request, string $id) { return 'User:' . $id; } Route::get('/dashboard/{id}, DashboardController.php);
Gerekli Parametreler
Laravel'in gerekli parametreleri, arama yaparken atlamamıza izin verilmeyen rotalardaki parametrelerdir. Aksi takdirde, bir hata atılır:
Route::post("/gdpr/{userId}", GetGdprDataController.php");
Şimdi GetGdprDataController.php içinde $userId parametresine doğrudan erişimimiz olacak.
public function __invoke(int $userId) { // Use the userId that we received… }
Bir rota herhangi bir sayıda parametre alabilir. Listelendikleri sıraya göre rota geri aramalarına/denetleyicilerine enjekte edilirler:
// api.php Route::post('/gdpr/{userId}/{userName}/{userAge}', GetGdprDataController.php); // GetGdprDataController.php public function __invoke(int $userId, string $userName, int $userAge) { // Use the parameters… }
Opsiyonel Parametreler
Yalnızca bir parametrenin mevcut olduğu ve başka hiçbir şeyin olmadığı bir yol üzerinde bir şeyler yapmak istediğimiz bir durumda, tüm uygulamayı etkilemeden isteğe bağlı bir parametre ekleyebiliriz. Bu isteğe bağlı parametreler ?
onlara eklendi:
Route::get('/user/{age?}', function (int $age = null) { if (!$age) Log::info("User doesn't have age set"); else Log::info("User's age is " . $age); } Route::get('/user/{name?}', function (int $name = "John Doe") { Log::info("User's name is " . $name); }
Rota Joker Karakteri
Laravel, isteğe bağlı veya gerekli parametrelerimizin nasıl görünmesi gerektiğini filtrelememiz için bir yol sağlar.
Diyelim ki bir kullanıcı kimliği dizisi istiyoruz. Bunu where
yöntemini kullanarak rota düzeyinde bu şekilde doğrulayabiliriz.
where
yöntemi, parametrenin adını ve doğrulamada uygulanacak normal ifade kuralını kabul eder. Varsayılan olarak, ilk parametreyi alır, ancak çok sayıda varsa, anahtar olarak parametrenin adını ve değer olarak kuralı içeren bir diziyi iletebiliriz ve Laravel hepsini bizim için ayrıştırır:
Route::get('/user/{age}', function (int $age) { // }->where('age', '[0-9]+'); Route::get('/user/{age}', function (int $age) { // }->where('[0-9]+'); Route::get('/user/{age}/{name}', function (int $age, string $name) { // }->where(['age' => '[0-9]+', 'name' => '[az][Az]+');
Bunu bir adım öteye götürebilir ve Route
cephesinde pattern
yöntemini kullanarak uygulamamızdaki tüm rotalarda doğrulama uygulayabiliriz:
Route::pattern('id', '[0-9]+');
Bu, her id
parametresini bu regex ifadesiyle doğrulayacaktır. Ve onu tanımladığımızda, o parametre adını kullanan tüm rotalara otomatik olarak uygulanacaktır.
Gördüğümüz gibi, Laravel yolda ayırıcı olarak /
karakterini kullanıyor. Yolda kullanmak istiyorsak, bir where
regex kullanarak yer tutucumuzun bir parçası olmasına açıkça izin vermeliyiz.
Route::get('/find/{query}', function ($query) { // })->where('query', , '.*');
Tek dezavantajı, yalnızca son rota segmentinde desteklenecek olmasıdır.
Adlandırılmış Rotalar
Adından da anlaşılacağı gibi, rotaları adlandırabiliriz, bu da URL'ler oluşturmayı veya belirli rotalar için yönlendirmeyi kolaylaştırır.
Adlandırılmış Rotalar Nasıl Oluşturulur
Adlandırılmış bir rota oluşturmanın basit bir yolu, Route
cephesinde zincirlenen name
yöntemiyle sağlanır. Her rotanın adı benzersiz olmalıdır:
Route::get('/', function () { })->name("homepage");
Rota Grupları
Rota grupları, ara yazılımlar gibi rota özniteliklerini her rotada yeniden tanımlamaya gerek kalmadan çok sayıda rotada paylaşmanıza olanak tanır.
Ara yazılım
Sahip olduğumuz tüm rotalara bir ara katman yazılımı atamak, önce group
yöntemini kullanarak bunları bir grupta birleştirmemize olanak tanır. Göz önünde bulundurulması gereken bir nokta, ara yazılımların gruba uygulandıkları sırayla yürütülmesidir:
Route:middleware(['AuthMiddleware', 'SessionMiddleware'])->group(function () { Route::get('/', function() {} ); Route::post('/upload-picture', function () {} ); });
Kontrolörler
Bir grup aynı denetleyiciyi kullandığında, o grup içindeki tüm rotalar için ortak denetleyiciyi tanımlamak üzere controller
yöntemini kullanabiliriz. Şimdi rotanın çağıracağı metodu belirtmeliyiz.
Route::controller(UserController::class)->group(function () { Route::get('/orders/{userId}', 'getOrders'); Route::post('/order/{id}', 'postOrder'); });
Alt alan yönlendirme
Alt alan adı, bir web sitesinin alan adının başına eklenen bir ek bilgi parçasıdır. Bu, web sitelerinin çevrimiçi mağazalar, bloglar, sunumlar vb. gibi belirli işlevler için içeriklerini web sitesinin geri kalanından ayırmasına ve düzenlemesine olanak tanır.
Rotalarımız, alt alan yönlendirmesini işlemek için kullanılabilir. Domaini ve subdomain'in bir kısmını controller ve route'umuzda kullanmak için yakalayabiliriz. Route
cephesinde bulunan domain
metodu yardımıyla rotalarımızı tek bir domain altında toplayabiliriz:
Route::domain('{store}.enterprise.com')->group(function() { Route::get('order/{id}', function (Account $account, string $id) { // Your Code } });
Önekler ve İsim Önekleri
Ne zaman bir rota grubumuz olsa, onları tek tek değiştirmek yerine, Laravel'in sağladığı, Route
cephesinde prefix
ve name
gibi ekstra yardımcı programlardan faydalanabiliriz.
prefix
yöntemi, gruptaki her rotayı belirli bir URI ile öneklemek için kullanılabilir ve name
yöntemi, her rota adını belirli bir dizeyle öneklemek için kullanılabilir.
Bu, onları tanımlamak için her bir adı veya ön eki değiştirmemize gerek kalmadan yönetici rotaları gibi yeni şeyler oluşturmamıza olanak tanır:
Route::name('admin.")->group(function() { Route::prefix("admin")->group(function() { Route::get('/get')->name('get'); Route::put('/put')->name(put'); Route::post('/post')->name('post'); }); });
Artık bu yollar için URI'ler admin/get
, admin/put
, admin/post
ve admin.get
, admin.put
ve admin.post
adları olacaktır.
Rota Önbelleğe Alma
Uygulamayı üretim sunucularına dağıtırken, iyi bir Laravel geliştiricisi Laravel'in rota önbelleğinden yararlanacaktır.
Rota Önbelleğe Alma Nedir?
Rotayı önbelleğe alma, tüm uygulama rotalarını kaydetmek için gereken süreyi azaltır.
php artisan route:cache
çalıştırıldığında bir Illuminate/Routing/RouteCollection
örneği oluşturulur ve kodlandıktan sonra seri hale getirilmiş çıktı bootstrap/cache.routes.php
konumuna yazılır.
Şimdi, varsa başka herhangi bir istek bu önbellek dosyasını yükleyecektir. Bu nedenle, uygulamamızın artık yönlendirme dosyasındaki girdileri Illuminate/Routing/ Illuminate/Routing/RouteCollection
Illuminate/Routing/Route
nesnelerine ayrıştırması ve dönüştürmesi gerekmez.
Rota Önbelleğini Kullanmak Neden Önemli?
Laravel'in sağladığı rota önbelleğe alma özelliğini kullanmadığınızda, uygulamanız olabileceğinden daha yavaş çalışma riskiyle karşı karşıya kalır ve bu da satışları, kullanıcıyı elde tutmayı ve markanıza olan güveni azaltabilir.
Projenizin ölçeğine ve kaç yol olduğuna bağlı olarak, basit bir rota önbelleğe alma komutu çalıştırmak, uygulamanızı %130 ila %500 arasında hızlandırabilir; bu, neredeyse hiç çaba harcamadan büyük bir kazanç sağlar.
Özet
Yönlendirme, arka uç geliştirmenin bel kemiğidir. Laravel çerçevesi, rotaları tanımlamanın ve yönetmenin ayrıntılı bir yolunu sağlayarak bu konuda üstündür.
Geliştirme gerçekten de herkes için erişilebilir olabilir ve yalnızca Laravel'de oluşturulmuş olması sayesinde bir uygulamayı hızlandırmaya yardımcı olabilir.
Laravel yolları ile ilgili başka hangi püf noktaları ve ipuçlarıyla karşılaştınız? Yorumlar bölümünde bize bildirin!