Symfony2 bundle to easily add a widget with the latest tweets of a Twitter user to a page.
Latest commit ea80963 Jul 18, 2016 @weaverryan weaverryan committed on GitHub Merge pull request #31 from KnpLabs/fix/twitter-link-in-readme
Fix dead twitter blog link in Readme



the bundle is working only with OAuth driver because of twitter api v.1 retirement old users needs update abraham/twitteroauth using composer update abraham/twitteroauth

This Symfony2 bundle will allow you to easily add a visual widget with the last tweets of the Twitter users to your page.

Build Status

Note that tweets are transformed so that links are clickable.


Add KnpLastTweetsBundle in your composer.json

    "require": {
        "knplabs/knp-last-tweets-bundle": "*"

Register the bundle in your app/AppKernel.php:


public function registerBundles()
    $bundles = array(
        // ...
        new Knp\Bundle\LastTweetsBundle\KnpLastTweetsBundle(),

Buzz is required to use this bundle.


After installing the bundle, just do:

{% render "KnpLastTweetsBundle:Twitter:lastTweets" with {'username': 'knplabs'} %}

Or if you want use combined feed:

{% render "KnpLastTweetsBundle:Twitter:lastTweets" with {'username': ['knplabs', 'knplabsru']} %}

In that case tweets will be sorted by date.


You will now have to configure the bundle to use one of the three available drivers.

Api driver

The simplest driver is the api driver: it calls twitter API at each request.

# app/config.yml
        driver: api

This is the default - you don't even have to add the previous config to app/config.yml.
But it's obviously not peformant in production.

OAuth driver

The oauth_driver uses InoriTwitterAppBundle. First you should configure and install it.

Then you are freely to set it in config:

# app/config.yml
        driver: oauth

Doctrine Cache driver

The doctrine_driver uses DoctrineCache. First you should configure and install it.

Then you are freely to set it in config:

# app/config.yml
        driver: doctrine_cache
            cache_service: my_doctrine_cache_service #must be a valid doctrine cache

you could use LiipDoctrineCacheBundle for configuring your caches.

Zend_Cache driver

The zend_cache driver uses Zend_Cache to cache the last tweets in a Zend_Cache_Backend (file, APC, memcached…).

You will need to install KnpZendCacheBundle first and configure it:

# app/config.yml
                name: Core
                    lifetime: 300
                    automatic_serialization: true
                name: File
                    cache_dir: %kernel.root_dir%/cache/%kernel.environment%

        driver: zend_cache
            cache_name: knp_last_tweets
            method: api # or oauth

This will only call the twitter api after a minimum of 300 seconds.

The force-fetch command

Caching is good. But once in a while (well one every 5 minutes in the previous case and if you have a continuous flow a visits), one of your visitor will have to wait 2 unnecessary seconds while the server calls twitter API.

To avoid that, you should launch a cron job every 4 minutes which will force the fetching and caching of the new tweets

php app/console knp-last-tweets:force-fetch knplabs

This way, you will never make your visitors wait!

Array driver

The array driver uses dummy data and does not call the twitter API.

It will return you 10 fake tweets - perfect in development.

# app/config.yml
        driver: array


  • Use the array driver in development (edit your app/config_dev.yml file)
  • Use the zend_cache or doctrine_cache driver in production (edit your app/config.yml file)
  • Use the force-fetch command in a cron job in production
  • Use HTTP caching if you know what this is about and if performance is really important to you!
  • Use the oauth driver if you have problems with limits.

Advanced usage: HTTP caching

Please note that the following is not necessary: you should be perfectly fine without it.

You can use HTTP caching and ESI if you want the lastTweets action to be rendered as an ESI tag.

This will improve performance by using a cached version of the whole rendered block - even in a dynamic page.

Follow the instructions on and use the following code in your templates:

{% render "KnpLastTweetsBundle:Twitter:lastTweets" with {'username': ['knplabs', 'knplabsru'], 'age': 5}, {'standalone': true} %}


  • Initial work has been done by KnpLabs


KnpLastTweetsBundle is released under the MIT License. See the bundled LICENSE file for details.