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.

  1. We will name our project as Authentication
  2. Create a folder called Authentication under the Symfony directory we made in the last tutorial. For me its here C:\Workspace\Symfony\Authentication
  3. Open your command line and point it to the above created folder
  4. Type “symfony init-project Authentication” and it will create same directory structure that we discussed in last tutotial.
  5. Lets create an application inside this, we will name it as Auth
  6. Type “symfony init-app Auth” and it will create an application named Auth under the apps folder. (C:\Workspace\Symfony\Authentication\apps\Auth)
  7. First we need a module called Registration, to allow our users to register.
  8. Type “symfony init-module Auth Registration” and it will tell symfony to create a module named Registration inside our application Auth
  9. 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
  10. Open C:\Workspace\Symfony\Authentication\apps\Auth\modules\Registration\actions\actions.class.php and comment out the forwarding as discussed in last tutorial.
  11. Go to your command line and type “symfony clear-cache“. Read why we do this in the last tutorial.
  12. 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.

  1. 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.
  2. 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)
    
  3. 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.
  4. We are trying to make a table called users having fields like id, username, emailid and password
  5. 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
  6. 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.

  7. 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.
  8. 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 ;)



Bookmark and Share

Blogged with the Flock Browser

Tags: , , , , ,

--------------------------------------

Related Posts

--------------------------------------
  • Symfony model layer tips and tricks - A PHP Framework - Part 3
  • Getting started with Symfony - A PHP Framework - Part 1
  • How to create a social networking website in 5 minutes
  • How to get started with web development?
  • Gain admin access on windows system using your guest account
  • Tags: , , , , ,

    1. 19 Responses to “How to build a login-registration system using Symfony - A PHP Framework - Part 2”

    2. By CodeGuruNo Gravatar on Oct 29, 2008 | Reply

      Excellent tutorial. Your code vault zipped file just worked like anything. Looking forward to more implementation examples.

    3. By JD001No Gravatar on Oct 29, 2008 | Reply

      Thanks for this shit. You took a load off from me by posting the codes :)

    4. By adminNo Gravatar 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 ;)

    5. By SowmyaNo Gravatar on Oct 30, 2008 | Reply

      keep up the good work :)

    6. By JanakiramanNo Gravatar on Oct 30, 2008 | Reply

      Really a nice one and helped me a lot.. Thanks for the stuff….

    7. By JanakiramanNo Gravatar 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.

    8. By adminNo Gravatar 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 :)

    9. By Leek AdamNo Gravatar on Oct 30, 2008 | Reply

      Nice tutorial again Abhi. I am really glued to your blog. Keep them coming.

    10. By JanakiramanNo Gravatar 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.

    11. By adminNo Gravatar 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 ;)

    12. By SteveNo Gravatar 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?

    13. By adminNo Gravatar 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 :)

    14. By adminNo Gravatar 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.

    15. By SubairNo Gravatar 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

    16. By adminNo Gravatar 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

    17. By netra1978No Gravatar on Nov 18, 2008 | Reply

      where is the code??????

    18. By adminNo Gravatar 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.

    1. 2 Trackback(s)

    2. Nov 3, 2008: rpsblog.com » A week of symfony #96 (27 october -&gt; 2 november 2008)
    3. Nov 11, 2008: Symfony model layer tips and tricks - A PHP Framework - Part 3 | Abhi's Weblog

    Post a Comment