سلام به دوستان مواردی تو کتاب بود که برام خیلی گنگ بودن میخواستم اونها رو بپرسم.
اول اینکه این فیلتر یعنی چی و به چه درد میخوره؟ جایی که گفته شده اگه + باشه برای اون اعمال میشه در غیر اینصورت نمیشه یعنی چی؟ مگه مثل توابع نیست که ما برای یه عمل خاص تعریف میکنیم؟ لازم باشه استفاده میکنیم نباشه نه.
فیلترها خودشون اجرا میشن، که اجرای اونها میتونه قبل یا بعد از اکشن باشه.
به عنوان مثال بررسی صطح دسترسی کاربر باید قبل از هر اکشن انجام بشه ، اما اکشن ورود نباید شامل این فیلتر بشه تا کاربر بتونه وارد سیستم بشه[/font][/size]
فیلتر رو میشه توابعی در نظر گرفت که به طور خودکار قبل و بعد از اجرای هر اکشن، فراخوانی میشه. یک ویژگی مهم فیلتر ها این هست که وقتی قبل از اجرای اکشن فراخوانی میشن، اگر در خروجی خودشون false برگردونند، مانع از اجرای اکشن خواهند شد
با استفاده از این قابلیت هست که میشه مثلا منطق و توابع مربوط به سطح دسترسی ها رو در فیلتر ها تعریف کرد، و قبل از اجرای هر اکشن بررسی های لازم صورت میگیره و تصمیم صحیح گرفته میشه
اما میشه استفاده های دیگری هم ار فیلتر ها کرد، به طور نمونه میشه یک معیار کارایی ابتدایی پیاده کرد، به طوری که قبل از اجرای اکشن زمان رو ذخیره کنید و با زمان بعد از اجرا مقایسه کنید و مدت زمان اجرای اکشن رو به دست بیارید
در رابطه با علامت + هم، همونطور که دوستمون هم اشاره کردند، شما میتونید تعیین کنید که هر فیلتر برای کدام یک از اکشن ها لحاظ بشه. در حالت پیش فرض هر فیلتر خاص روی همه اکشن های کنترلر اعمال میشه، مگر اینکه به طور مشخص بگید برای کدام اکشن ها اجرا بشه
مثلا در نمونه زیر، هر دو فیلتر فقط بر روی اکشن view اعمال میشند و فیلتری روی بقیه اکشن ها تعریف نشده:
[/font][/rtl][/right]
public function filters()
{
return array(
array('ext.seo.components.SeoFilter + view'), // apply the filter to the view-action
array('application.filters.PerformanceFilter + view'),
);
}
[right][rtl][font="Tahoma"]
در آخر کد مربوط به اون فیلتر کارایی که مثال زدم رو میگذارم تا یک ایده کلی از قضیه بدست بیاد
میبینید که پیچیدگی خاصی وجود نداره و فقط کدی که میخوایم قبل و یا بعد از اکشن اجرا بشه رو در ساختار تعریف شده قرار میدیم
[/font][/rtl][/right]
class PerformanceFilter extends CFilter
{
protected $time_start;
protected function preFilter($filterChain)
{
// logic being applied before the action is executed
$this->time_start = microtime(true);
return true; // false if the action should not be executed
}
protected function postFilter($filterChain)
{
// logic being applied after the action is executed
$tf = microtime(true) - $this->time_start;
$tf = round($tf,4);
echo '<div style="direction:ltr"> done in ' . $tf . ' seconds </div>' ;
}
}
[right][rtl][font="Tahoma"]
راجع به باقی سوالاتی که پرسیدید راستش من که هیج کدوم رو درست متوجه نشدم اگه تک تک و تفصیلی تر مطرح کنید ممنون میشیم