Integrates Guzzle 6.x, a PHP HTTP Client, into Symfony 2/3/4. Comes with easy and powerful configuration options and optional plugins.

Installs: 1 908 663

Dependents: 42

Suggesters: 4

Stars: 347

Watchers: 6

Forks: 61

Open Issues: 12


v7.5.0 2019-02-27 16:04 UTC


Requirements | Installation | Usage | Plugins | Events | Features | Suggestions | Contributing | License

Symfony GuzzleBundle

Total Downloads Monthly Downloads Latest Stable Version Build Status Scrutinizer Score License SymfonyInsight

This bundle integrates Guzzle 6.x into Symfony. Guzzle is a PHP framework for building RESTful web service clients.

GuzzleBundle follows semantic versioning. Read more on semver.org.



Command line:

To install this bundle, run the command below and you will get the latest version by Packagist.

composer require eightpoints/guzzle-bundle

To use the newest (maybe unstable) version please add following into your composer.json:

    "require": {
        "eightpoints/guzzle-bundle": "dev-master"

Note: we created Symfony Flex Recipe to speed up the installation of package.


Load bundle in AppKernel.php:

Skip it for Symfony >= 4.0

new EightPoints\Bundle\GuzzleBundle\EightPointsGuzzleBundle()
Configuration in config.yml:
    # (de)activate logging/profiler; default: %kernel.debug%
    logging: true

    # configure when a response is considered to be slow (in ms); default 0 (disabled)
    slow_response_time: 1000

            base_url: "http://api.domain.tld"

            # NOTE: This option makes Guzzle Client as lazy (https://symfony.com/doc/master/service_container/lazy_services.html)
            lazy: true # Default `false`

            # Handler class to be used for the client
            handler: 'GuzzleHttp\Handler\MockHandler'

            # guzzle client options (full description here: https://guzzle.readthedocs.org/en/latest/request-options.html)
            # NOTE: "headers" option is not accepted here as it is provided as described above.
                    - acme     # login
                    - pa55w0rd # password

                    Accept: "application/json"

                # Find proper php const, for example CURLOPT_SSLVERSION, remove CURLOPT_ and transform to lower case.
                # List of curl options: http://php.net/manual/en/function.curl-setopt.php
                    sslversion: 1 # or !php/const:CURL_HTTP_VERSION_1_0 for symfony >= 3.2

                timeout: 30

            # plugin settings
            plugin: ~

            base_url: "http://api.crm.tld"
                    Accept: "application/json"


Open Configuration Reference page to see the complete list of allowed options.

Install assets (if it's not performed automatically):
# for symfony >= 3.0
bin/console assets:install

# for symfony < 3.0
app/console assets:install

Using services in controller (eight_points_guzzle.client.api_crm represents the client name of the yaml config and is an instance of GuzzleHttp\Client):

/** @var \GuzzleHttp\Client $client */
$client   = $this->get('eight_points_guzzle.client.api_crm');
$response = $client->get('/users');


This bundle allows to register and integrate plugins to extend functionality of guzzle and this bundle.


Symfony 2.x and 3.x

All plugins will be activated/connected through bundle constructor in AppKernel, like this:

new EightPoints\Bundle\GuzzleBundle\EightPointsGuzzleBundle([
    new Gregurco\Bundle\GuzzleBundleOAuth2Plugin\GuzzleBundleOAuth2Plugin(),

Symfony 4

The registration of bundles was changed in Symfony 4 and now you have to change src/Kernel.php to achieve the same functionality.
Find next lines:

foreach ($contents as $class => $envs) {
    if (isset($envs['all']) || isset($envs[$this->environment])) {
        yield new $class();

and replace them by:

foreach ($contents as $class => $envs) {
    if (isset($envs['all']) || isset($envs[$this->environment])) {
        if ($class === \EightPoints\Bundle\GuzzleBundle\EightPointsGuzzleBundle::class) {
            yield new $class([
                new \Gregurco\Bundle\GuzzleBundleOAuth2Plugin\GuzzleBundleOAuth2Plugin(),
        } else {
            yield new $class();

Known and Supported Plugins


Handling events. Events are dispatched before and after the request to the remote host.

Listening To Events

    <service id="listenerID" class="Your\ListenerClass\That\Implements\GuzzleEventListenerInterface">  
        <tag name="kernel.event_listener" event="eight_points_guzzle.pre_transaction" method="onPreTransaction" service="servicename"/>  

Your event Listener, or Subscriber MUST implement GuzzleBundle\Events\GuzzleEventListenerInterface.
Events dispatched are eight_points_guzzle.pre_transaction, eight_points_guzzle.post_transaction.
The service on the tag, is so that if you have multiple REST endpoints you can define which service a particular listener is interested in.

Read more here.


Symfony Debug Toolbar / Profiler

Debug Logs

Symfony logs

All requests are logged into symfony default logger (@logger service) with next format:

[{datetime}] eight_points_guzzle.{log_level}: {method} {uri} {code}


[2017-12-01 00:00:00] eight_points_guzzle.INFO: GET http://api.domain.tld 200

You can change message format by overriding eight_points_guzzle.symfony_log_formatter.pattern parameter. See allowed variables here.


Adding aliases: If you want to use different names for provided services you can use aliases. This is a good idea if you don't want have any dependency to guzzle in your service name.

       alias: eight_points_guzzle.client.api_crm

Use Guzzle MockHandler in tests : If you want to mock api calls, you can force the clients to use the Guzzle MockHandler instead of the default one.

            base_url: "http://api.domain.tld"
            handler: 'GuzzleHttp\Handler\MockHandler'


👍 If you would like to contribute to the project, please read the CONTRIBUTING.md.

Slack Join our Slack channel on Symfony Devs for discussions, questions and more: #8p-guzzlebundle.

🎉 Thanks to the contributors who participated in this project.

Learn more


This bundle is released under the MIT license