Go Deeper!

This tutorial has been upgraded! Check out the Symfony 3 Tutorial.

PHP has been on a wild ride over the past few years, with new things like namespaces, our package manager called Composer, and whole lot more sharing and friendship between projects. And in a lot of ways, Symfony has been in the driver's seat for all of that. So congrats on making it here: you're on a path to building great applications.

Let's look at some facts:

Symfony is a component library

This means that you can use any part of it in any PHP project, even that ugly legacy app they make you work. We could use Symfony's Router component to give it flexible URLs. Oh, and a lot of other projects use parts of Symfony, like Drupal, Laravel

Symfony is also a "framework"

And because we don't have time to worry about putting a bunch of libraries together, we have the Symfony framework. This is a "suggestion" of how everything can work together in a consistent system. We'll be using the Symfony framework in this course.

Silex is another framework built on Symfony and its goal is to be tiny & really easy to use.

I know what you're wondering: should I use the Symfony framework or this Silex guy? Use them both. Because they both use the same pieces, when you're done with this course, you'll be a certifiable Silex expert.

Symfony plays nice with others

Yep, Symfony tries to be as boring as possible by following widely-used standards. This makes it effortless to include and use other libraries in your project. Want to use a component of Zend Framework? We can do that with just a little bit of configuration.

Symfony is one of the top 3 most watched PHP projects on GitHub

Clearly, you won't be lonely! There's a lot of us out there working with it.

Build Something

In this course, we're going to kick off your Symfony journey by building an events application. To sweeten the deal, you'll also be mastering the most important concepts used across all frameworks and web apps in general, because Symfony steals from, ahem, builds off of the shoulders of other giants.

So even if you don't want to, when you're building something in Symfony, you'll be learning best-practices and probably becoming a better developer. You've been warned!

In this course, we've got some big goals:

  1. Start a new project using Symfony2.
  2. Explore the core areas, like routing, controllers, requests, responses and templating.
  3. Get comfortable with a few extra tools, like Doctrine for dealing with the database and code generation tools.
  4. And the real reason you are here, to learn enough best practices and tips to impress your friends at a party.

Ready? Let's go!

Leave a comment!

  • 2017-04-19 Ben

    Thank you!

  • 2017-04-17 weaverryan

    Yo Ben!

    Try also doing a apt-get install php7.0-sqlite3 (replacing 7.0 with your actual PHP version, like 5 or 7.1). You DID install sqlite3 (good catch on that - that was the correct thing to do) - but you also need the sqlite extension for PHP. It comes pre-installed with most PHP's... but curiously, not all PHP installations :).


  • 2017-04-16 Ben

    Hi when i run php data/setupDb.php it says
    'Panic! could not find driver'. I have sqlite3 installed i just did a sudo apt install sqlite3.

    What else could be the problem?

  • 2016-11-22 Victor Bocharsky

    Hi MassiB,

    We're talking about REST API in general here, but if you're interested in OAuth only - we have a tutorial about OAuth2:


  • 2016-11-22 MassiB

    I'm not sure - are we referring to Oauth or Oauth2 here?

  • 2016-09-18 shilpagov82

    This could be useful in helping you monitor REST APIs for performance and accuracy. Uptime Cloud Monitor supports monitoring REST APIs on a completely SAAS based model.
    The setup is quick and easy. You can configure the REST API URL, the REST method (GET/ POST/ PUT/ DELETE), request parameters (if any), credentials required (if any), the monitoring frequency, the geographic location of the monitoring stations (from a choice of 15 stations across the globe). You can match the REST API response body against a specific string to ensure that the response is as expected.

    You can also configure alerts (notified via SMS, Email, PagerDuty etc) to be triggered based on API downtime, performance degradation or API response verification failure.

    More details on REST API Monitoring:

    You can also sign up for a 14 day free trial of Uptime Cloud Monitor

    Disclaimer: I work at Uptime Cloud Monitor

  • 2016-05-11 weaverryan

    Hi Sudhir!

    1. Your code for this part looks perfect, so I'm a bit confused to why you are being redirected incorrectly. When you view the HTML source of your page, do you see this?


    Or is the app_dev.php missing from this string? Also, try using window.location = '' instead of replace - just in case that's causing problems.

    2. I'm not sure about this. What do you mean that it doesn't work when the method is POST? Do you mean that the AJAX request causes a 404? Or that it works but you cannot access your POST data? If you're not using the build-in web server, what web server are you using? Also, even if you're not using the built-in web server, you should point your web server at the "web" directory as the document root so that you have nice URLs like /app_dev.php/login (without the /web in front) :).


  • 2016-05-11 Sudhir

    hi weaverryan

    hope u r doing good.
    in my current project i am facing a 2 issue.
    here is my problem statement.

    1. i am sending a ajax request to validate the login. when valid credentials matched i am trying to redirecting on dashboard.
    my current url is www.projectUrl//web/app_dev.php/login/
    after that i want to redirect at www.projectUrl//web/app_dev.php/flight/
    in js file here is my code

    window.location.replace('{{ path ("/flight")}}');

    using this code the redirection is going on /login/flight. (i want app_dev.php/flight/). may u help me where i am doing worng.

    2nd issue.
    when i am using /web/app_dev.php/login/ (without symfony server:run) my post method didn't work. ajax is working fine but i am not getting Post variable. surprising thing is if i am using GET method then its work never when i use POST.

    Here is my ajax code.

    url : httpPath, // path via parameter
    data: serializeData,
    method: 'POST',
    cache: false,
    contentType: 'application/json',
    timeout: 5000,

    may u help me where i am doing wrong..

    Thanks in advance.

  • 2016-05-04 weaverryan

    Ah, you're right - there's a problem in the dependency-injection tutorial - I just fixed this: Thanks for pointing that out! I wanted to give you a proper GitHub shout, but I was only 90% sure that jhmnieuwenhuis is you :).

    I plan to script out those installation instructions so that we can't possibly mess them up - you know, keeping docs in sync with code... not always easy.


  • 2016-05-04 Hans Nieuwenhuis

    Ok, great.
    But there is still no vendor directory in the start code.
    And in the it says :

    "You can also run Composer, though the `vendor/` directory should already have everything it needs:"

    And if there is no vendor directory and composer is not run, the start code will not run.



  • 2016-05-03 weaverryan

    Thanks Hans! We just fixed that - we left a library in there that's not used anymore :)

  • 2016-05-01 Hans Nieuwenhuis

    Update course code ?

    In the course code composer.json there are still the lines for knpuniversity/gladiator.
    And there is no vendor directory.

    When I run composer install I get an error on gladiator, saying it can not be downloaded.
    And I think it is nog longer needed or ??

    I removed the gladiator lines from composer.json and removed composer.lock and then I ran
    composer install again, and now the application works...

    Later on I also ran composer require pimple/pimple, and that also works fine/

  • 2015-11-05 Ammar

    Hey thanks. It works perfectly now!

  • 2015-11-04 weaverryan

    Hey Ammar!

    It's an easy fix: just create a `logs` directory at the root of the project and make it writeable - the code is trying to write to a mail.log file in this directory. I just added a note about this to the project:


  • 2015-11-04 Ammar

    i get this error on running app.php

    PHP Warning: fopen(/var/www/public/dependency_injection/src/DiDemo/Mailer/../../../logs/mail.log): failed to open stream: No such file or directory in /var/www/public/dependency_injection/src/DiDemo/Mailer/SmtpMailer.php on line 56

    PHP Warning: fwrite() expects parameter 1 to be resource, boolean given in /var/www/public/dependency_injection/src/DiDemo/Mailer/SmtpMailer.php on line 57

    PHP Warning: fopen(/var/www/public/dependency_injection/src/DiDemo/Mailer/../../../logs/mail.log): failed to open stream: No such file or directory in /var/www/public/dependency_injection/src/DiDemo/Mailer/SmtpMailer.php on line 56

    PHP Warning: fwrite() expects parameter 1 to be resource, boolean given in /var/www/public/dependency_injection/src/DiDemo/Mailer/SmtpMailer.php on line 57

    i am assuming the log files are not being generated due to sqlite db connectivity issues. I am using scotch box vm and it comes it sqlite. How do i setup a username and pass in setupdb.php?

  • 2015-10-26 David Thorne

    Thanks Ryan, helps a lot. I'll hold off till 2.8/3.0 are out and videos are completed. Looking forward to them, keep up the good work!

  • 2015-10-26 weaverryan

    Hey David!

    Actually, since Symfony 2.8 and 3 come out in about a month, we'll start to record complete updates to the latest versions really soon. Until then (as you eluded to), I would wait to learn Symfony. If we show you an out-dated way of doing something, you'll get a deprecation warning in the web debug toolbar - so you'll know it's outdated. More importantly, the new way is usually pretty close (e.g. a method name change) from the way we show things.

    I hope that helps - updates coming soon!

  • 2015-10-26 David Thorne

    Whilst Symfony 2.4 is still an officially supported LTS release, it is no longer the standard LTS if you follow the Symfony best practices. Whilst putting together a whole new series on 2.7 is a lot of work, any chance on either a mini series on the core differences or indeed a single video if that seems more applicable?

  • 2015-07-12 weaverryan

    Hey Léo!

    You're really close :). You need to move into the "start" directory and run a "composer install" (or a php composer.phar install depending on how you have Composer installed). We do talk about this - but it's a few more chapters from now :)

    Let me know if that helps!

  • 2015-07-12 Léo Li

    Excuse me, when I ran this "php app.php", I got a error:

    PHP Warning: require(/Users/AJ/Sites/knpuniversity-dependency-injection/start/vendor/autoload.php): failed to open stream: No such file or directory in /Users/AJ/Sites/knpuniversity-dependency-injection/start/app.php on line 3

    PHP Stack trace:

    PHP 1. {main}() /Users/AJ/Sites/knpuniversity-dependency-injection/start/app.php:0

    Warning: require(/Users/AJ/Sites/knpuniversity-dependency-injection/start/vendor/autoload.php): failed to open stream: No such file or directory in /Users/AJ/Sites/knpuniversity-dependency-injection/start/app.php on line 3

    Call Stack:

    0.0008 228408 1. {main}() /Users/AJ/Sites/knpuniversity-dependency-injection/start/app.php:0

    PHP Fatal error: require(): Failed opening required '/Users/AJ/Sites/knpuniversity-dependency-injection/start/vendor/autoload.php' (include_path='.:/usr/local/Cellar/php56/5.6.3/lib/php') in /Users/AJ/Sites/knpuniversity-dependency-injection/start/app.php on line 3

    PHP Stack trace:

    PHP 1. {main}() /Users/AJ/Sites/knpuniversity-dependency-injection/start/app.php:0

    Fatal error: require(): Failed opening required '/Users/AJ/Sites/knpuniversity-dependency-injection/start/vendor/autoload.php' (include_path='.:/usr/local/Cellar/php56/5.6.3/lib/php') in /Users/AJ/Sites/knpuniversity-dependency-injection/start/app.php on line 3

    Call Stack:

    0.0008 228408 1. {main}() /Users/AJ/Sites/knpuniversity-dependency-injection/start/app.php:0

    And I can't find __DIR__.'/vendor/autoload.php' this file in the package, neither the "logs\mail.log".
    Am I missing some step?