70
Starting your new project with Symfony2 Ryan Weaver @weaverryan Thursday, August 18, 11

Symfony2: Get your project started

Embed Size (px)

Citation preview

Page 1: Symfony2: Get your project started

Starting your newproject withSymfony2

Ryan Weaver@weaverryan

Thursday, August 18, 11

Page 2: Symfony2: Get your project started

Who is this dude?

• Co-author of the Symfony2 Docs

• Core Symfony2 contributor

• Co-owner of KnpLabs US

• Fiancee of the much more talented @leannapelham

http://www.knplabs.com/enhttp://www.github.com/weaverryan

Thursday, August 18, 11

Page 3: Symfony2: Get your project started

Quality. Innovation. Excitement.

• Training

• Coaching / Consulting

• Fun, high-quality custom dev

KnpLabs

Thursday, August 18, 11

Page 4: Symfony2: Get your project started

Act 1:

Downloading the Symfony Standard Edition

http://bit.ly/sf2-install

Thursday, August 18, 11

Page 5: Symfony2: Get your project started

• Symfony offers “distributions” (think Ubuntu)

• The “Standard Distribution” is a fully-functional skeleton web application

• The Standard Distribution *is* the starting point for your new project: download it and begin developing your new application

The “Standard Distribution”

Thursday, August 18, 11

Page 6: Symfony2: Get your project started

Step 1: Get it!

http://symfony.com/download

Thursday, August 18, 11

Page 7: Symfony2: Get your project started

Step 2: Unzip it!

$ cd /path/to/webroot

$ tar zxvf /path/to/Symfony_Standard_2.0.0.tgz

Thursday, August 18, 11

Page 8: Symfony2: Get your project started

php bin/vendors install

• Run the following command:

• ...which should fill up your vendor/ directory

Step 3: Download the vendors

Thursday, August 18, 11

Page 9: Symfony2: Get your project started

php bin/vendors install

• The “standard edition” project itself is just a few directories and a few files

• But it relies a group of 3rd-party libraries

• The Standard edition packages a script that downloads these libraries into your vendor/ directory by reading the “deps” file

Step 3: Explained

Thursday, August 18, 11

Page 10: Symfony2: Get your project started

[symfony] git=http://github.com/symfony/symfony.git version=v2.0.0

[twig] git=http://github.com/fabpot/Twig.git version=v1.1.1

[monolog] git=http://github.com/Seldaek/monolog.git version=1.0.0

[doctrine] git=http://github.com/doctrine/doctrine2.git version=2.1.0

[swiftmailer] git=http://github.com/swiftmailer/swiftmailer.git version=v4.1.0

The “deps” file

Thursday, August 18, 11

Page 11: Symfony2: Get your project started

Step 4: Check your config

http://localhost/Symfony/web/config.php

Thursday, August 18, 11

Page 12: Symfony2: Get your project started

• Fix any major problems (e.g. missing libraries, permissions issues) that Symfony reports

Tend to your Garden

Thursday, August 18, 11

Page 13: Symfony2: Get your project started

http://bit.ly/sf2-permsThe Docs

Cache and log permissions • The app/cache and app/logs directories must be writable by your web server

• There are several ways to do this depending on your setup and platform

Thursday, August 18, 11

Page 14: Symfony2: Get your project started

Head to the homepage!

This *is* your first Symfony2

page!!!

http://localhost/Symfony/web/app_dev.php

Thursday, August 18, 11

Page 15: Symfony2: Get your project started

• So far we’ve:

‣ Downloaded the Standard Distribution‣ Downloaded the vendor libraries‣ Setup any pre-reqs needed for Symfony

‣ Navigated to the homepage of our project: a sample page packaged with the distribution

End of Act1

Thursday, August 18, 11

Page 16: Symfony2: Get your project started

Act 2:

Storing the new project in git

http://bit.ly/sf2-git

Thursday, August 18, 11

Page 17: Symfony2: Get your project started

• The Standard Distribution *is* the starting point for your new project

• We’ll use “git” as our version control tool

• Initialize a new git repository inside your project:

Version Control

git init

git status

Thursday, August 18, 11

Page 18: Symfony2: Get your project started

Thursday, August 18, 11

Page 19: Symfony2: Get your project started

• Most of the files are *your* files: you’ll edit them and commit them to git

• Some files, however, shouldn’t be shared:‣ database configuration files

• Others simply don’t need to be committed‣ 3rd party libraries (each developer can download them via “bin/vendors install”)‣ cache files

Ignore Some Files

Thursday, August 18, 11

Page 20: Symfony2: Get your project started

• To ignore certain files in git, create a .gitignore file at the root of your project and specify file patterns that shouldn’t be stored in git

Ignore Some Files

Thursday, August 18, 11

Page 21: Symfony2: Get your project started

Recommended “.gitignore” file

/web/bundles//app/bootstrap*/app/cache/*/app/logs/*/vendor//app/config/parameters.ini

{{

“generated”files

db config

Thursday, August 18, 11

Page 22: Symfony2: Get your project started

• Once you’ve created the .gitignore file, you can create an initial commit

• This commit represents the starting point of your project: a fresh project with Symfony

Initial Commit

git add .

git commit -m “Initial commit of the project”

Thursday, August 18, 11

Page 23: Symfony2: Get your project started

• By convention, database (and other server-specific) configuration is stored in the app/config/parameters.ini file

• We’ve placed this file in our .gitignore

• Every new developer that downloads the project will need to create this file

Database Configuration

Thursday, August 18, 11

Page 24: Symfony2: Get your project started

• To make the creation of the parameters.ini file easy, create a parameters.ini.dist sample file that we *will* commit to git

Database Configuration

cp app/config/parameters.ini app/config/parameters.ini.dist

git add app/config/parameters.ini.dist

git commit -m “adding a sample parameters file”

Thursday, August 18, 11

Page 25: Symfony2: Get your project started

• The Standard Distribution comes with some sample pages inside a demo bundle

• Remove these before developing your own application

Removing demo pages

https://github.com/symfony/symfony-standard

Thursday, August 18, 11

Page 26: Symfony2: Get your project started

• Where are we now?

‣ The new project is stored in git

‣ Certain files are set to be ignored by git

‣ A database configuration “template” file was created to help when the project is cloned by new developers

Finishing up Act 2

Thursday, August 18, 11

Page 27: Symfony2: Get your project started

Act 3:

What Symfony does...in exactly 3 slides

http://bit.ly/sf2-http

Thursday, August 18, 11

Page 28: Symfony2: Get your project started

Your job: turn a request into a response

Client(e.g. browser) Your App

/foo

the request

<h1>Foo!</h1>

the response

But as your app grows, staying organized is tough, wheels are reinvented and code tends

towards spaghettiThursday, August 18, 11

Page 29: Symfony2: Get your project started

Request to Response Structure• Symfony gives you structure for reading each request and creating the appropriate response

e.g. app.php

1) a request executes the front controller

2) matches a route 3) executes a PHP function that you write

Thursday, August 18, 11

Page 30: Symfony2: Get your project started

Tools for Development• In addition to basic structure, Symfony is full of optional tools that you can choose to use when developing your application:

‣ security‣ render templates‣ send emails‣ work with the database‣ handle HTML forms‣ validation‣ caching

Thursday, August 18, 11

Page 31: Symfony2: Get your project started

Act 4:

Creating your app

http://bit.ly/sf2-page-creation

Thursday, August 18, 11

Page 32: Symfony2: Get your project started

• A standard Symfony project looks like this:

Bundles!

app/src/vendor/web/

app config - nothing too heavy

your bundles!

third-party libraries

front controllers, CSS, JS, etc

Thursday, August 18, 11

Page 33: Symfony2: Get your project started

• A bundle is a directory that holds *everything* for a single “feature” - from routing files to PHP classes to JS files

• A bundle is like a plugin, except that everything (including the core Symfony2 files) exists in a bundle

(this means you could replace the core framework libraries with your own...)

Bundles: first-class plugins

Thursday, August 18, 11

Page 34: Symfony2: Get your project started

• Symfony can generate a nice bundle skeleton on your behalf:

Creating the MainBundle

php app/console generate:bundle

• Acme/MainBundle• MainBundle• ... enter the defaults for the rest

Answer the prompts:

Thursday, August 18, 11

Page 35: Symfony2: Get your project started

Initialize the bundle

• The following was added by the task to your app/AppKernel.php file:

public function registerBundles(){ $bundles = array( // ... new Acme\MainBundle\MainBundle(), );}

Thursday, August 18, 11

Page 36: Symfony2: Get your project started

Where now?• Now that you have a bundle, you can start creating your app page-by-page:

‣ create a route‣ create a controller‣ create and return a Response object (usually via a template)

• As you develop more features, you may create more bundles, but it’s up to you

Thursday, August 18, 11

Page 37: Symfony2: Get your project started

Open Source Bundles• Lots of 3rd-party bundles are also available to help you:

‣ FOSUserBundle - user management

‣ KnpMenuBundle - really smart menus

‣ DoctrineFixturesBundle‣ StofDoctrineExtensionsBundle - easy doctrine behaviors

‣ AvalancheImagineBundle - image manipulation

‣ KnpPaginatorBundle

... and many more...Thursday, August 18, 11

Page 38: Symfony2: Get your project started

http://symfony2bundles.org/

Thursday, August 18, 11

Page 39: Symfony2: Get your project started

Act 5:

Playing with Behat

http://behat.org

Thursday, August 18, 11

Page 40: Symfony2: Get your project started

• Behat is a tool that lets you focus on developing to the intended behavior of your application

• You write scenarios that describe the behavior of the features needed, which are then executed as tests against your application

What is Behat

Thursday, August 18, 11

Page 41: Symfony2: Get your project started

Example Behat Feature

Feature: Registration In order to have an account with the system As an unauthenticated user I can register for a new account

Scenario: Navigate to the registration page Given I am on "/" When I follow "Register" Then the response status code should be 200 And the "h1" element should contain "Register"

Thursday, August 18, 11

Page 42: Symfony2: Get your project started

• To use behat to test the functionality of your application, you’ll need to install both Behat and Mink

• Behat is a command-line executable that you install via pear

• Details: behat.org

Installing Behat

Thursday, August 18, 11

Page 43: Symfony2: Get your project started

• To use behat to test the functionality of your application, you’ll need to install both Behat and Mink

• Behat is a command-line executable that you install via pear

Installing Behat

pear channel-discover pear.behat.orgpear channel-discover pear.symfony.compear install behat/behatpear install behat/mink

Thursday, August 18, 11

Page 44: Symfony2: Get your project started

• To use Behat and Mink in your project, install BehatBundle and MinkBundle

1. Add the deps file2. Configure the autoloader3. Enable the bundles4. Configure the bundles5. Start describing your features!

Integrating into your project

http://bit.ly/mink-bundleThursday, August 18, 11

Page 45: Symfony2: Get your project started

• Remember that the goal of Behat is to let you describe the behavior of your application as human-readable sentences

• This allows you to describe the behavior of each feature in a common language, which is executed as tests against your application

• Develop a feature until the test passes,then move on

Behavior-Driven Development

Thursday, August 18, 11

Page 46: Symfony2: Get your project started

registration.feature

Feature: Registration In order to have an account with the system As an unauthenticated user I can register for a new account

Scenario: Navigate to the registration page Given I am on "/" When I follow "Register" Then the response status code should be 200 And the "h1" element should contain "Register"

{Describes your feature, but

not executed by Behat

http://bit.ly/gherkin-docs

{Each Scenario is actually executed as a test against

your application

This “format” is called “Gherkin”

Thursday, August 18, 11

Page 47: Symfony2: Get your project started

Thursday, August 18, 11

Page 48: Symfony2: Get your project started

• Behind the scenes, each line of the scenario is executed against a collection of “definitions”

• A definition is a regular expression pattern and a function

• When a line in your scenario matches a definition’s regular expression, that definition is executed

• Mink comes with a great list ofbuilt-in definitions

Behind-the-scenes

Thursday, August 18, 11

Page 49: Symfony2: Get your project started

Thursday, August 18, 11

Page 50: Symfony2: Get your project started

• By default, tests are run in a “headless” or command-line-only browser

• This means that your testing your application as if Javascript were off

• You can also do in-browser testing by leveraging another library called Sahi

Testing Javascript

Thursday, August 18, 11

Page 51: Symfony2: Get your project started

In-browser testing

Feature: Registration In order to have an account with the system As an unauthenticated user I can register for a new account

@javascript Scenario: Navigate to the registration page Given I am on "/" When I follow "Register" Then the response status code should be 200 And the "h1" element should contain "Register"

Activates Sahi

Thursday, August 18, 11

Page 52: Symfony2: Get your project started

• By adding “@javascript”, the test will be run through Sahi

• Sahi will physically open up a browser and execute the test

• You can use headless browsers for some tests and Sahi for others that require Javascript functionality

Testing Javascript

Thursday, August 18, 11

Page 53: Symfony2: Get your project started

After dinner mint:

The HTTP Lifecycle

Thursday, August 18, 11

Page 54: Symfony2: Get your project started

HTTP is Simple

• HTTP is a text language that allows two machines to communicate with each other

• Communication on the web is always a two-step process:

1) The client sends an HTTP request2) The server send back an HTTP response

Thursday, August 18, 11

Page 55: Symfony2: Get your project started

HTTP Communication - from space

Client(e.g. browser) Your App

/foo

the request

<h1>Foo!</h1>

the response

Thursday, August 18, 11

Page 56: Symfony2: Get your project started

The Request

• The actual request looks something like this:

GET /foo HTTP/1.1Host: knplabs.comAccept: text/htmlUser-Agent: Mozilla/5.0 (Macintosh)

Thursday, August 18, 11

Page 57: Symfony2: Get your project started

This simple message communicates everything

necessary about exactly which resource the client is requesting

Thursday, August 18, 11

Page 58: Symfony2: Get your project started

The Request

GET /foo HTTP/1.1Host: knplabs.comAccept: text/htmlUser-Agent: Mozilla/5.0 (Macintosh)

• The first line contains the two most important pieces of information:

HTTP method URI

Thursday, August 18, 11

Page 59: Symfony2: Get your project started

The Request

HTTP method

URI The unique address or location thatidentifies the resource the client wants

The “verb” of the request: what actionyou would like to perform with theresource

Thursday, August 18, 11

Page 60: Symfony2: Get your project started

Request Methods

GET Retrieve the resource from the server

POST Create a resource on the server

PUT Update the resource on the server

DELETE Delete the resource from the server

Thursday, August 18, 11

Page 61: Symfony2: Get your project started

The Response

• And the response looks like this:

HTTP/1.1 200 OKDate: Tue, 04 Jun 2011 21:05:05 GMTServer: lighttpd/1.4.19Content-Type: text/html

<html> <h1>Foo!</h1></html>

Thursday, August 18, 11

Page 62: Symfony2: Get your project started

The Response

HTTP/1.1 200 OKDate: Tue, 04 Jun 2011 21:05:05 GMTServer: lighttpd/1.4.19Content-Type: text/html

<html> <h1>Foo!</h1></html>

HTTP Status code

{Requestbody

Thursday, August 18, 11

Page 63: Symfony2: Get your project started

HTTP Request-Response

• In every application, and every language, you always have the same goal:

To read the HTTP request and create the appropriate HTTP response

Thursday, August 18, 11

Page 64: Symfony2: Get your project started

Request Response in PHP

• So how do you interact with HTTP requests and responses in PHP?

<?php

$uri = $_SERVER['REQUEST_URI'];$foo = $_GET['foo'];

header('Content-type: text/html');echo 'The URI requested is: '.$uri;echo 'The "foo" parameter is: '.$foo;

Thursday, August 18, 11

Page 65: Symfony2: Get your project started

Request Response in PHP

• PHP gives you access to the HTTP request via several “superglobal” arrays

• To create the HTTP response, use the the header() method to set the header lines and print content to populate the request body

Thursday, August 18, 11

Page 66: Symfony2: Get your project started

The user sends the HTTP request...

<?php// this is testing.php

$uri = $_SERVER['REQUEST_URI'];$foo = $_GET['foo'];

header('Content-type: text/html');echo 'The URI requested is: '.$uri;echo 'The "foo" parameter is: '.$foo;

• http://knplabs.com/testing.php?foo=symfony

Thursday, August 18, 11

Page 67: Symfony2: Get your project started

... and PHP sends back the HTTP response

HTTP/1.1 200 OKDate: Sat, 03 Apr 2011 02:14:33 GMTServer: Apache/2.2.17 (Unix)Content-Type: text/html

The URI requested is: /testing?foo=symfonyThe "foo" parameter is: symfony

• http://knplabs.com/testing.php?foo=symfony

Thursday, August 18, 11

Page 68: Symfony2: Get your project started

Request and Responses in Symfony

• Symfony offers a Request and Response objects that abstract the HTTP text messages into an object-oriented format

Thursday, August 18, 11

Page 69: Symfony2: Get your project started

use Symfony\Component\HttpFoundation\Request;use Symfony\Component\HttpFoundation\Response;

$request = Request::createFromGlobals();$c = 'URI: '.$request->getPathInfo();$c .= '”foo”: '.$request->query->get('foo');

$response = new Response();$response->setContent($c);$response->setStatusCode(200);$response->headers->set('Content-Type', 'text/html')

//sets the headers and then prints the content$response->send();

Thursday, August 18, 11

Page 70: Symfony2: Get your project started

Thanks!Questions?

Ryan Weaver@weaverryan

Thursday, August 18, 11