Symfony

Symfony är ett php ramverk. I skrivande stund har symfony2 precis kommit ut med en betaversion. Ramverket är franskt och jag har jobbat med detta ramverk sedan 2009.

Symfony2 beta upload file

Yes, there is currently no documentation on how to upload a file in Symfony2. Yes, it took me hours to figure out how to do it. Yes, of course I will share!
I don’t think this is the correct Symfony way to do it, but it works and I believe it is secure. I would like to access the $uploadedFile object from the $form object instead of the $request. If you know how to do it, please write a comment.

The code is pretty straight forward and documented so I figure I just post it.

My controller:

public function indexAction()
{
    //create a simple form with one filed called "dataFile" of type "file"
    $form = $this->get('form.factory')
	 ->createBuilder('form')
	 ->add("dataFile","file", array("required"=>true))
	 ->getForm();

    $request = $this->get('request');
    if ($request->getMethod() == 'POST') {
        //bind the request, (note the enctype in the template)
      	$form->bindRequest($request); 

    	if ($form->isValid()) {
            //if the form is valid, try to get the uploaded file object
            //Symfony\Component\HttpFoundation\File\UploadedFile
    	    $files=$request->files->get($form->getName());
    	    $uploadedFile=$files["dataFile"]["file"]; //"dataFile" is the name on the field

            //once you have the uploadedFile object there is some sweet functions you can run
    	    $uploadedFile->getPath();//returns current (temporary) path
    	    $uploadedFile->getOriginalName();
    	    $uploadedFile->getMimeType();

            //and most important is move(),
    	    $uploadedFile->move(
    	        $_SERVER['DOCUMENT_ROOT']."/uploads",
    	        $uploadedFile->getOriginalName()
    	    );

    	    $this->get('session')->setFlash('notice', 'The file is uploaded!');
    	}
    	else{
    		//form is not valid

    	}
    }//end if request method == POST	

    return $this->render('ApplicationMyBundle:Default:index.html.twig',
        array("form"=>$form->createView()));
    }

My template:

{# note the form_enctype, without it the form will not bind in the controller #}
<form action="" method="post" {{ form_enctype(form) }}>
{{ form_widget(form) }}
<input type="submit" class="submit" id="form_submit" value="Save" />
</form>

Symfony2 är nära

När man utvecklar i PHP så vet man att det lätt kan bli lite kladdigt. Man importerar saker hit och dit och snart har man ingen koll på vad som gör vad eller vilken fil som används när. Många skickliga utvecklare har ett eget litet system när man utvecklar en ny applikation. Man har vissa mappar och vissa regler. Men när en annan eller en tredje utvecklare kommer in i projektet så blir det bara kaos.

Ett par franska utvecklare har skrivit PHP ramverket Symfony. Det är tokigt objektorienterat och det gör många av programmerarens simpla autonoma uppgifter automatiskt. Till exempel skapa databasklasser, skriva formulär, verifiera formulär och mycket mer.

Nu är det snart dags för Symfony2 att lanseras. Det är många prestanda fördelar jämfört med version 1.4. Jag längtar att få testa det. Jag har ett par projekt som jag ska testa Symfony2 med i sommar.

Symfony 2.0 looks interesting

I got an hint from Growyn that a new version of the framework Symfony will be released this year. It’s called Symfony Reloded 2.0. It said that it 3 times faster than 1,4 and uses only half the memory.

I have been using Symfony framework for almost a year now and I’m really impressed by its features and its flexibility. I really look forward to the new version of the framework. As a matter a fact I will try the beta of 2.0 to a bigger project this summer. If you are interested in developing Symfony I can recommend you the Jobeet tutorial. It takes a while to read through but you’ll learn what the framework can do for you.

Symfony gives me headache

Symfony really gives me headache sometimes. It took me an hour to figure it out this time. This was my problem:
When executing the command

php symfony doctrine:build --all

I got this error:

SQLSTATE[HY000]: General error: 1005 Can't create table

It may be that you are trying to set a relation between two tables but the references have different types. In Symfony 1.2 sfDoctrineGuardPlugin use a integer(4) (INTEGER) as primary key. In Symfony 1.4 sfDoctrineGuardPlugin use a integer(4) (BIGINT) as primary key.

It’s a good thing to know and I hope you didn’t spend that much time trying to solve this yourself. Blog about this article to help others.

Mitt första uppdrag på Growyn

Idag hade jag ett möte med David igen. Det var ett litet upptaktsmöte för att se hur det hade gått för mig i mitt försök att lära mig Symfony. Sen visade han mig vad jag skulle jobba med den närmaste tiden samt gick igenom vissa praktiska delar. Innan jag började på Growyn så tyckte jag att jag hade en hyfsat bra koll på programmering men samtidigt visste jag att jag var långt i från en guru. Men nu när Growyn-porten har öppnats känner jag har massor att lära för att bli ”hyfsat bra”. David visade mig hur man arbetar i projekt med flera människor, hur man rapporterar buggar och hur man talar om för gruppen vilka uppdrag man själv försöker lösa.

Jag tycker verkligen att det ska bli intressant att jobba på detta sätt och samtidigt lära mig Symfony. Mitt första uppdrag är en enklare funktion som gör det möjligt för andra funktioner att växa på. Det är en väldigt lätt uppgift men svårigheten för mig är att göra det på ”rätt sätt” i Symfony. I ”vanlig” PHP, tex i mina projekt som Krogguiden, hade jag löst uppgiften på mindre än en kvart. Men men, både David och jag tror att det är en bra uppgift för mig att börja koda i Symfony med.

Denna vecka kommer jag läsa källkoden för att öka min förståelse för ramverket och lära mig några av funktionerna som David gjort innan. Källkoden består av ett par 100 filer och tusentals rader kod, men till skillnad mot Strindberg så behöver man inte läsa allt för att förstå allt.