gstreamer0.10-ffmpeg
gstreamer0.10-plugins-good
packages.
Let's see what this all looks like in the database! To query the user table, we can actually use the console:
php bin/console doctrine:query:sql 'SELECT * FROM user'
Nice! We inherited a bunch of columns from the base User
class, like username
,
email
and enabled
. It even tracks our last login. Thanks!
But there are two weird fields: username_canonical
and email_canonical
. What
the heck? These are one of the more controversial things about FOSUserBundle. Before
we explore them, first, just know that when you set username
or email
, the corresponding
canonical field is automatically set for you. So, these canonical fields are not
something you normally need to worry or think about.
So why do they exist? Suppose that when you registered, you used some capital
letters in your username. The username
column will be exactly as you typed it:
with the capital letters. But username_canonical
will be lowercased. Then, when
you login, FOSUserBundle lowercases the submitted username and queries via the
username_canonical
column.
Why? Because some databases - like Postgresql - are case sensitive. The canonical
fields allow a user to login with a case insensitive username - aquanaut
in all
lowercase, uppercase or any combination.
But mostly... this is just a detail you shouldn't think about. It's all handled for you and other than being ugly in the database, it doesn't hurt anything.
And by the way, right now you can only login with your username
. If you want to
be able to login with username
or email
, no problem! The documentation has a
section about this. Just change your user provider to fos_user.user_provider.username_email
.
What does this do? When you submit your login form, the provider
section is responsible
for taking what you entered and finding the correct User
record. Our current
user provider finds the User
by the username_canonical
field. This other one
looks up a User
by username or email. And you're 100% free to create your own
user provider, if you need to login with some other, weird logic. FOSUserBundle
won't notice or care.
Check out the database result again and look at roles
. I know, it's strange: this
is an array
field. I'll hold command and click to open the base User
class from
FOSUserBundle. See, roles
holds an array. When you save, it automatically serializes
to a string in the database. This is done with the Doctrine array
field type.
Notice that even though it's empty in the database, when we login, our user has
ROLE_USER
. This is thanks to the base User
class from FOSUserBundle: it makes
sure the User
has whatever roles are stored in the database plus ROLE_USER
.
Let's try an example of a User
that has a different role. Run the console:
php bin/console
Ah, so the bundle comes with a few handy console commands, for activating, creating, promoting and demoting users. Let's create a new one:
php bin/console fos:user:create
How about admin
, admin@aquanote.com
and password admin
.
And now promote it!
php bin/console fos:user:promote
Hmm, let's give admin
, ROLE_ADMIN
. Ok, try the query again:
php bin/console doctrine:query:sql 'SELECT * FROM user'
Booya! Our new user has ROLE_ADMIN
! Quick, go login! Well, logout first, then
go login! Use admin
and admin
. Woohoo! We have both ROLE_USER
and ROLE_ADMIN
.
In your app, if you want to give different roles to your users, you have 2 options.
First, via the command line by using fos:user:promote
. If you only have a few users
that need special permissions, this is a great option. Or, you can create a user
admin area and use the ChoiceType
with the 'multiple' => true
and 'expanded' => true
to select the roles as checkboxes.
Ok, time to squash the ugly and make the FOSUserBundle pages use our layout!
// composer.json
{
"require": {
"php": ">=5.5.9",
"symfony/symfony": "3.3.*", // v3.3.18
"doctrine/orm": "^2.5", // v2.7.0
"doctrine/doctrine-bundle": "^1.6", // 1.10.3
"doctrine/doctrine-cache-bundle": "^1.2", // 1.3.5
"symfony/swiftmailer-bundle": "^2.3", // v2.5.4
"symfony/monolog-bundle": "^2.8", // v2.12.1
"symfony/polyfill-apcu": "^1.0", // v1.3.0
"sensio/distribution-bundle": "^5.0", // v5.0.18
"sensio/framework-extra-bundle": "^3.0.2", // v3.0.25
"incenteev/composer-parameter-handler": "^2.0", // v2.1.2
"knplabs/knp-markdown-bundle": "^1.4", // 1.5.1
"doctrine/doctrine-migrations-bundle": "^1.1", // v1.3.2
"composer/package-versions-deprecated": "^1.11", // 1.11.99
"friendsofsymfony/user-bundle": "^2.0" // v2.0.0
},
"require-dev": {
"sensio/generator-bundle": "^3.0", // v3.1.4
"symfony/phpunit-bridge": "^3.0", // v3.2.7
"nelmio/alice": "^2.1", // v2.3.1
"doctrine/doctrine-fixtures-bundle": "^2.3", // v2.4.1
"symfony/web-server-bundle": "^3.3"
}
}