====================== Plugin system overview ====================== The workflow of sending a request and parsing a response is driven by Guzzle's event system, which is powered by the `Symfony2 Event Dispatcher component `_. Any object in Guzzle that emits events will implement the ``Guzzle\Common\HasEventDispatcher`` interface. You can add event subscribers directly to these objects using the ``addSubscriber()`` method, or you can grab the ``Symfony\Component\EventDispatcher\EventDispatcher`` object owned by the object using ``getEventDispatcher()`` and add a listener or event subscriber. Adding event subscribers to clients ----------------------------------- Any event subscriber or event listener attached to the EventDispatcher of a ``Guzzle\Http\Client`` or ``Guzzle\Service\Client`` object will automatically be attached to all request objects created by the client. This allows you to attach, for example, a HistoryPlugin to a client object, and from that point on, every request sent through that client will utilize the HistoryPlugin. .. code-block:: php use Guzzle\Plugin\History\HistoryPlugin; use Guzzle\Service\Client; $client = new Client(); // Create a history plugin and attach it to the client $history = new HistoryPlugin(); $client->addSubscriber($history); // Create and send a request. This request will also utilize the HistoryPlugin $client->get('http://httpbin.org')->send(); // Echo out the last sent request by the client echo $history->getLastRequest(); .. tip:: :doc:`Create event subscribers `, or *plugins*, to implement reusable logic that can be shared across clients. Event subscribers are also easier to test than anonymous functions. Pre-Built plugins ----------------- Guzzle provides easy to use request plugins that add behavior to requests based on signal slot event notifications powered by the Symfony2 Event Dispatcher component. * :doc:`async-plugin` * :doc:`backoff-plugin` * :doc:`cache-plugin` * :doc:`cookie-plugin` * :doc:`curl-auth-plugin` * :doc:`history-plugin` * :doc:`log-plugin` * :doc:`md5-validator-plugin` * :doc:`mock-plugin` * :doc:`oauth-plugin`