Bağlantı ve Rota Kurma

1.7k görüntülenme Markdown

Adresler bir rota anahtarından üretilir, asla elle yazılmaz; çünkü her rota çevrilir ve panel dizini sabit değildir.

Genel Bakış

Rota anahtarı bir addır; ürettiği adres dile ve kuruluma bağlıdır. Sabit bir yol tek bir dilde çalışır, diğerlerinde 404 verir. Admin dizinini sabit yazan bir panel bağlantısı ise o dizini yeniden adlandırmış her kurulumda kırılır.

Dört statik metot bütün durumları karşılar; hepsi coremio/classes/LinkGenerator.php içindedir.

Referans

LinkGenerator
public static function admin($route = '', $params = [], $lang = '', $wqs = []): string|bool;
public static function client($route = '', $params = [], $lang = '');
public static function wQS(null|string|bool $url, string|array $params = []): string;
public static function convert_to_link(string $arg): string;
admin() Panel adresi. Dördüncü argümanı olan tek metot, yani sorgu dizesini kendi başına ekleyebilen tek metot da bu.
client() Site ya da müşteri paneli adresi. Üç argüman, sorgu dizesi yok; gerektiğinde sonucu wQS() ile sarın.
wQS() Var olan bir adrese sorgu dizesi ekler, ? ile & arasında kendisi seçim yapar. İkinci argüman pratikte dizi olmak zorundadır.
convert_to_link() pages/12 gibi saklanmış bir referansı tam adrese çözer. Bir menü öğesini ya da editör bağlantısını taşınabilir kılan budur. Sonuçlar istek ve dil başına bellekte tutulur.

Dört Argüman

SıraArgümanNe olmalı
1$routeRota tablosundan bir anahtar, yol değil. Bilinmeyen anahtar reddedilmez, olduğu gibi adresin içine yapıştırılır.
2$paramsSıralı yol parçaları. Her değer anahtarın desenindeki sıradaki (?) yerine geçer; artanlar sessizce düşer. Dizi olmayan bir değer tek elemanlı listeye sarılır.
3$lang'' hizmet edilen dili kullanır. tr gibi bir kod o dili zorlar, düz none değeri ise hiç dil parçası taşımayan bir adres üretir.
4$wqsİlişkisel dizi olarak sorgu dizesi; yalnız boş değilse uygulanır. Sadece admin() üzerinde vardır.

Rota Anahtarı Parça Sayısını Kendi Taşır

Yönlendirici parametre başına bir (?) doldurur ve durur. Deseninde yer tutucu olmayan bir anahtar geçtiğiniz her parametreyi yok sayar. Liste ile detay adresinin tek anahtar artı argüman değil, iki ayrı anahtar olmasının sebebi budur.

rota tablosu kayıtları ve ürettikleri
// coremio/locale/tr/admin-routes.php - anahtar => [adres deseni, controller rotası]
return ['admin-routes' => [
    'services'   => ['services',         'services'],
    'services-1' => ['services/(?)',     'services/(1)'],
    'services-2' => ['services/(?)/(?)', 'services/(1)/(2)'],
]];

// LinkGenerator::admin("services",   ["detail", 5])  ->  /services        iki değer de düştü
// LinkGenerator::admin("services-1", ["detail"])     ->  /services/detail
// LinkGenerator::admin("services-2", ["detail", 5])  ->  /services/detail/5
locale/{dil}/admin-routes.php Panel anahtarları. Dil başına bir dosya; böylece aynı anahtar her dilde farklı bir yol üretir.
locale/{dil}/website-routes.php Site ve müşteri paneli anahtarları, aynı biçim.

convert_to_link Neyi Kabul Eder

BiçimÖrnekŞuna çözülür
Site sayfası anahtarıhome, contact, basketO site rotasının aktif dildeki adresi.
Müşteri paneli anahtarıca-invoices, ca-domains, ca-ticketsO müşteri paneli rotası.
Kayıt referansıpages/12, products/48, kbase-page/7Kaydın detay adresi; çevrilmiş kısa adından bulunur.
Kategori referansıcategory/25Kategorinin kendi tipine göre katalog, makale, referans ya da bilgi bankası listesi.
Ürün grubuproduct-group/hostingO grubun katalog sayfası.
Başka her şeywhatever# dizesi; böylece bozuk referans hata değil ölü bağlantı olarak görünür.

Örnek

adres kurma
// Liste sayfası: parametre yok, sorgu dizesi yok.
$list = LinkGenerator::admin("services");

// Detay sayfası. Kayıt id'si sorgu dizesiyle gider, yani dördüncü argüman
// kullanılır ve üçüncüsü boş kalır.
$detail = LinkGenerator::admin("services-1", ["detail"], '', ['id' => $serviceId]);

// Aynı sayfa, belirli bir sekmede açılarak.
$tab = LinkGenerator::admin("services-1", ["detail"], '', ['id' => $serviceId, 'tab' => "invoices"]);

// Alternatif dil etiketi için tek bir dile zorlanmış site adresi.
$signIn = LinkGenerator::client("sign-in", [], "tr");

// client() sorgu dizesi argümanı taşımaz, bu yüzden sarılır.
$paged = LinkGenerator::wQS(LinkGenerator::client("services"), ['page' => 2]);

// Menü satırındaki saklı referans, render anında çözülür.
$href = LinkGenerator::convert_to_link($row["page"]);       // "pages/12" -> /hakkimizda
diğer taraf: adresin geri okunması
// Kaydın ikinci elemanı, adresin geri eşlendiği controller rotasıdır; kodun
// yolu değil anahtarı bilmesine izin verilmesinin sebebi budur:
//
//   'services-1' => ['services/(?)', 'services/(1)']
//                     ^ LinkGenerator     ^ yönlendirici okur ve
//                       yazar               services::page_detail() çağırır

class Services extends Controllers
{
    public function page_detail(): void
    {
        $id = (int) Filter::init("GET/id", "rnumbers");
        $this->addData("back", LinkGenerator::admin("services"));
    }
}

Tuzaklar

Sorgu dizesi dördüncü argümandır, üçüncüsü dildir

LinkGenerator::admin("services-1", ["detail"], ['id' => 5]) yazmak diziyi dil kodunun yerine koyar. Hiçbir şey fırlatılmaz. Bir Array to string conversion uyarısı ve /Array/{admin}/services/detail adresi alırsınız. Yol parçaları yine çözülür, göndermek istediğiniz id ise hiçbir yerde yoktur. Dil için '' geçin, sorgu dizesini dördüncü sırada tutun.

Bilinmeyen anahtar adresin kendisi olur

Yönlendirici, tabloda bulamadığı anahtarı olduğu gibi döndürür. Bir yazım hatası, hatanın yapıldığı yerde bir istisna değil, 404 veren makul görünüşlü bir adres üretir. Anahtar var ama yer tutucusu geçtiğiniz parametrelerden az olduğunda da aynısı olur; orada fazla değerler doğrudan yok olur.

Tip ne derse desin wQS dizi alır

İkinci argümanın bildirilen tipi string'e izin verir, ama değer http_build_query() fonksiyonuna gider. O da dizi ya da nesne olmayan her şeyi TypeError ile reddeder. Soru işaretini elle birleştirmeyin de: üretilen adres zaten parametre taşıyor olabilir ve ikinci bir soru işareti üretirsiniz.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.