سلام
من با اضافه کردن دستورات زیر توی فایل 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 میاد. باید تنظیمات دیگه ای هم اعمال کنم؟
بخاطر وجود خط دوم رولهاست. کد متد say رو بگذارین تا بگم چه رولی اضافه کنید.
public function actionSay($message)
{
return $this->render('say', ['message' => $message]);
}
البته اون message یک مقدار پیش فرض هم داشت من برداشتم
این رول رو قبل از بقیه بگذارین:
'site/say/<message:.*>'=>'site/say',
با تشکر از آقای شهرکی الان کار میکنه اما باید برای هر اکشن بیاییم rule تعریف کنیم؟ یکم کارو سخت نکرده؟
خوب شما اسم پارامترتون فرق میکنه و id نیست. ازطرفی مقدارش هم عددی نیست. پس توی رول
<id:d+> صدق نمیکنه. برای همین باید رول جداگانه بنویسید. فرض کنید شما توی کنترلرهای مختلف، متدهای مختلفی دارین شبیه همین say که پارامتر ورودی اون، شامل حروف الفبای انگلیسی و اعداد و Space و کارکتر نقطه میشه و توی همه، این قاعده صدق میکنه و ازطرفی اسم پارامتر همه هم همین message هست. خوب در اینجا میتونید یک رول کلی به این شکل بنویسید:
'<controller:w+>/<action:w+>/<message:[ws.]+>' => '<controller>/<action>',
یعنی هرچقدر قواعد پارامترهای اکشنهای شما عمومی تر باشه، میتونید رولهای عمومی تری هم برای مدیریت و آدرس دهی اونها تعیین کنید و هرچقدر متفاوت باشن، طبیعتاً پیدا کردن RegEx که با همه صدق کنه مشکلتر میشه. این مسئله مربوط به طراحی ساختار اکشنها و کنترلرهای شما و پارامترهای اونهاست و چیزی نیست که Yii بخواد اون رو پیچیده یا ساده کنه.
برای اینکه کئوری استرینگ رو هم برداریم چیکار کنیم ؟؟؟ مثلا آدرس view?id=1 یا یجا دیگه آدرس index?slug=post-1 چطوری کنیم که اینجوری نشون بده: index/slug/post-1 , view/id/1 فکر کنم توی yii1 میشد ولی yii2 اینجور نیست !!!؟؟؟
توی هر دو میشه. برای تبدیل 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 برای شما خواهد شد.
مشکلی با نوشتن رول ها ندارم فقط میخواستم کاری کنم که کلا کئوری استرینگ توی صفحه نباشه یعنی برا هر کئوری استرینگ نیام یه رول بنویسم!!!
هرچقدر پارامترهای شما ساختار کلی تری داشته باشه، کارتون توی نوشت رولها راحتتره. مثلاً اگه توی تمام کنترلرهای شما، اکشن view یک پارامتر id از نوع عددی داشته باشه، میتونید اینطوری کار کنید:
'<controller>-<id:d+>' => '<controller>s/view'
اینکار باعث میشه مثلاً لینکی بصورت users/view?id=5 به user-5 تبدیل بشه. به همین ترتیب لینک products/view?id=23 تبدیل به product-23 خواهد شد.