Yii da URL lar bilan ishlash

Salom. Mana yana Yii haqida. Bu safar URL lar bilan ishlashni ko'ramiz. Agar kimda-kim Apache da rewrite moduli bilan ishlagan bo'lsa demak Yii dagi huddi shunaqa maqsadda ishlatiladigan komponentasini osonroq tushunadi. Maqolani o'qishdan oldin RegExep (Regular Expression) haqida ozgina bo'lsada ma'lumot bo'lishi lozim.

Agar Yii haqidagi oldingi maqolalarni o'qigan bo'lsangiz, sizda sayt2 nomli (sayt deb nomlaymiz) host bo'lishi kerak (local serveringizda). Yana shundan foydalanamiz.

Keling avvalo Yii da URL larga oid 3 ta tushunchani ko'rib chiqsak.

1. module.id — client so'roviga mos keladigan modulni nomini saqlaydi. Agar NULL bo'lsa asosiy (protected/controllers dagilar) qo'llaniladi
2. controller.id — bu klass (sinf) nomi bo'lib, application (protected/controllers) yoki module/controllers dagi ishlatilishi kerak bo'lgan nomni saqlaydi
3. action.id — bu klient so'roviga mos holda controller dagi action nomini saqlaydi.

Misol uchun: Agar siz sayt/index.php?r=site/index deb kirsangiz, demak Yii r dagi o'zgaruvchini quyidagicha qayta ishlaydi: module.id = NULL, controller.id = site, action.id = index. Bulardan kelib chiqib: protected/SiteController.php dagi actionIndex metodi chaqiriladi.

Agar sayt/index.php?r=admin/users/add ga kirsangiz: module.id = admin, controller.id = users, action.id = add. Bunda Admin moduledagi prodtected/modules/admin/controllers/UsersControllers dagi actionAdd metodi chaqiriladi.

E'tibor bergan bo'lsangiz, [UrlO'zgaruvchisi]Controller va action[UrlO'zgaruvchisi] ya'ni client so'rovidan kelib chiqib Controller va action o'zgalari avtomat ravishda qo'shiladi. Bu havfsizlik jihatidan qilingan.

Endi keling site/index ni o'rniga bosh/sahifa qilganda SiteController/actionIndex ochiladigan qilamiz. Buning uchun protected/config/main.php ga

'components'=>array(
        ...
        'urlManager'=>array(
                'urlFormat'=>'get',
                'routeVar' => 'r',
                'showScriptName' => true,
                'rules'=>array(
                )
        )
        ...
)

ni qo'shamiz. Bundan
routeVar — index.php?r=site/index o'zgaruvchisi, agar bu o'zgaruvchini o'zgartirsangiz: misol uchun 'routeVar' => 'q' qilsangiz, endi index.php?q=site/index ko'rinishiga o'tadi.

urlFormat — by get yoki path ko'rinishida bo'ladi. get bo'lgan holatini ko'rdingiz. Endi buni 'urlFormat' => 'path' qilib o'zgartiring. Shunda index.php?r=site/index => index.php/site/index holatiga o'tadi. Bu holatda 'routeVar' o'zgaruvchisining qiymati hech qanday ahamiyatga ega bo'lmaydi.

showScriptName — bu index.php faylini ko'rsatish yoki ko'rsatmaslikni aniqlaydi. Agar FALSE qiymatini bersangiz:

1. urlFormat='get' bo'lganda: sayt/index.php?r=site/index => sayt/?r=site/index
2. urlFormat='path' bo'lganda: sayt/index.php/site/index => sayt/site/index

Ikkinchi holatda index.php fayli yoniga .htaccess fayl yaratib (agar Apache bo'lsa, nginx bo'lsa boshqacharoq bo'ladi) uning ichiga quyidagini yozing

<IfModule mod_rewrite.c>
        Options +FollowSymlinks
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule . index.php [L]
</IfModule>

Agar ishlamasa demak apacheda mod_rewrite qo'shilmagan.

Biz hozir faqat r o'zgaruvchisi bilan ishladik ($_GET['r']). Agar men SiteController/actionIndex ga qandaydir o'zgaruvchi bermoqchi bo'lsamchi? Ya'ni index.php?r=site/index&n1=5&n2=7. Bularni qanday chaqirib olaman. Oddiygina qiganda: $_GET['n1'], $_GET['n2'], yoki Yii::app()->request->getParam('n1') ko'rinishida olsangiz bo'ladi. Lekin bulardanda osonrog'i:

public function actionIndex($n1, $n2 = 0) {
    ...
}

ko'rinishida yozishdir. Bu holatda actionIndex n1 chaqirish uchun n1 qiymati har doim kiritilishi kerak. n2 kiritilmasayam bo'ladi. Ya'ni

index.php?r=site/index — ishlamaydi
index.php?r=site/index&n1=5 — ishlaydi (n1 = 5, n2 = 0)
index.php?r=site/index&n1=5&n2=7 — ishlaydi (n1 = 5, n2 = 7)

Agar shu holatda 'urlFormat'=>'path' qilsangiz. index.php/site/index/n1/5/n2=7 ko'rinishida bo'ladi.

Endi eng asosiysi.
rules — bu array ko'rinishidagi o'zgaruvchi bo'lib KEY => VALUE ko'rinishida qiymat qabul qiladi.
KEY — bu klient tomonidan berilgan so'rovni tekshiradigan qator
VALUE — bu klient so'roviga mos kelgan module/controller/action ni ko'rsatuvchi qator

Bundan buyon:

'urlFormat'=>'path',
'routeVar' => 'r',
'showScriptName' => false

ko'rinishida ishlaymiz. Ha yana SiteController/actionIndex dagi n1, n2 larni olib tashlash esdan chiqmasin :).

Quyidagi rules larni keltiraman.

//http://sayt/bosh/sahifa => SiteController/actionIndex chaqiriladi
'bosh/sahifa' => 'site/index'
//URL ga kengaytma qo'shish, ya'ni http://sayt/users/add.html => UsersController/actionAdd
'users/add.html' => 'users/add',
//tepadagini barcha controller/action lar uchun qilsak
'<controller>/<action>.html' => '<controller>/<action>',
//URL ni site_index.php ko'rinishiga o'tkazish, users_add.php 
'<controller>_<action>.php' => '<controller>/<action>',
//http://sayt/users/update?id=7 ni http://sayt/users_update_id.do ko'rinishiga o'tkazish
//umuman ID o'zgaruvchisini yashirish
'<controller>_<action>_<id:d+>.do' => "<controller>/<action>",
//endi module lar uchun
'admin/yuzer/kush' => 'admin/users/add',
//umuman tepadagi barcha holatlar o'rinli bo'ladi
//faqat boshiga yana bitta o'zgaruvchi qo'shiladi
'<module>/<controller>/<action>' => '<module>/<controller>/<action>',
//ID ni olib tashlash
'<module>/<controller>/<action>_<id:d+>' => '<module>/<controller>/<action>'

Hozirchaga shular yetarli. Bu yerda yana ancha imkoniyatlar mavjud. Vaqti kelib ko'ramiz.
Bu yerda keltirilgan rule lar ketma-ketligi bo'yicha tekshiriladi agar qaysi biriga to'g'ri kelsa shu bajariladi.

Misol uchun: sayt/users_update_5.do deb browserga tersangiz, Yii users_update_5.do ni oladi va rules dagi massivga solishtirib chiqadi. Qaysi biriga mos kelsa, shu yerda to'xtaydi.

Bizni holatda <controller>_<action>_<id:d+>.do ga to'g'ri keladi. Bunda <controller> = users, <action> = update, <id> = 5.

Endi <id:d+> kelsak, umuman <[o'zgaruvchi nomi]:[regex qator]>. Bizni holatda users_update_5.do ning o'rnida users_update_5a.do kelganida bu shart bajarilmasdi. Chunki regex da d+ faqat sonlar deganini anglatadi. Browserda esa 5a kelyapti. Bu son emas. Ya'ni O'zingizga kerakli so'rovni filtr qilish imkoniyatini ham beradi.

ELATMA: Siz filtrlab tekshirdim deb actionIndex ichida ID ni son ekanligini tekshirmasdan qoldirmang. Chunki users_update_5.do so'rovni yana, sayt/index.php?r=users/update&id=5a ko'rinishida chaqirish mumkin. Buni .htaccess orqali yopib qo'ysangiz ham bo'ladi.

Endi sayt ichida URL yaratishga kelsak. Buning uchun Yii da createUrl funksiyasi ishlatiladi.

Agar siz $this->createUrl(«users/update», array(«id» => 5)) qilsangiz, endi bu qiymatlar VALUE ustuni bo'yicha solishtirilib, KEY ga mos holda qaytariladi. Ya'ni users_update_5.do.

Shunga o'xshash qolganlari ham shunaqa bo'ladi.

Ozgina bo'lsada yorita oldim deb o'ylayman, agar tushunmovchiliklar bo'lsa savollarni kutib qolamiz.

Manba:


JONNY

Muallif haqida

JONNY Arduino, Java, C#, Android, Windows, Linux, Debian, Javascript.


Blogdagi so‘nggi maqolalar:


Fikrlar 2

Zohidbek90
Zohidbek90
Assalom aleykum men yaqinda yii2 framework bilan ishlashni boshladim sizdan shuni so'ramoqchi edim bazada menyu yaratgan edim va bosh sahifaga chiqara olmayapman admin panel ham qilgan edim agar bilsangiz menga yordam berib yuborsangiz oldindan rahmat
Zohidbek90
Zohidbek90
Assalom aleykum men bazagi menyuni frontendga olib kelmoqchiman agar yordam bersangiz исходник yuborsangiz e-mail tzohidbek@bk.ru
Iltimos, fikr bildirish uchun saytga kiring yoki ro‘yxatdan o‘ting!