How to build a login-registration system using Symfony - A PHP Framework - Part 2
Written on October 29, 2008 – 9:21 pm | by admin
Hello again,
In the last tutorial we saw a very basic implementation which will simply print “Hello World” on your browser screen. For those who have landed up here straight here, you may want to go through this blog post. Getting started with Symfony - A PHP Framework - Part 1 By now if you have decided to go ahead with symfony and use it for your site development, this is what you will be looking for next.
You can download the code for this tutorial from google code base.
svn checkout http://abhinavsingh.googlecode.com/svn/trunk/PHP/
Frameworks/Symfony/Authentication abhinavsingh-read-only
A Registration-Login-Logout System for your site
This is mostly the first thing you end up building for your site. To be frank, I myself haven’t made this application. I will make it as I write this blog, and note down all my steps here, so that I don’t miss any detail.
- We will name our project as Authentication
- Create a folder called Authentication under the Symfony directory we made in the last tutorial. For me its here C:\Workspace\Symfony\Authentication
- Open your command line and point it to the above created folder
- Type “symfony init-project Authentication” and it will create same directory structure that we discussed in last tutotial.
- Lets create an application inside this, we will name it as Auth
- Type “symfony init-app Auth” and it will create an application named Auth under the apps folder. (C:\Workspace\Symfony\Authentication\apps\Auth)
- First we need a module called Registration, to allow our users to register.
- Type “symfony init-module Auth Registration” and it will tell symfony to create a module named Registration inside our application Auth
- As told in last tutorial copy the C:\php5\pear\data\symfony\web\sf folder to C:\Workspace\Symfony\Authentication\web\sf. At the end of this part, we will learn how can we skip this copying again and again
- Open C:\Workspace\Symfony\Authentication\apps\Auth\modules\Registration\actions\actions.class.php and comment out the forwarding as discussed in last tutorial.
- Go to your command line and type “symfony clear-cache“. Read why we do this in the last tutorial.
- Open http://localhost/Symfony/Authentication/web/ in your browser and you must get something like this.

Figure 1
OOPS! Did we missed something? Yes we did and intentionally. We could have gone to C:\Workspace\Symfony\Authentication\apps\Auth\config\routing.yml and redirected our Authentication application to our Registration Module by default. In that case we would have seen an empty page since indexSuccess.php file inside C:\Workspace\Symfony\Authentication\apps\Auth\modules\Registration\templates is empty. But since we didn’t modified the routing.yml file, it took us to the default module of symfony.
So how do we access our Registration module without modifying routing.yml file??
http://localhost/Symfony/Authentication/web/Registration/index is the answer
As a convention
http://localhost/Symfony/Authentication/web/<Module>/<ModuleFile>
this is the standard for symfony.
Hence it went to Registration module and then indexSuccess.php page inside that. Cool so we actually just followed up from our last tutorial till here. Lets now do the actual development.
Defining a layout for our website
Before we do any backend stuff, lets atleast get our site out of that blank page (http://localhost/Symfony/Authentication/web/Registration/index). However, If you view the source of that blank page, you will actually find that there are already some header, css, body tags in the source code. How is this coming? when we have an empty indexSuccess.php file.
From our last tutorial we saw the flow which symfony follows to finally display a page on the browser. But then I actually skipped a step to ease down the tutorial. In symfony we follow the Decorator Design Patterns (I hope i m not wrong here) , to get the front end stuff. Essentially Decorator Design Pattern consists of a Layout and a Content page.
In symfony our layout file is located under at C:\Workspace\Symfony\Authentication\apps\Auth\templates\layout.php. Open it up and you will know the answer to “How are those meta tags, head tags and body tags coming”.
Cool enough. Lets go back to our indexSuccess.php file of Registration module and design our website. With a little CSS and HTML, I came up with this design page for our site. Mostly inspired and stolen from my new site Gtalkbots.com

Figure 2
We will shift a bit of code from this page to our layout.php page later on so that we need now write the same modules again and again. Download all the code, from the my google code vault location given at the beginning and end of this tutorial.
Designing the backend database:
Now we need a databases schema which will save our registered user’s data. Lets create our database structure.
As talked about in last tutorial, symfony follows ORM programming technique. For this, they provide a method through which you actually need not go to your database and create tables. Symfony will do that for you. Not only this, Symfony will also allow you to skip most of the SQL queries. Lets see how.
- Open C:\Workspace\Symfony\Authentication\config\schema.yml . From extension we know that symfony follows YAML structures which is similar to XML, but a bit easy to write. We will define our table structures in this file.
- Type the following in the schema.yml file:
Propel: users: id: { type: integer, primaryKey: true, autoIncrement: true } username: varchar(100) emailid: varchar(100) password: varchar(100) - Note the indentation, it is very very important when you are using YAML. Indentation actually decides how the YAML parsers will read and interpret the information you want to write in .yml files. In our case we have a very simple schema.yml file having only one table. We will learn about what that “Propel” is all about later, but lets focus from line 2.
- We are trying to make a table called users having fields like id, username, emailid and password
- Now before Symfony makes this table for you, we need to tell symfony the database username and password. For this we have a configuration file called propel.ini, located at C:\Workspace\Symfony\yahoo\config\propel.ini
- Open it and change the lines as below:
propel.database.createUrl = mysql://root@localhost/ propel.database.url = mysql://root:password@localhost/authentication
Now go to your mysql database and create a database named authentication, which symfony will use from now on.
- Type “symfony propel-build-all” in your command line. This command will happily create a table named “users” in youy MySQL database “authentication”. Some of the possible errors which I got in the past are:
- Your PHP must be compiled with XSLT, hence enable it by going in your php.ini file
- In schema.yml file never use TABS. The YAML parsers don’t understand TABS. User SPACES intead of that.
- To cross verify check your database, if the table has been created. Now a bit about Propel.
Propel is nothing but a third-party-vendor plugin which Symfony use. It helps in parsing the YAML files, creating and executing the whole ORM module including parsing of schema.yml , creating tables, creating ORM data objects. We will slowly and gradually learn a lot more about ORM.
A look at the model layer
Another thing which the propel command did was, it created the whole ORM module. If you go to C:\Workspace\Symfony\Authentication\lib\model you can see 2 folders being created and a few files too.
For every table, propel build 5 files under the model folder. These files are basically the class files, which will provide use with a database object which we can use to select or insert data in the database.
C:\Workspace\Symfony\Authentication\lib\model\om\BaseUsers.php &
C:\Workspace\Symfony\Authentication\lib\model\om\BaseUsersPeer.php are the only 2 files which will be re-created when you run the propel command again.
The file positioned at
C:\Workspace\Symfony\Authentication\lib\model\Users.php &
C:\Workspace\Symfony\Authentication\lib\model\UsersPeer.php will be as it is from this point in time. If you write your own methods in them, they will remain as it is even when you re-create your database schema.
We will use these created ORM files to insert, delete, select data from the databases. In symfony we can actually skip writing a SQL query (though we can always write a direct query too)
Writing the backend Code:
With UI and database in shape, its time to write our backend code which will handle the registration form submission. If you notice the source code of our form, the action field is set as :
<form id=”registration” action=”<?php echo url_for(”Registration/index”); ?>” method=”POST”>
In symfony we have a lot of helper functions which we can use. In this case we users url_for helper function, which helps in generating a url with <module>/<modulefile> being passed as parameter.
So we have our form being submitted to indexSuccess.php itself, i.e. SELF.
Hence lets go to executeIndex() method in action.class.php and write the code which will handle the submitted form.
Copy the modified action.class.php file from the vault location. I have documented every line inside the code, which will walk you through the code. Understand the flow and continue reading.
However before we insert any data in the database, we need to give the database parameters. Go to
C:\Workspace\Symfony\Authentication\config\databases.yml
and uncomment the lines of code in there. Finally it should be of the following structure:
all:
propel:
class: sfPropelDatabase
param:
dsn: mysql://root:password@localhost/authentication
Lastly open:
C:\Workspace\Symfony\Authentication\apps\Auth\config\settings.yml
and go to the last line of the file. You will find
# compat_10 off
being commented out
Uncomment it and then turn on compat_10 i.e.
compat_10 on
Clear your cache, before submitting the form (symfony clear-cache) and then try to register.
If you have followed everything, you will be able to successfully able to register and visit mainSuccess.php of the module.
I have documented all the code which you can download from the vault location. Read it, try it, play with it.
PS: The best documentation is available at symfony-project website. This tutorial was intended to
build a real life scenario application using Symfony. Though I must admit that I still haven’t used 100% possible symfony
for this application, just to make it simple but still give you a feel of how things flow in symfony.
Leave a comment if you have any doubt or difficulty in implementing the code.
Do leave a comment even if you like the code
Tags: Symfony, PHP, Framework, Tutorial, MVC, Propel
--------------------------------------Related Posts
--------------------------------------
19 Responses to “How to build a login-registration system using Symfony - A PHP Framework - Part 2”
By CodeGuru
on Oct 29, 2008 | Reply
Excellent tutorial. Your code vault zipped file just worked like anything. Looking forward to more implementation examples.
By JD001
on Oct 29, 2008 | Reply
Thanks for this shit. You took a load off from me by posting the codes
By admin
on Oct 29, 2008 | Reply
Thanks. Keep tuned, in my next few post I will be posting some more code snippets (file upload, upload meter, etc etc)
That might take more off you
By Sowmya
on Oct 30, 2008 | Reply
keep up the good work
By Janakiraman
on Oct 30, 2008 | Reply
Really a nice one and helped me a lot.. Thanks for the stuff….
By Janakiraman
on Oct 30, 2008 | Reply
I have worked as said above but i have got a problem. When i try to save the data to the database it throws me a exception saying that
“throw new PropelException(”No connection params set for ” . $name);”
Please help me in sorting out..
I am using sandbox.
By admin
on Oct 30, 2008 | Reply
Hi Janakiraman,
Well this is one of the problem with symfony actually (infact with YAML)
In YAML files you should never use TABS but SPACEBAR to move around.
I have myself faced this a couple of times, and frankly speaking I couldn’t read to a solution. Only thing I could do then was:
1. Take a backup of my current project template and action files.
2. Create a fresh project and use my files from previous project.
3. Do not use previous project .yml files, since there is where the problem lies.
4. Rewrite the YAML files again, and if you are lucky, You will hit the Bull’s eye.
Why not download the whole copy of the tutorial from my code vault and try running that once?
Also are you trying this on windows?? I had this problem only on windows till now.
PS: YAML is the problem here, Use a good editor. I use SciTe on windows:
http://www.scintilla.org/SciTE.html
Hopefully this helps
By Leek Adam
on Oct 30, 2008 | Reply
Nice tutorial again Abhi. I am really glued to your blog. Keep them coming.
By Janakiraman
on Nov 1, 2008 | Reply
hi thanks for your quick response.
Please tell me which version of symfony you are using?
Will this work with symfony version 1.0.18
I am able to create the table in the database, using “symfony propel-build-all” but when trying to save i get the same error as mentioned below.
No connection params set for Propel
if ($dsn === null) {
throw new PropelException(”No connection params set for ” . $name);
}
I also checked the yml files also.
I also tried with symfony1.1 their also i get the same error.
Please help me out, i am newbie to symfony.
I trying this past three days. But i could not trace out my error.
By admin
on Nov 1, 2008 | Reply
Hi,
Sad to know you are unable to get through. Doing a
cmd> symfony -V , gives me
symfony version 1.1.2 (C:\PHP\PEAR\symfony)
Also did you tried the following:
1. Create a new project for yourself and try everything there again.
2. Download the code base from code.google.com and tried running that http://abhinavsingh.googlecode.com/files/svn-trunk-PHP-Framework-Symfony-Authentication.rar
Well I too have faced this problem 2-3 times and recreating the symfony project always help me. Though I haven’t faced this problem on Linux.
Also see if the initial 3-5 links here helps you. http://www.google.co.in/search?hl=en&q=No+connection+params+set+for+&btnG=Google+Search&meta=
I am sure this time you will be able to crack through
By Steve
on Nov 4, 2008 | Reply
Great tutorial. You mentioned a way to avoid copying the sf folder to each project, Did I miss the answer? Is it simply a matter of creating a symbolic link?
By admin
on Nov 4, 2008 | Reply
aah, missed out towards the end
I am not sure if symbolic link will help, but correct way is by setting up a virtual host:
ServerName myapp.example.com
DocumentRoot “/home/steve/myproject/web”
DirectoryIndex index.php
Alias /sf /$sf_symfony_data_dir/web/sf
AllowOverride All
Allow from All
AllowOverride All
Allow from All
In the configuration in Listing 3-1, the $sf_symfony_data_dir placeholder must be replaced by the actual path. For example, for a PEAR installation in *nix, you should type something like this:
Alias /sf /usr/local/lib/php/data/symfony/web/sf
PS: These instructions picked directly from Symfony Project website
By admin
on Nov 4, 2008 | Reply
OOPS all opening closing tags parsed away:
Refer http://www.symfony-project.org/book/1_1/03-Running-Symfony for more details. Under section Configuring the Web Server.
I hope this helps.
By Subair
on Nov 7, 2008 | Reply
Hi, I follow your tutorial above, but in the end, when I execute “symfony clear-cache” from my terminal, I got error notification;
Failed to write cache file “/var/www/Symfony/Authentication/cache/Auth/prod/config/config_settings.yml.php” generated from configuration file “config/settings.yml”.
I don’t know the cause of proble, and I confused, cause I check there is nothing ../Auth/prod directory in my file and your file.
Btw I use Ubuntu and Symfony 1.1.4
Thanks a lot
By admin
on Nov 7, 2008 | Reply
Well I haven’t check on my ubuntu yet, but on my windows symfony set up, I do have a folder with this location:
C:\Workspace\Symfony\Authentication\cache\Auth\prod\config
Well I have never encountered this error, but a guess is that it may be because of directory permissions. Can you check the permissions on the cache directory and set the permissions to 0777 in the worst case.
And a quick google search gives me a few results: Check them out here:
http://www.google.co.in/search?hl=en&q=Failed+to+write+cache+file+generated+from+configuration+file+%E2%80%9Cconfig%2Fsettings.yml%E2%80%9D&btnG=Google+Search&meta=
Hope this helps. Do let me know. I will check on my ubuntu system too if required.
Regards,
Abhinav
By netra1978
on Nov 18, 2008 | Reply
where is the code??????
By admin
on Nov 18, 2008 | Reply
At the very starting of the tutorial I gave the google code repository link. You can checkout the code from there.
You will need a cvs checkout software like tortoise for checking it out. http://tortoisesvn.tigris.org/
Do lemme know if there is any problem for you.