رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
نحوه ست کردن پارامترها در حالت clean url
#1
سلام
من با اضافه کردن دستورات زیر توی فایل web.php و همچنین افزودن فایل htaccess آدرس های زیبا را فعال کردم:
'urlManager' => [
            'class' => 'yiiwebUrlManager',
            // Disable index.php
            'showScriptName' => false,
            // Disable r= routes
            'enablePrettyUrl' => true,
            'rules' => array(
                '<controller:w+>/<id:d+>' => '<controller>/view',
                '<controller:w+>/<action:w+>/<id:d+>' => '<controller>/<action>',
                '<controller:w+>/<action:w+>' => '<controller>/<action>',
            ),
        ],

طیق مثال داکیومنت وقتی آدرس http://localhost/basic/web/site/say رو میزنم مشکلی نداره و صفحه ویو با چاپ پیغام نشون داده میشه اما وقتی پارامتر رو به این صورت http://localhost/basic/web/site/say/hello میزنم ارور 404 میاد. باید تنظیمات دیگه ای هم اعمال کنم؟
موفقیت، نتیجه تشخیص درست است؛ تشخیص درست، نتیجه تجربه است؛ تجربه نیز اغلب نتیجه تشخیص نادرست است.



پاسخ
تشکر شده توسط:
#2
بخاطر وجود خط دوم رولهاست. کد متد say رو بگذارین تا بگم چه رولی اضافه کنید.
پاسخ
تشکر شده توسط:
#3
 public function actionSay($message)
    {
        return $this->render('say', ['message' => $message]);
    }
البته اون message یک مقدار پیش فرض هم داشت من برداشتم
موفقیت، نتیجه تشخیص درست است؛ تشخیص درست، نتیجه تجربه است؛ تجربه نیز اغلب نتیجه تشخیص نادرست است.



پاسخ
تشکر شده توسط:
#4
این رول رو قبل از بقیه بگذارین:
'site/say/<message:.*>'=>'site/say',
پاسخ
تشکر شده توسط:
#5
با تشکر از آقای شهرکی الان کار میکنه اما باید برای هر اکشن بیاییم rule تعریف کنیم؟ یکم کارو سخت نکرده؟
موفقیت، نتیجه تشخیص درست است؛ تشخیص درست، نتیجه تجربه است؛ تجربه نیز اغلب نتیجه تشخیص نادرست است.



پاسخ
تشکر شده توسط:
#6
خوب شما اسم پارامترتون فرق میکنه و id نیست. ازطرفی مقدارش هم عددی نیست. پس توی رول <id:d+> صدق نمیکنه. برای همین باید رول جداگانه بنویسید. فرض کنید شما توی کنترلرهای مختلف، متدهای مختلفی دارین شبیه همین say که پارامتر ورودی اون، شامل حروف الفبای انگلیسی و اعداد و Space و کارکتر نقطه میشه و توی همه، این قاعده صدق میکنه و ازطرفی اسم پارامتر همه هم همین message هست. خوب در اینجا میتونید یک رول کلی به این شکل بنویسید:
'<controller:w+>/<action:w+>/<message:[ws.]+>' => '<controller>/<action>',
یعنی هرچقدر قواعد پارامترهای اکشنهای شما عمومی تر باشه، میتونید رولهای عمومی تری هم برای مدیریت و آدرس دهی اونها تعیین کنید و هرچقدر متفاوت باشن، طبیعتاً پیدا کردن RegEx که با همه صدق کنه مشکلتر میشه. این مسئله مربوط به طراحی ساختار اکشنها و کنترلرهای شما و پارامترهای اونهاست و چیزی نیست که Yii بخواد اون رو پیچیده یا ساده کنه.
پاسخ
تشکر شده توسط: hamo
#7
برای اینکه کئوری استرینگ رو هم برداریم چیکار کنیم ؟؟؟ مثلا آدرس view?id=1 یا یجا دیگه آدرس index?slug=post-1 چطوری کنیم که اینجوری نشون بده: index/slug/post-1 , view/id/1 فکر کنم توی yii1 میشد ولی yii2 اینجور نیست !!!؟؟؟
پاسخ
تشکر شده توسط:
#8
توی هر دو میشه. برای تبدیل view?id=1 به view/id/1 تنظیمات پیشفرض urlManager کافیه و فقط باید فعالش کنید (از کامنت خارج کنید). برای تبدیل index?slug=post-1 به index/slug/post-1 هم کافیه چنین رولی بنویسید:
'site/index/slug/<slug:[w-]+>' => 'site/index',

کلاً اگه منطق RegEx توی urlManager رو درک کنید، تبدیل آدرسها یکی از ساده ترین کارها توی Yii برای شما خواهد شد.
پاسخ
تشکر شده توسط:
#9
مشکلی با نوشتن رول ها ندارم فقط میخواستم کاری کنم که کلا کئوری استرینگ توی صفحه نباشه یعنی برا هر کئوری استرینگ نیام یه رول بنویسم!!!
پاسخ
تشکر شده توسط:
#10
هرچقدر پارامترهای شما ساختار کلی تری داشته باشه، کارتون توی نوشت رولها راحتتره. مثلاً اگه توی تمام کنترلرهای شما، اکشن view یک پارامتر id از نوع عددی داشته باشه، میتونید اینطوری کار کنید:
'<controller>-<id:d+>' => '<controller>s/view'
اینکار باعث میشه مثلاً لینکی بصورت users/view?id=5 به user-5 تبدیل بشه. به همین ترتیب لینک products/view?id=23 تبدیل به product-23 خواهد شد.
پاسخ
تشکر شده توسط:




کاربران در حال بازدید این موضوع: 3 مهمان