کدهای اولیه قبل از اجرای کنترلر/اکشن درخواست شده کجا باید قرار بگیره؟

[font="Tahoma"]

[rtl]

سلام

اگر قرار باشه قبل از اجرای در خواست کاربر (منظورم اجرای کنترلر/اکشن موجود در URL هست) بخواهیم یه سری کارهای مقدماتی انجام بدیم. مثلا زبان سیستم رو اگر در URL قید شده، تنظیم کنیم و یا IP کاربر رو چک کنیم که آیا مجاز به ورود به سایت هست یا نه. این کارها رو کجا باید انجام بدیم؟

شما در پروژه هاتون چه می کنید؟ دوست دارم روش شما رو بدونم.

من سعی کردم از فایل protected\components\Controller.php و یا فایل index.php که bootstrap محسوب میشه استفاده کنم. اما مشکلاتی برام پیش اومد.

مثلا در فایل bootstrap یا همون index.php اگه قبل از خط

[/rtl]


Yii::createWebApplication($config)->run();

[rtl]

چیزی بنوسیم که خوب چون کانفیگ پیاده نشده پس مشکل داریم.

بعد از آن خط هم چیزی بنویسیم که میره بعد از اجرای همه کدها. پس عملا بی مصرف میشه چون می خوایم قبل از اجرای درخواست کاربر، کد ما اجرا بشه.

و بعد از اجرای این کدهای مقدماتی که توضیح دادم، ممکنه کاربر رو redirect کنیم به سمت کنترلر/اکشن مورد نظرش تا درخواستش اجرا بشه و شاید هم تصمیم بگیریم جلوی ورود کاربر و اجرای درخواستش رو بگیریم.

شرح بیشتر

در برخی فریم ورک ها مثل زندفریم‌ورک، ما بحث base controller رو داریم که توش میشه یه سری کارهای اولیه (قبل از اجرای درخواست اصلی کاربر) مثل کنترل کردن IP یا نام کاربری کاربر به جهت بررسی مجاز بودنش برای ورود به سایت رو انجام داد. زبان سیستم رو از URL خوند و سپس برای اجرای درخواست کاربر، عمل dispatch رو انجام داد تا کنترلر/اکشن مورد نظر کاربر اجرا بشه.

در کتاب Yii 1.1 application cookbook در صفحه 55 مثالی برای ایجاد base controller گفته. اما چندان مناسب نیست و فکر می کنم راه حل بهتر و ساده تری هم احتمالا باشه.

(مثال کتاب فوق آمده و کلاس Controller رو اوراید کرده)

[/rtl]

[/font]

[right][rtl][font="Tahoma"]

سلام

شاید بهتر باشه این چک کردن های قبل از اجرای درخواست به دو گروه کلی تر تقسیم کنیم.

گروه اول ویژگی هایی که بدون توجه به ماهیت و نوع درخواست، و هویت درخواست دهنده، برای همه و همیشه باید چک بشند. مثلا تعیین زبان یا همون بستن بعضی از آی پی ها.

گروه دوم محدودیت هایی که برای برخی کاربران، یا بعضی درخواست های خاص در یک کنترلر مشخص تعیین میکنیم. مثل بحث های سطوح دسترسی و اینکه چه کسی به چه کاری دسترسی داره

من روش خودم رو میگم، که البته فکر میکنم روش استاندار فریمورک هم باشه، اما اگر کسی از دوستان روش بهتری داشت خوشحال میشم یاد بگیرم.

برای دسته اول، همون تغییر دادن Controller اصلی برنامه راه منطقی ای هست، و اگر همه کنترلر ها به درستی از این کنترلر ارث بری کنند، کد مورد نظر شما همیشه و برای همه اجرا خواهد شد. یک نمونه از این تغییر رو تو پست دیگه تون که راجع به دو زبانه کردن برنامه بود با هم دیدیم.

برای دسته دوم، یکی از راه حل های پیش بینی شده در فریمورک filter ها هستند. شاید با این مفهوم آشنا باشید، اما خلاصه اش اینه که قطعه کد هایی هستند که قبل و بعد از اجرای هر اکشن اجرا میشند و میتونند تعیین کنند اون اکشن میتونه اجرا بشه یا نه. البته کاربردهای زیادی میتونند داشته باشند، مثلا از طریق اینها پرفورمنس اکشن رو محاسبه کنید، اما کلا همونطور که اسمشون هم نشون میده، امکان اجرای اکشن رو با توجه به درخواست و درخواست دهنده بررسی می کنند.

در آخر این رو هم بگم که این تقسیم بندی که کردم تا حدی برای ساده تر شدن مطلب بود، و با تکنیک های پیشرفته میشه همون کلاس اصلی کنترلر رو طوری تغییر داد که خیلی نیازهای جزیی رو هم یکجا پوشش بده. برای نمومه به کامنت های این صفحه دقت کنید که چطور با اورراید کردن تابع beforeAction در کلاس کنترلر، چک کردن دسترسی کاربران رو مدیریت کرده. شما هم میتونید از این تابع برای چک کردن آی پی های مجاز استفاده کنید.

[/font][/rtl][/right]