> Symfony 2 >

Course Overview

Login to bookmark this course

Starting in Symfony2: Course 2 (2.4+)

Transform your Symfony skills! Learn about security, forms, and Doctrine. Plus, create a database user storage system.

  • 2977 students
  • EN Captions
  • EN Script
  • Certificate of Completion

Your Guides

About this course

What PHP libraries does this tutorial use?

// composer.json
{
    "require": {
        "php": ">=5.3.3",
        "symfony/symfony": "~2.4", // v2.4.2
        "doctrine/orm": "~2.2,>=2.2.3", // v2.4.2
        "doctrine/doctrine-bundle": "~1.2", // v1.2.0
        "twig/extensions": "~1.0", // v1.0.1
        "symfony/assetic-bundle": "~2.3", // v2.3.0
        "symfony/swiftmailer-bundle": "~2.3", // v2.3.5
        "symfony/monolog-bundle": "~2.4", // v2.5.0
        "sensio/distribution-bundle": "~2.3", // v2.3.4
        "sensio/framework-extra-bundle": "~3.0", // v3.0.0
        "sensio/generator-bundle": "~2.3", // v2.3.4
        "incenteev/composer-parameter-handler": "~2.0", // v2.1.0
        "doctrine/doctrine-fixtures-bundle": "~2.2.0", // v2.2.0
        "ircmaxell/password-compat": "~1.0.3", // 1.0.3
        "phpunit/phpunit": "~4.1" // 4.1.0
    }
}

Over the next hour, we're going to take you through some of the most difficult areas of Symfony learning all about security, forms, and parts of Doctrine. We'll also see testing and learn more about how Symfony's service container works. When you get to the end, you'll be well on your way to mastering Symfony.

One of the things we'll be creating is a security system that stores users in the database. This is functionality similar to what's offered by the very popular FOSUserBundle. That bundle is really great, but until you understand how the security system works, you're going to run into limitations. Once you do, you'll feel at home using FOSUserBundle or configuring the security system all on your own.

Highlights:

  • Learning and building a form-login security system from scratch
  • Loading users from the database
  • Using AdvancedUserInterface and UserProviderInterface classes to give us more control over login
  • Doctrine Repositories and Querying
  • Building forms: creating fields, the data_class option, form type classes
  • Form field options & HTML5 validation
  • Form rendering
  • Functional Testing!

... and of course, tips, tricks, best practices and other little features along the way!

Next courses in the Symfony 2: Starting in Symfony 2 section of the Symfony 2 Track!

151 Comments

Sort By
Login or Register to join the conversation
Default user avatar J7mbo 6 years ago

Love the videos guys, really speeding ahead with Symfony2. What an awesome framework, I love it!
Any updates on the third episode? That's the one I really want to see (services, best practice) and will purchase on release. Cheers!

| Reply |

Hey James!

Aw, I'm really really happy to hear about your success. The third episode will hopefully be done within the next week and a half. BUT, it's a free upgrade, and the differences should be pretty small - so if we're holding you up, I'd go ahead and grab episode 3 now :).

Cheers to you!

| Reply |

Hey Ryan,

Any updates on the 2.3 screencast?

| Reply |

Hi James!

We've just updated Episode 3 with the new, much nicer format and updated it for 2.2. We'll also do the same for episode 4 this week. The updates for 2.3 will come after that :). But, again, don't wait - there fortunately haven't been that many changes with the new versions of Symfony (mostly new features, that are outside of the project we're building). When we do update, we'll point out some new feature and some other small changes. That's nice, but not worth waiting for if we're making you wait.

Cheers!

| Reply |

Awesome Ryan, *insta-purchase*, thanks! :)

| Reply |
Default user avatar Piotr 6 years ago

Hi Ryan,

Great work! It's clear and easy to understand tutorial!

But I think, there's a typo in "message" for $plainPassword field, at "Basic Constraints and Options" section. It should be "Please use at least onE upper case letter ...", with "one" instead of "on". Isn't it?

| Reply |

The fixes (https://github.com/knpunive... are up on live on the site! Woo - thanks!

| Reply |
Default user avatar Piotr 6 years ago

Ryan,

I've found next typo in "After-dinner Mint" at "Whitelisting: Securing all Pages, except a few" section.

It should be 2x:
- { path: ^/ , roles: ROLE_USER }

Instead of:
- { path: ^/create , roles: ROLE_USER }

| Reply |
Default user avatar frimousse 6 years ago

Hi I recently bought all the Symfony lessons. I had no problems with lesson 1 but in lesson 2 whenever I press 'login' after entering 'user' and 'userpass' I get a {no route found for "GET /"}. I cannot see any differences with my code and the one on the files distributed with the lesson. After pressing 'login' the address on top of the browser is "http://myhost/web/app_dev.php/". Shouldn't the login button sending me to "http://myhost/web/app/event" if the login is succesful or "http://myhost/web/app/login" if the login is unsuccessful? I've been trying to fix this for two days now. Frustrating...

| Reply |

Hi there!

Sorry for the issues, but we can definitely get things working :). A few things:

1) The issue from going from episode 1 to episode 2 is actually do to a minor change that we made between episodes 1 and 2 to the routing. It's a small change, but if you're following straight from episode 1 to 2, then some URLs will have changed. We should

Sorry for the issues, but we can definitely get things working :). A few things:

1) The issue from going from episode 1 to episode 2 is actually do to a minor change that we made between episodes 1 and 2 to the routing. It's a small change, but if you're following straight from episode 1 to 2, then some URLs will have changed. We'll be fixing in the future - so apologies. What you should do is download the code for episode 2 and use the "start" directory as your new starting point. For example, in episode 1, you have URLs like `/event`, but in episode 2, that same page is actually at `/`.

2) More broadly, Symfony follows some very specific (and configurable) rules after a successful login. Some of it is explained here: http://symfony.com/doc/curr.... But basically, it tries to redirect you to the last page you tried to visit before hitting the login page. If there isn't any (i.e. you clicked directly to the login page), then it falls back to just "/". If that's not what you want, that's configurable in a few ways (shown in that entry).

Hopefully this gets you going again! If you have any other issues, just ping us here :).

Cheers!

| Reply |

Hi Ryan, Thanks for this. I struggled so much with it and tried so many different things to get it to work that I probably messed it up more than I helped. In the end, I scraped everything and restarted lesson 1 from the beginning to have a 'clean' copy. I saw what you mentioned about the "/event" becoming "/" and I made the change - just about to restart lesson 2 now. I don't know how close you are to Fabien Potencier but I would suggest that the file routing.yml in app becomes approuting.yml which would distinguish it from the bundle routing.yml file and avoid some potential confusion.
Regards.

Edit 1
Still does not work with the change. What I do is I listen to the video, pause it and do all the changes as they appears on the screen (basically I do every click she does and expect to see the same page, errors, etc). Right now, the lesson breaks down at 9:10. First, I'm losing the background - I have the login form on the top left on a blank white screen (seems like it cannot find the '::base.html.twig'); second on typing user and userpass, I get a link to "/" which shows me the event page whilst the video shows the /new page. If I press "create new event", I get: An exception has been thrown during the rendering of a template ("Unable to generate a URL for the named route "event" as such route does not exist.") in EventBundle:Event:new.html.twig at line 6. And of course it does not exist because I changed it to "/" to make the first part of the program to work.

I guess progressing throught the lessons(even with the above-mentioned change) is not an option and for the sake of not wasting too much additional time, I will resort to copy the 'start' files' and see if I can get this to work. That said, it is not very helpful if you cannot continue from where you left because, as a beginner, it is not evident what parts have been changed in the background. (also, not your fault obviously, but the error messages are hardly helpful: an error message on line 1883 on a class that I have never seen does not really tell me where is the problem)

Additional notes: Using the start files is also not straightforward as you have the JMS security bundle in the AppKernel.php and nowhere in lesson 1 or 2 these files are used. Not hard to remove from the kernel but just copying the files will generate an error as the bundle won't be found.

System: Windows 7 64 bits with IE9.

Edit 2

To use the 'start files' you will have to:
1- delete any references to JMS in the AppKernel.php
2- delete any references to JMS in the security.yml
3- delete reference to trust_proxy_headers in the config.yml

Once you've done that, you now access your application with ".../web/app_dev.php/" instead of
".../web/app_dev.php/event"

| Reply |

Hey there!

Ok, let's see if I can help out :).

1) The missing assets aren't a missing or not-found "::base.html.twig" - if that file is missing, you'll get a big error. Instead, I think your CSS files just aren't being loaded. Be sure to run this command:

php app/console assets:install

Normally, this is run automatically for you when you run "php composer.phar install", but the very first time you run that command, it may fail right at the end if you haven't already copied app/config/parameters.yml.dist to app/config/parameters.yml. That's actually totally fine, but make sure you run the above command, it'll probably fix your CSS files :).

2) Yes, a few things change between episode 1 and episode 2 - that's something we'll fix in the future. Until then, use the "start" directory from episode 2 to work from. The changes between the episodes are actually pretty minor: we added some stylesheets and tweaked the names and paths for a few routes. That's not much, but it is enough to mess you up and give you the errors you're seeing - so apologies!

3) I was able (just now) to download the "start" directory for episode 2 and get things running without any issues. You're right that we don't use the JMSSecurityBundle, but it is included in the composer.json file and downloads just fine. Based on what I'm seeing, it almost looks like you upgraded your Symfony app to Symfony 2.3, in which case the JMS stuff is *not* included, and you would need to remove the trust_proxy_headers. That's fine, but hopefully it helps to know why that error would be happening :). If you use the "start" directory, you'll get a copy that will work just fine.

Cheers!

| Reply |

Hello!

I have same problem: I have seen in video 2
".../web/app_dev.php/" is showing event list, but in episode 1
".../web/app_dev.php/event" did that, so I tried to change my code to do
exactly as the code in episode 2 does, but no results. Then I tried to
copy the code from "start" folder from episode 2, no results again -
blank page have been showed then.(I also tried all the steps below Edit
2)

I really like all these courses and I would like to learn a
lot from them, but I can`t continue lesson if I have this problem. Is
there any solution for this problem?

Best regards.

| Reply |

Hi, by copying all the files from the Start directory and doing the modifications mentioned in EDIT 2 above (assuming Symfony version 2.3.6) you should be able to follow just fine. I have not finished it yet due to time constraints but so far I am a third through it and everything is exactly as in the video. From where I am now in the video all the 'routing issues' are now dealt with as it is now moving into loading users from the databse. Do not copy just a few files here and there, replace whole directories (app and src) all at once (it'll also save you a bit of typing along the lesson!). Best!

| Reply |

Great advice frimousse! frimousse when you start using the "start" directory, are you still accessing the site via by hitting the "app_dev.php" file in your browser? That's very important - because if you don't execute this file, you're executing Symfony in the "prod" environment, and Symfony doesn't show you those errors (which could cause you your white screen problems).

To be sure, one trick you can do (if you have PHP 5.4) is to use PHP's built-in web server. From the command line at the root of your project, try:

php app/console server:run

Then, you can access your site via "http://localhost:8000/app_dev.php". See if this helps out. And if not, feel free to ping back here or email me directly (ryan@knplabs.com) and I'll make sure we get things working :).

Cheers!

| Reply |

I have always avoided Symfony in the past because none of the tutorials I tried (I'm not suggesting I've tried all of them) worked; there is always some vital detail or details missing and if you're a newbie you have no chance. Anyway, these Knp videos are fantastic and if I use Symfony2 on my next be project it will be because I them. However, the setup changes from video 1 to video 2 were pretty aggravating and best avoided in future.

The advice to copy the start folder is good, but must be done with care as you can end up losing some of your files which aren't in the new start folder if you simply replace the top level app folder with the new one. I realised this too late and found the easiest solution was to redo Lesson 1, which, on the positive side, was probably a good learning reinforcement exercise.

Also, the EventBundle\Resources\views\layout.html.twig file is missing the stylesheet block from lesson 1, so make sure you keep your old lesson 1 files somewhere so you copy this back in.

{% block stylesheets %}
{% stylesheets 'bundles/event/css/*' filter='cssrewrite' %}
<link rel="stylesheet" href="{{ asset_url }}"/>
{% endstylesheets %}
{% endblock %}

| Reply |

Hey Rob!

Thanks for the comment - I really appreciate it! We try really hard to make these tutorials full and complete :). Of course we have this pesky episode 1 to episode 2 transition issue - so sorry about that!

Because of that, I want to make sure everyone is able to get things working. By using the "start" directory from the code download as your starting project before coding with this tutorial, you should be just fine. This means using all of the contents of that directory in place of the project you built in episode 1. In reality, there aren't that many things that changed between episode 1 and 2, but just to be safe, use the "start" directory as your new project.

About the stylesheets in "EventBundle\Resources\views\layout.html.twig" - these were just moved to app/Resources/views/base.html.twig. So you shouldn't need to re-add them to layout.html.twig. But do be careful: if you override the "stylesheets" block in any of your templates (e.g. layout.html.twig or index.html.twig), you'll completely replace the stylesheets from base.html.twig, unless you use the parent() function (see: http://symfony.com/doc/mast....

If anyone has any issues with using the "start" directory in the code download, you can keep pinging us here. I have re-tried it a few times, and everything works perfectly without making any changes. Though if you do have problems, we can work through them together :).

Cheers and thanks!

| Reply |

Sorry, I guess I didn't copy across the new base.html.twig file, and perhaps I was wrong about the app folder. Regardless, it ended in a mess for me; perhaps because I tried to fix it before seeing some of the advice in the other comments on this page and I just made things worse.

I don't want to be negative though, these really are good tutorials. Thanks for making them :-)

| Reply |

These are great, but as Rob said, there's some really annoying problems. Another one is that it hasn't been updated to use an available version of bootstrap, so it looks wrong. When was the last time you guys actually went through them from the start? It would really help if you did and just wrote some update notes (and updated a couple of little bits of code where needed) so that people could follow them and get everything working perfectly.

| Reply |

Hey @Ant!

These are awesome ideas - we're planning now on how we can show changes or notes to you guys when things (like versions of Twitter Bootstrap) change. Like right now, everything still works fine from start to end, but you'd need to go find the old version of Twitter Bootstrap to match the markup.

To that end, would you have a few minutes to chat about this? I'd like to hear you (or anyone's experience) and see exactly what things we can do to make things the clearest. I don't have your email, but if you do have some time, please email me at ryan@knplabs.com!

Thanks for the comments!

| Reply |

Also, just a thought, could be good to have a version of the app running online so people can check their html markup against it. Could help diagnosing issues.

| Reply |

Or 4 versions, one corresponding to the end of each screencast

| Reply |

Hi, I have an issue with functional testing. It works exactly as in the video when testing the register page for the presence of the word "Register". But when I add the second test (submitting a blank form with $client->submit($form); ) the page HTML gets printed out to the terminal and no tests are run. If I comment out the first set of tests (for the presence of the word "Register"), the form test works as expected, so it doesn't seem to be a syntax issue. I also tried using the downloaded code as another check against typing errors, but the same thing happens.

I have tried Googling for an answer, but to no avail. I'm using Symfony 2.3. Are there any obvious 'gotchas' I'm overlooking?

| Reply |

Hi Rob!

Hmm, that does sound odd, but I'm sure we can debug it and figure out what the issue is! Can you open up an issue here: https://github.com/knpunive... and maybe include a screenshot of what it looks like when you run the tests in the different scenarios?

Thanks!

| Reply |

Hi Ryan, thanks for your offer to help. However, I have resolved the problem.

I re-installed phpunit to make sure all the paths were correct (I'm using MAMP Pro) and updated the phpunit path in the PhpStorm project config. This seemed to fix the initial problem, but I then had an internal server error to do with templating (although the page worked correctly in the browser). After much faffing about, clearing the cache, restarting MAMP and restarting PhpStorm it suddenly started working correctly.

| Reply |

Awesome, cheers Rob!

| Reply |

Great Tutorials!
Just as a note:
- { path: ^/new, roles: ROLE_USER } doesn't work.
- { path: ^/event/new, roles: ROLE_USER } is the right one.
symfony (2.4)

| Reply |

Hi Nick!

This is because some routes changed slightly between episode 1 and episode 2 of our series. For example, /event/new changed to be just /new in episode 2. So, sorry about that confusion :). There are a few other related comments on this thread about those minor changes.

If you are coding from episode 1 to episode 2 directly, there are a few changes you'll need to make to your code, which I have documented here: https://github.com/knpunive....

If anyone has any issues, don't hesitate to ask!

Thanks!

| Reply |
Default user avatar Mathias Strasser 6 years ago

Hi,

I've juste buy the lesson 2.

I don't know why but I've a blank page with this messages :
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelRequest". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Bundle\FrameworkBundle\EventListener\SessionListener::onKernelRequest". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\FragmentListener::onKernelRequest". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\RouterListener::onKernelRequest". [] []
[2013-12-19 13:43:07] request.INFO: Matched route "event" (parameters: "_controller": "Yoda\EventBundle\Controller\EventController::indexAction", "_route": "event") [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelRequest". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\Security\Http\Firewall::onKernelRequest". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Bundle\AsseticBundle\EventListener\RequestListener::onKernelRequest". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\Fragment\FragmentHandler::onKernelRequest". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.request" to listener "Symfony\Component\HttpKernel\EventListener\DeprecationLoggerListener::injectLogger". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.controller" to listener "Symfony\Bundle\FrameworkBundle\DataCollector\RouterDataCollector::onKernelController". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ControllerListener::onKernelController". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\ParamConverterListener::onKernelController". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.controller" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener::onKernelController". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.controller" to listener "Symfony\Component\HttpKernel\DataCollector\RequestDataCollector::onKernelController". [] []
[2013-12-19 13:43:07] doctrine.DEBUG: SELECT t0.id AS id1, t0.name AS name2, t0.imageName AS imageName3, t0.date AS date4, t0.location AS location5, t0.details AS details6 FROM yoda_event t0 [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Bridge\Monolog\Handler\FirePHPHandler::onKernelResponse". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Bridge\Monolog\Handler\ChromePhpHandler::onKernelResponse". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.response" to listener "Sensio\Bundle\FrameworkExtraBundle\EventListener\CacheListener::onKernelResponse". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\ResponseListener::onKernelResponse". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\LocaleListener::onKernelResponse". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\Fragment\FragmentHandler::onKernelResponse". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\Security\Http\RememberMe\ResponseListener::onKernelResponse". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\ProfilerListener::onKernelResponse". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Bundle\WebProfilerBundle\EventListener\WebDebugToolbarListener::onKernelResponse". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.response" to listener "Symfony\Component\HttpKernel\EventListener\StreamedResponseListener::onKernelResponse". [] []
[2013-12-19 13:43:07] event.DEBUG: Notified event "kernel.terminate" to listener "Symfony\Bundle\SwiftmailerBundle\EventListener\EmailSenderListener::onKernelTerminate". [] []

I've just beginning the first modification (firewalls) in security.yml, this to work, so I went to the second part (access_control) and then I got a blank page.
I returned with the original file and I still do not display, I do not understand.
Can you help me on what exactly happens?

| Reply |

Hi Mathias Strasser!

A blank page is very strange, and Symfony should at least be giving you an error page. It's probably some small misconfiguration. Can you open up an issue here: https://github.com/knpunive... Then we can work together to see what the problem is :). Obviously, double-check to make sure that you're executing the `app_dev.php` script, so that you see errors. Also, check your `php.ini` configuration to make sure that `display_errors` is set to true so that PHP errors are showing up.

Cheers!

| Reply |
Default user avatar Mathias Strasser weaverryan 6 years ago

Thanks in advance :)

github.com/knpuniversity/sy...

| Reply |
Default user avatar nglaser power 6 years ago

Use $form->handleRequest instead of bind. I am talking about register form video in the series.

| Reply |

Hi nglaser power

Yes, you're right :). Both bind() and handleRequest() work, but bind() is deprecated. Fortunately, it won't be removed from Symfony until version 3.0.

But, we do want to keep that updated! I've opened up an issue to track that change and any other form-related changes we may need: https://github.com/knpunive...

Thanks so much!

| Reply |
Default user avatar Mathias Strasser weaverryan 6 years ago

Hi,

Now, bind redirect to submit.
So why use handleRequest ?

| Reply |

Hey Mathias!

Yes, there were actually 2 changes to bind:

1) bind was renamed to submit
2) Passing a Request object to submit was deprecated. It's still completely valid to pass an array of data to submit (that's its purpose), but if you want to pass a Request object, use handleRequest. The reason for this second change was performance - one function for handing processing the Request object (handleRequest) and another for handling data arrays (submit).

The big takeaway is to use handleRequest almost always. The only exception is if you are passing the array of POST data directly (pretty uncommon), then use submit(). We'll be working to update this screencast with the latest and greatest over the next several weeks too :).

Hope that clarifies!

| Reply |
Default user avatar nglaser power 6 years ago

Also in order for the user to be authenticated you have to call the setRoles function when you create the user.

| Reply |

Hi again nglaser power!

Do you mean calling $user->setRoles() on the fixtures? It *is* true that User::getRoles() must return at least 1 role in order for you to be authenticated after logging in as that user. However, in our implementation of getRoles(), we *always* return at least ROLE_USER, even if the roles property is actually empty in the database. So, you shouldn't need to call setRoles() in the fixtures - having empty roles is ok - you'll always at least have ROLE_USER :). Reference: http://knpuniversity.com/sc...

Are you seeing something different?

Thanks!

| Reply |

Awesome video. Just a quick question, what is the actual difference between an entity and repository? More to the point, should I ensure that all custom functions I write (ie: code that is not auto-generated when I update my entity yml file) be stored in a repository while all the auto-generated code that is done by doctrine and Symfony (so far it looks like just the getters and setters for the POPO file) be stored in the entity file?

| Reply |

Hi John!

Think of an entity as representing each row in a table. Assuming you have a Product entity class, if you create a new Product object and save it, that creates a new row in the product table. When you query for 10 products, you get to Product objects.

Think of the repository as the class that holds query logic. You create methods on your ProductRepository class, for example, like "findAllAlphabetical" that make a query to return some Product objects.

So to your question, you'll likely write custom code in both your entity and your repository. If you need make a new query, create a new function in your repository that queries exactly how you need. But when you're getting information about 1 specific row in some table (e.g. a Product), then you might add a new function to your entity. For example, imagine I have a BlogPost entity with a publishedAt field, which is set to the DateTime when the BlogPost should become published. If it is a date in the future, then it's not published yet. As a convenience, you might create a new function inside your entity called isPublished, which looks something like this:


public function isPublished()
{
    // check if the publishedAt is in the past
    return $this->publishedAt < new \DateTime('now');
}

This custom code is concerned entirely with the data from this 1 BlogPost, so it fits nicely in the repository.

Hope that helps out a bit!

| Reply |
Default user avatar Thomas 6 years ago

Since there are changes from ep1 to ep2 I think this needs to be displayed somewhere other than in the Disqus comments. I ran into the error on basic security and had to search the comments to find the github page with the changes. It would have made it much easier and less frustrating if I was told this information from the get go.

Overall, great series. I am learning a lot and am enjoying Symfony!

| Reply |

Thanks for the comment Thomas! I agree, this is an issue, and yea, it's not very likely that someone will read the comments first! We are planning on updating the screencasts pretty soon, but I'm going to think about some sort of a small changelog notification that's in an obvious spot so people are aware.

Glad you're enjoying the series and Symfony :). Cheers!

| Reply |

I actually do read the comments before I do the tutorials, exactly because I don't want to get stuck as some place just because something is deprecated or anything else changed;)

| Reply |

Cheers :). We're updating these 4 episodes right now anyways to catch these deprecations and get them up to date!

| Reply |
Default user avatar Thomas 6 years ago

Submitted a pull request for updated code required to get the 'Basic Security' video to work in 2.4.1. $this->getRequest() is deprecated. It requires a parameter Request $request and an additional use statement. Check it out here: https://github.com/tvl83/sy...

| Reply |

Merged! You rock!

| Reply |
Default user avatar Thomas 6 years ago

I found another caveat. When I tried to generate the entity it says User is a reserved word so I ended up using Member instead.

| Reply |

Hey Thomas!

Was the error because of the table name (i.e. it was trying to create a table called "user") or something else? The table name should be "yoda_user" - we controlled it here: https://github.com/knpunive...

Let me know one way or another - if there's an issue we can fix or even an easy mistake we can prevent with some extra direction, let's do it!

Cheers!

| Reply |

The error it gave was using the console generator. I will have to do it again and get the exact error message. I'll get back to you :)

| Reply |

Thanks! Let me know what you find out :)

| Reply |

I don't know what I did the first time around. Working on a new project I now have a UserBundle and it didn't give any problems. disregard my n00b statement. :)

| Reply |

Delete comment?

Share this comment

astronaut with balloons in space

"Houston: no signs of life"
Start the conversation!