# The Yaf_Plugin_Abstract class

&reftitle.intro;

Plugins allow for easy extensibility and customization of the framework.

Plugins are classes. The actual class definition will vary based on the component -- you may need to implement this interface, but the fact remains that the plugin is itself a class.

A plugin could be loaded into Yaf by using `Yaf_Dispatcher::registerPlugin`, after registering, All the methods which the plugin implemented according to this interface, will be called at the proper time.

&reftitle.examples;

### Plugin example

    <?php
       /* bootstrap class should be defined under ./application/Bootstrap.php */
       class Bootstrap extends Yaf_Bootstrap_Abstract {
            public function _initPlugin(Yaf_Dispatcher $dispatcher) {
                /* register a plugin */
                $dispatcher->registerPlugin(new TestPlugin());
            }
       }

       /* plugin class should be placed under ./application/plugins/ */
       class TestPlugin extends Yaf_Plugin_Abstract {
            public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
                /* before router
                   in this hook,  user can do some url rewrite */
                var_dump("routerStartup");
            }
            public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
                /* router complete
                   in this hook, user can do login check */
                var_dump("routerShutdown");
            }
            public function dispatchLoopStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
                var_dump("dispatchLoopStartup");
            }
            public function preDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
                var_dump("preDispatch");
            }
            public function postDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
                var_dump("postDispatch");
            }
            public function dispatchLoopShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
                /* final hook
                   in this hook user can do logging or implement layout */
                var_dump("dispatchLoopShutdown");
            }
       }

       Class IndexController extends Yaf_Controller_Abstract {
            public function indexAction() {
                return FALSE; //prevent rendering
            }
       }

       $config = array(
           "application" => array(
               "directory" => dirname(__FILE__) . "/application/",
           ),
       );

       $app = new Yaf_Application($config);
       $app->bootstrap()->run();
    ?>

&example.outputs.similar;

    string(13) "routerStartup"
    string(14) "routerShutdown"
    string(19) "dispatchLoopStartup"
    string(11) "preDispatch"
    string(12) "postDispatch"
    string(20) "dispatchLoopShutdown"

&reftitle.classsynopsis;

        Yaf_Plugin_Abstract

          Yaf_Plugin_Abstract

        &Methods;

&reference.yaf.entities.yaf-plugin-abstract;