اگر می خواهید قبل و یا بعد از فراخوانی یک فرآیند خاص مانند ذخیره کردن اطلاعات و یا نمایش اطلاعات به کاربر و کارهایی از این قبیل ، عمل خاصی را انجام دهید، راه حل پیش رو ، متدهای callback هستند . این متدها به صورت خودکار اجرا می شوند و در بخش های Controller و Model با توجه به نیازمان ، می توانیم آنها را تعریف کنیم .
Controller
- متد beforeFilter :
یکی از مهم ترین متدهای موجود در این بخش هست ، که قبل از اجرای هر اکشنی در کنترلر مربوطه فراخوانی می شود( حتی هنگامی که اکشن درخواست شده در کنترلر تعریف نشده باشد) و بهترین مکان برای انجام کارهایی از قبیل اعتبارسنجی جلسه (session) کاربر ، چک کردن سطح دسترسی کاربر و … هست .
- متد beforeRender :
این متد بعد از اجرای اکشن درخواست شده و قبل از نمایش view به کاربر ، اجرا می شود و آنچنان مورد استفاده ندارد ، اما گاهی وقت ها که نمایش خودکار(autoRender) در کنترلر را غیر فعال کرده ایم و با استفاده از متد render به صورت دستی view را به کاربر نمایش می دهیم ممکن است مورد استفاده قرار بگیرد .
- متد afterFilter :
بعد از فراخوانی تمامی اکشن های درخواست شده از کنترلر و پس از نمایش view به کاربر اجرا می شود .
کامپوننت های تعریف شده در بخش کنترلر نیز دارای متدهای callback خاص خودشان هستند که برای مطالعه بیشتر در این زمینه می توانید به این لینک مراجعه کنید .
Model
در این بخش به نسبت کنترلر ، متدهای callback کاربردی تری قرار گرفته که در هنگام ذخیره و بازیابی اطلاعات ، کار توسعه دهنده را بسیار راحت خواهد کرد ، به عنوان مثال ، تصور کنید که در حال توسعه یک سیستم بلاگ هستید و نیاز دارید که تاریخ انتشار پست را به صورت شمسی از کاربر دریافت و به صورت میلادی در پایگاه داده ذخیره کنید و مجددا هنگامی که اطلاعات پست را از پایگاه داده می خوانید تاریخ انتشار را به صورت شمسی به کاربر نمایش دهید، به نظرتان بهترین راه حل برای این کار چیست ؟
با استفاده از متدهای beforeSave و afterFind که در ادامه بررسی خواهیم کرد به سادگی می توانیم این کار را انجام دهیم .
- متد beforeFind
این متد قبل از فراخوانی هر متدی به منظور خواندن از پایگاه داده اجرا می شود و امضای آن به شکل زیر است :
beforeFind(mixed $queryData)
یک متغیر به عنوان پارامتر ورودی(queryData$) دریافت می کند که شامل اطلاعاتی از تنظیمات نهایی متد find ، مانند فیلدها ، شرط ها ، تعداد رکورد ها و … برای خواندن از پایگاه داده است که در زیر یک نمونه از محتویات آن را قرار داده ام :
array( 'conditions' => null, 'fields' => null, 'joins' => array(), 'limit' => (int) 20, 'offset' => null, 'order' => null, 'page' => (int) 1, 'group' => null, 'callbacks' => true, 'maxLimit' => (int) 20, 'paramType' => 'named' )
در صورتی که میخواهید متد find اجرا نشود می توانید مقدار false را برگردانید.
- متد afterFind
نتایج حاصل از اجرای متد find به این متد پاس داده می شود و در صورت نیاز می توان در داده ها تغییرات مورد نظرمان را انجام دهیم و سپس آن را بازگشت دهیم.
به عنوان مثال :
public function afterFind($results,$primary=false){ foreach($results as $key => $val){ if(isset($val['Post']['date'])){ $results[$key]['Post']['date'] = date('Y/m/d',val['Post']['date']); } } return $results; }
- متد beforeValidate
از این متد برای تغییر اطلاعات ارسال شده به Model و یا تغییر قوانین اعتبار سنجی ، قبل از انجام عملیات اعتبارسنجی (Validates) استفاده می شود و مقدار بازگشتی آن باید true باشد تا متد save اجرا شود .
- متد beforeSave
قبل از ذخیره سازی اطلاعات اجرا می شود و به منظور انجام عملیات ذخیره سازی باید مقدار true بازگرداند در غیر این صورت عملیات ذخیره سازی متوقف می شود.
- متد afterSave
امضای این متد به صورت زیر است :
afterSave(boolean $created)
بعد از انجام عملیات ذخیره سازی فراخوانی می شود و در صورتی که موفقیت آمیز باشد پارامتر created$ مقدار true و در غیر این صورت مقدار flase خواهد داشت.
- متد beforeDelete
قبل از انجام عمل حذف فراخوانی می شود که امضای آن به صورت زیر است :
beforeDelete(boolean $cascade)
پارامتر وردی این متد cascade$ در صورتی که رکوردهای مربوط به این رکورد (رکوردهایی که به این رکورد وابسته هستند و با هم ارتباط دارند) هم پاک شوند مقدار true خواهد داشت همچنین توجه داشته باشید که برای انجام عملیات حذف این متد باید مقدار true بازگرداند .
- متد afterDelete
این متد نیز بعد از انجام عملیات حذف فراخوانی می گردد.
برای دریافت اطلاعات بیشتر در مورد این متد ها می توانید به این لینک مراجعه نمایید .
رفتار کننده ها (Behavior) تعریف شده در این بخش نیز دارای یکسری متدهای callback برای پیاده سازی هستند که در این لینک می توانید اطلاعاتی در مورد آنها کسب کنید .
در آخر هم باید بگم ، اگر سوال یا مشکلی در رابطه با کیک پی اچ پی دارید می توانید در انجمن فارسی کیک پی اچ پی مطرح کنید .
مرسی ممنون تشکر
۲۰ مرداد ۱۳۹۳ در ۶:۰۲ ب.ظ