هوک‌ها - توسعه هسته فریمورک

مجتبی پاکزاد کدایگنایتر 3.1.9 در حال تکمیل رایگان

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

فعال‌سازی هوک

فیچر هوک می‌تواند به صورت گلوبال از طریق مقداردهی آیتم زیر در فایل application/config/config.php فعال/غیرفعال شود.

$config['enable_hooks'] = TRUE;

تعریف یک هوک

هوک‌ها در فایل application/config/hooks.php تعریف می‌شوند. هر هوک با یک آرایه مطابق الگوی زیر مشخص می‌شود:

$hook['pre_controller'] = array(
        'class'    => 'MyClass',
        'function' => 'Myfunction',
        'filename' => 'Myclass.php',
        'filepath' => 'hooks',
        'params'   => array('beer', 'wine', 'snacks')
);

توجه

اندیس آرایه به نام هوک پوینت منحصر به فردی بستگی دارد که قصد استفاده از آن را دارید. در مثال بالا، هوک‌پوینت pre_controller است. لیستی از هوک‌پوینت‌ها در ادامه آمده است. آیتم‌های زیر باید در آرایه انجمنی هوک تعریف شود:
  • class نام کلاس که می‌خواهید فراخوانی کنید. اگر ترجیح می‌دهید از یک فانکشن رویه‌گرا به جای یک کلاس استفاده کنید، این آیتم را خالی بگذارید.
  • function نام فانکشن (یا متد) که می‌خواهید فراخوانی کنید.
  • filename نام دایرکتوری که اسکریپت شما در آن قرار دارد. دقت کنید: اسکریپت شما باید در یک دایرکتوری داخل دایرکتوری application/ قرار گیرد، بنابراین مسیر فایل نسبت به آن دایرکتوری است. برای مثال، اگر اسکریپت شما در application/hooks/ قرار گرفته باشد، به سادگی می‌توانید از ‘hooks’ به عنوان مسیر فایل خود استفاده کنید. اگر اسکریپت شما در application/hooks/utilities/ قرار داشته باشد، باید از ‘hooks/utilities’ به عنوان مسیر فایل استفاده کنید. بدون اسلش پایانی (trailing slash).
  • params هر پارامتری که می‌خواهید به اسکریپت ارسال کنید. این آیتم اختیاری است.

همچنین می‌توانید از فانکشن‌های بی‌نام/لامبادا (یا کلوژرها) به عنوان هوک استفاده کنید، که سینتکس ساده‌تری دارند:

$hook['post_controller'] = function()
{
        /* do something here */
};

فراخوانی چندباره با یک هوک

اگر می‌خواهید با یک هوک‌پوینت، بیش از یک اسکریپت را اجرا کنید، کافی است آرایه خود را به صورت چند بعدی تعریف کنید، مانند:

$hook['pre_controller'][] = array(
        'class'    => 'MyClass',
        'function' => 'MyMethod',
        'filename' => 'Myclass.php',
        'filepath' => 'hooks',
        'params'   => array('beer', 'wine', 'snacks')
);

$hook['pre_controller'][] = array(
        'class'    => 'MyOtherClass',
        'function' => 'MyOtherMethod',
        'filename' => 'Myotherclass.php',
        'filepath' => 'hooks',
        'params'   => array('red', 'yellow', 'blue')
);

به براکت‌های بعد از اندیس هر آرایه دقت کنید:

$hook['pre_controller'][]

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

هوک‌پوینت‌ها

لیست زیر، مجموعه‌ای از هوک‌پوینت‌های در دسترس هستند.

  • pre_system در ابتدای اجرای سیستم فراخوانی می‌شود. در حالی که در این مرحله، تنها کلاس‌های benchmark و hook لود شده‌اند. هنوز مسیریابی یا پروسه دیگری اتفاق نیافتاده است.
  • pre_controller دقیقا قبل از فراخوانی کنترلر شما فراخوانی می‌شود. تمام کلاس‌های پایه، مسیریابی و بررسی‌های امنیتی انجام شده است.
  • post_controller_constructor بلافاصله بعد از ساخت یک آبجکت از کنترلر شما و قبل از فراخوانی هر متدی فراخوانی می‌شود.
  • post_controller بعد از اجرای کامل کنترلر شما فراخوانی می‌شود.
  • display_override متد _display() را بازنویسی می‌کند. این متد، در انتهای اجرای سیستم، برای ارسال صفحه نهایی به مرورگر استفاده می‌شود. این کار به شما امکان این را می‌دهد تا متودولوژی نمایش خودتان را استفاده کنید. دقت کنید که باید با روش انتساب رفرنسی، سوپرآبجکت کدایگنایتر را به یک متغییر $this->CI =& get_instance() تخصیص دهید، سپس با فراخوانی $this->CI->output->get_output() به داده نهایی دسترسی خواهید داشت.
  • cache_override امکان این را به شما می‌دهد تا به جای متد در لایبرری ، متد خود را فراخوانی کنید. در واقع به شما امکان این را می‌دهد تا از مکانیزم نمایش کش خود استفاده کنید.
  • post_system پس از اینکه صفحه رندر شده نهایی به مرورگر ارسال شد، در پایان اجرای سیستم و بعد از ارسال داده‌های نهایی به مرورگر اجرا می‌شود.