Yönlendirme

Varsayılan Yönlendirme Kuralları

webman'ın varsayılan yönlendirme kuralı http://127.0.0.1:8787/{denetleyici}/{hareket} olarak belirlenmiştir.

Varsayılan denetleyici app\controller\IndexController, varsayılan hareket ise index olarak tanımlanmıştır.

Örneğin erişim sağlayarak:

  • http://127.0.0.1:8787 adresi varsayılan olarak app\controller\IndexController sınıfının index metoduna erişecektir.
  • http://127.0.0.1:8787/foo adresi varsayılan olarak app\controller\FooController sınıfının index metoduna erişecektir.
  • http://127.0.0.1:8787/foo/test adresi varsayılan olarak app\controller\FooController sınıfının test metoduna erişecektir.
  • http://127.0.0.1:8787/admin/foo/test adresi varsayılan olarak app\admin\controller\FooController sınıfının test metoduna erişecektir (bkz. Çoklu Uygulamalar).

Ayrıca webman 1.4 sürümünden itibaren daha karmaşık varsayılan yönlendirme yapılarını desteklemektedir. Örneğin:

app
├── admin
│   └── v1
│       └── v2
│           └── v3
│               └── controller
│                   └── IndexController.php
└── controller
    ├── v1
    │   └── IndexController.php
    └── v2
        └── v3
            └── IndexController.php

Bir isteğin yönlendirmesini değiştirmek istediğinizde config/route.php yapılandırma dosyasını değiştirmeniz gerekmektedir.

Varsayılan yönlendirmeyi kapatmak istiyorsanız, config/route.php dosyasının sonuna aşağıdaki yapılandırmayı ekleyin:

Route::disableDefaultRoute();

Closure Yönlendirme

config/route.php dosyasına aşağıdaki yönlendirme kodunu ekleyin:

use support\Request;
Route::any('/test', function (Request $request) {
    return response('test');
});

Not
Closure fonksiyonları herhangi bir denetleyiciye ait olmadığı için, $request->app $request->controller $request->action tümü boş string olacaktır.

http://127.0.0.1:8787/test adresine erişildiğinde test dizesi döndürülecektir.

Not
Yönlendirme yolu / ile başlamalıdır. Örneğin:

use support\Request;
// Hatalı kullanım
Route::any('test', function (Request $request) {
    return response('test');
});

// Doğru kullanım
Route::any('/test', function (Request $request) {
    return response('test');
});

Sınıf Yönlendirme

config/route.php dosyasına aşağıdaki yönlendirme kodunu ekleyin:

Route::any('/testclass', [app\controller\IndexController::class, 'test']);

http://127.0.0.1:8787/testclass adresine erişildiğinde app\controller\IndexController sınıfının test metodunun dönüş değeri döndürülecektir.

Yönlendirme Parametreleri

Yönlendirmede parametre mevcutsa, {key} ile eşleştirilebilir ve eşleşme sonuçları ilgili denetleyici metodunun parametrelerine (ikinci parametreden başlayarak) aktarılacaktır. Örneğin:

// /user/123 /user/abc eşleştirir
Route::any('/user/{id}', [app\controller\UserController::class, 'get']);
namespace app\controller;
use support\Request;

class UserController
{
    public function get(Request $request, $id)
    {
        return response('Alınan parametre: '.$id);
    }
}

Diğer örnekler:

use support\Request;
// /user/123 eşleştirir, /user/abc eşleştirmez
Route::any('/user/{id:\d+}', function (Request $request, $id) {
    return response($id);
});

// /user/foobar eşleştirir, /user/foo/bar eşleştirmez
Route::any('/user/{name}', function (Request $request, $name) {
   return response($name);
});

// /user, /user/123 ve /user/abc'yi eşleştirir  [] isteğe bağlıdır
Route::any('/user[/{name}]', function (Request $request, $name = null) {
   return response($name ?? 'tom');
});

// /user/ ile başlayan herhangi bir isteği eşleştirir
Route::any('/user/[{path:.+}]', function (Request $request) {
    return $request->path();
});

// Tüm options isteklerini eşleştirir   : ile düzenli ifade belirtir.
Route::options('[{path:.+}]', function () {
    return response('');
});

Gelişmiş kullanım özetle:

[] sentaksı Webman yönlendirmelerinde isteğe bağlı yol parçalarını işlemek veya dinamik yönlendirmeleri eşleştirmek için kullanılır; bu sayede yönlendirme için daha karmaşık yol yapıları ve eşleştirme kuralları tanımlamanıza olanak tanır.

: ile düzenli ifade belirtilir.

Yönlendirme Grupları

Bazen yönlendirmelerde büyük miktarda aynı ön ek bulunur; bu durumda yönlendirme gruplarını kullanarak tanımı basitleştirebiliriz. Örneğin:

Route::group('/blog', function () {
   Route::any('/create', function (Request $request) {return response('create');});
   Route::any('/edit', function (Request $request) {return response('edit');});
   Route::any('/view/{id}', function (Request $request, $id) {return response("görünüm $id");});
});

Bu, aşağıdaki ile eşdeğerdir:

Route::any('/blog/create', function (Request $request) {return response('create');});
Route::any('/blog/edit', function (Request $request) {return response('edit');});
Route::any('/blog/view/{id}', function (Request $request, $id) {return response("görünüm $id");});

Gruplar iç içe kullanılabilir:

Route::group('/blog', function () {
   Route::group('/v1', function () {
      Route::any('/create', function (Request $request) {return response('create');});
      Route::any('/edit', function (Request $request) {return response('edit');});
      Route::any('/view/{id}', function (Request $request, $id) {return response("görünüm $id");});
   });  
});

Yönlendirme Ara Katmanları

Belirli bir yönlendirmeye veya bir grup yönlendirmeye ara katman ayarlayabiliriz. Örneğin:

Route::any('/admin', [app\admin\controller\IndexController::class, 'index'])->middleware([
    app\middleware\MiddlewareA::class,
    app\middleware\MiddlewareB::class,
]);

Route::group('/blog', function () {
   Route::any('/create', function () {return response('create');});
   Route::any('/edit', function () {return response('edit');});
   Route::any('/view/{id}', function ($request, $id) {response("görünüm $id");});
})->middleware([
    app\middleware\MiddlewareA::class,
    app\middleware\MiddlewareB::class,
]);
# Hatalı kullanım örneği (webman-framework >= 1.5.7'de bu kullanım geçerlidir)
Route::group('/blog', function () {
   Route::group('/v1', function () {
      Route::any('/create', function (Request $request) {return response('create');});
      Route::any('/edit', function (Request $request) {return response('edit');});
      Route::any('/view/{id}', function (Request $request, $id) {return response("görünüm $id");});
   });  
})->middleware([
    app\middleware\MiddlewareA::class,
    app\middleware\MiddlewareB::class,
]);
# Doğru kullanım örneği
Route::group('/blog', function () {
   Route::group('/v1', function () {
      Route::any('/create', function (Request $request) {return response('create');});
      Route::any('/edit', function (Request $request) {return response('edit');});
      Route::any('/view/{id}', function (Request $request, $id) {return response("görünüm $id");});
   })->middleware([
        app\middleware\MiddlewareA::class,
        app\middleware\MiddlewareB::class,
    ]);  
});

Kaynak Yönlendirmesi

Route::resource('/test', app\controller\IndexController::class);

// Belirli kaynak yönlendirmesi
Route::resource('/test', app\controller\IndexController::class, ['index','create']);

// Tanımsız kaynak yönlendirmesi
// Örneğin notify erişim adresi, hem any tipi yönlendirme /test/notify veya /test/notify/{id} olarak geçerdir. routeName test.notify'dir.
Route::resource('/test', app\controller\IndexController::class, ['index','create','notify']);
Fiil URI Eylem Yönlendirme Adı
GET /test index test.index
GET /test/create create test.create
POST /test store test.store
GET /test/{id} show test.show
GET /test/{id}/edit edit test.edit
PUT /test/{id} update test.update
DELETE /test/{id} destroy test.destroy
PUT /test/{id}/recovery recovery test.recovery

URL Oluşturma

Not
Gruplandırılmış gövde oluşturma URL'sini desteklememektedir.

Yönlendirme örneği:

Route::any('/blog/{id}', [app\controller\BlogController::class, 'view'])->name('blog.view');

Bu yönlendirme URL'sini oluşturmak için aşağıdaki gibi bir yöntem kullanabiliriz.

route('blog.view', ['id' => 100]); // Sonuç: /blog/100

Görünümlerde yönlendirme URL'lerini kullanırken bu yöntemi kullanabilirsiniz; böylece yönlendirme kuralları değişse bile URL otomatik olarak oluşturulacak ve yönlendirme adreslerinde meydana gelen değişikliklerin çok sayıda görünüm dosyasında güncellenmesini önlemiş olacaksınız.

Yönlendirme Bilgilerini Alma

$request->route nesnesi ile mevcut isteğin yönlendirme bilgilerini alabiliriz. Örneğin:

$route = $request->route; // $route = request()->route ile eşdeğerdir.
if ($route) {
    var_export($route->getPath());
    var_export($route->getMethods());
    var_export($route->getName());
    var_export($route->getMiddleware());
    var_export($route->getCallback());
    var_export($route->param());
}

Not
Mevcut isteğin config/route.php dosyasında yapılandırılmış herhangi bir yönlendirme ile eşleşmemesi durumunda, $request->route null olacaktır. Bu da demektir ki varsayılan yönlendirme kullanılırken $request->route null'dır.

404 Hatasını İşleme

Yönlendirme bulunamadığında varsayılan olarak 404 durum kodu döndürülür ve 404 ile ilgili içerik görüntülenir.

Geliştiricilerin yönlendirme bulunamadığında iş akışına katılmalarını sağlamak için webman'da sağlanan geri dönüş yönlendirmesini Route::fallback($callback) yöntemini kullanabilirsiniz. Örneğin, aşağıdaki kodda yönlendirme bulunamadığında kullanıcı anasayfaya yönlendirilir.

Route::fallback(function(){
    return redirect('/');
});

Başka bir örnekte, yönlendirme mevcut değilse JSON verisi döndürülür. Bu, webman API arayüzü olarak kullanıldığında oldukça kullanışlıdır.

Route::fallback(function(){
    return json(['code' => 404, 'msg' => '404 bulunamadı']);
});

404'e Ara Katman Ekleme

Varsayılan 404 isteği herhangi bir ara katmandan geçmez; eğer 404 isteklerine ara katman eklemek istiyorsanız, aşağıdaki kod örneğine başvurabilirsiniz.

Route::fallback(function(){
    return json(['code' => 404, 'msg' => '404 bulunamadı']);
})->middleware([
    app\middleware\MiddlewareA::class,
    app\middleware\MiddlewareB::class,
]);

İlgili bağlantılar Özel 404 500 Sayfası

Varsayılan Yönlendirmeyi Kapatma

// Ana proje varsayılan yönlendirmesini kapatın, uygulama eklentilerini etkilemez
Route::disableDefaultRoute();
// Ana projenin admin uygulamasının yönlendirmesini kapatın, uygulama eklentilerini etkilemez
Route::disableDefaultRoute('', 'admin');
// foo eklentisinin varsayılan yönlendirmesini kapatın, ana projeyi etkilemez
Route::disableDefaultRoute('foo');
// foo eklentisinin admin uygulamasının varsayılan yönlendirmesini kapatın, ana projeyi etkilemez
Route::disableDefaultRoute('foo', 'admin');
// [\app\controller\IndexController::class, 'index'] denetleyicisinin varsayılan yönlendirmesini kapatın
Route::disableDefaultRoute([\app\controller\IndexController::class, 'index']);

Anotasyon ile Varsayılan Yönlendirmeyi Kapatma

Belirli bir denetleyicinin varsayılan yönlendirmesini anotasyon ile kapatabiliriz. Örneğin:

namespace app\controller;
use support\annotation\DisableDefaultRoute;

#[DisableDefaultRoute]
class IndexController
{
    public function index()
    {
        return 'index';
    }
}

Aynı şekilde, belirli bir denetleyicinin varsayılan yönlendirmesini anotasyon ile kapatabiliriz. Örneğin:

namespace app\controller;
use support\annotation\DisableDefaultRoute;

class IndexController
{
    #[DisableDefaultRoute]
    public function index()
    {
        return 'index';
    }
}

Yönlendirme Arabirimi

// $uri'nin herhangi bir yöntem isteği için yönlendirmesini ayarlama
Route::any($uri, $callback);
// $uri'nin get isteği için yönlendirmesini ayarlama
Route::get($uri, $callback);
// $uri'nin post isteği için yönlendirmesini ayarlama
Route::post($uri, $callback);
// $uri'nin put isteği için yönlendirmesini ayarlama
Route::put($uri, $callback);
// $uri'nin patch isteği için yönlendirmesini ayarlama
Route::patch($uri, $callback);
// $uri'nin delete isteği için yönlendirmesini ayarlama
Route::delete($uri, $callback);
// $uri'nin head isteği için yönlendirmesini ayarlama
Route::head($uri, $callback);
// $uri'nin options isteği için yönlendirmesini ayarlama
Route::options($uri, $callback);
// Birden çok istek türü için yönlendirme ayarlama
Route::add(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'], $uri, $callback);
// Gruplandırılmış yönlendirme
Route::group($path, $callback);
// Kaynak yönlendirmesi
Route::resource($path, $callback, [$options]);
// Yönlendirmeyi devre dışı bırak
Route::disableDefaultRoute($plugin = '');
// Geri dönüş yönlendirmesi, varsayılan yönlendirmeyi ayarla
Route::fallback($callback, $plugin = '');
// Tüm yönlendirme bilgilerini alma
Route::getRoutes();

Eğer uri ile karşılık gelen bir yönlendirme yoksa (varsayılan yönlendirme dahil), ve geri dönüş yönlendirmesi de ayarlanmamışsa, 404 hatası döner.

Birden Fazla Yönlendirme Yapılandırma Dosyası

Yönlendirmeleri yönetmek için birden fazla yönlendirme yapılandırma dosyası kullanmak istiyorsanız, örneğin çoklu uygulamalarda her uygulamanın kendi yönlendirme yapılandırmasına sahip olması durumunda, require dış dosyayı yükleme yöntemi ile dış yönlendirme yapılandırma dosyalarını yükleyebilirsiniz. Örneğin config/route.php dosyasında:

<?php

// admin uygulaması altındaki yönlendirme yapılandırmasını yükle
require_once app_path('admin/config/route.php');
// api uygulaması altındaki yönlendirme yapılandırmasını yükle
require_once app_path('api/config/route.php');