SlideShare a Scribd company logo
Creating a Symfony 2
Application from a
Drupal Perspective
Robyn Green
February 26, 2014
Robyn Green
●

Senior Developer and Themer for
Mediacurrent.

●

Bachelor of Science in Journalism,
Computer Science from University of
Central Arkansas.

●

Background in Media, news agencies.

●

Web app and Front End developer since
1996.

●

Live in Little Rock, Arkansas.

●

Build AngularJS, XCode, Django/Python
projects in my spare time.
What’s Going On?
● Why we talking about Symfony?
● What does this have to do with Drupal?
● Hasn’t this been covered already?
The Fine Print
● This is a high level presentation
○ There is no Symfony Apples === Drupal Oranges
The Fine Print
● This is a high level presentation
○ There is no Symfony Apples === Drupal Oranges Drupal
Blueberries
The Fine Print
● This is a high level presentation
○ There is no Symfony Apples === Drupal Oranges Drupal
Blueberries

● Won’t be going over Drupal 8
● No Drupal 7 to Drupal 8 module conversions
I solemnly swear to not rant and rave about best practices, my
opinion or procedural PHP vs MVC/OOP beyond what’s required
for Symfony 2 examples.
What Will You Do?
Build a simple Symfony 2 site using Drupal
terminology. (with examples … maybe)
MVC
Symfony: PHP web application framework using MVC
Drupal doesn’t have any sort of strict MVC requirement.

Example: PHP and SQL queries in theme tpl files.
MVC
Symfony: PHP web application framework using MVC

M: Model
● V: View
● C: Controller
●
MVC “Drupal”
Symfony: PHP web application framework using MVC
● M: Model
○ Content Types
● V: View
○ Theme template tpl files
● C: Controller
○ Modules
Lock and (down)load
Let’s create a basic site in Symfony and Drupal

Drush vs Composer
Both are CLI tools
You can install Drupal via Drush
You can install Symfony via Composer
Drush is 100% Drupal
Composer is a dependency manager for PHP. It owes
allegiance to no one
Lock and (down)load
Lock and (down)load
Lock and (down)load
Lock and (down)load
Lock and (down)load
We need to configure Symfony first
Load config.php

Fix any Problems, most likely permissions
Lock and (down)load
Plug in your database information
Lock and (down)load
Lock and (down)load
Note the URL: app_dev.php
Symfony has a built-in development environment toggle that
defaults to enabled.
This runs a different URL based on the environment
parameter set
If You Build It, They Will Come
Basic Recipe site should have … recipes
●
●
●
●
●

Title
Category
Ingredients
Instructions
Ratings. Maybe.
If You Build It, They Will Come
In Drupal, this is pretty standard*

*Field Collection and Fivestar contrib modules used
If You Build It, They Will Come
Let’s see that again, but in Symfony this
time.
If You Build It, They Will Come
Building a Bundle

php app/console generate:bundle --namespace=Tutorial/CoreBundle --format=yml
If You Build It, They Will Come

Warning: Namespace Discussions Ahead
If You Build It, They Will Come
Building a Bundle

php app/console generate:bundle --namespace=Tutorial/CoreBundle --format=yml

Namespaces. There are standards to how this is done and Drupal is currently
using PSR-0 but heavily debating a move to PSR-4.
Symfony as of 2.4 still uses PSR-0, 1 or 2.
http://symfony.com/doc/current/contributing/code/standards.html
If You Build It, They Will Come
Building a Bundle

php app/console generate:bundle --namespace=Tutorial/CoreBundle --format=yml

Tutorial here is the vendor name.
CoreBundle is the package name.
If You Build It, They Will Come
Building a Bundle

php app/console generate:bundle --namespace=Recipes/WebBundle --format=yml

YAML Format. From Symfony’s own documentation:
“YAML, YAML Ain't Markup Language, is a human friendly data serialization
standard for all programming languages.”
If You Build It, They Will Come
YAML

Drupal 7 Module .info

YAML
If You Build It, They Will Come
Ignore Acme - default example
We’ve got a Tutorial directory
CoreBundle falls under that
Everything related to that
bundle is in here
Symfony Content Types
That’s all great, but what about our Drupal
Content Type?
●

We have to declare the bundle before
we can generate the entity.

Don’t get confused with between Models, Entities,
Bundles and Content Types.
Symfony Content Types
Building an Entity
php app/console doctrine:generate:entity --entity="TutorialCoreBundle:recipe"

The console is going to ask us about fields in this entity. Let’s
treat it like our content type*

*we can pass fields in the command as a shortcut, but we’ll keep it simple here.
Symfony Content Types
Symfony Content Types
What does this look like in Drupal?
Symfony Content Types
Building an Entity
Think about relationships when deciding fields.
Ingredients is better as its own Entity, not on it’s own as a
Field. We’ll establish a Many-to-Many relationship.
Categories as well.
Symfony Content Types
Building an Entity
Drupal: Nodereferences, Taxonomy, even Images - anything
that needs a complex set of its own fields or data is perhaps
better suited as its own Entity in Symfony
We have to tell Symfony these items will have a relationship
In Drupal, the power of the community has done this for us
with modules like Entity Reference and Node Reference
Symfony Content Types
Building an Entity
ManyToMany
OneToMany
ManyToOne
OneToOne
These relationships are extremely powerful, and
unfortunately beyond the scope of what we can cover here.
Symfony Content Types
Building an Entity
What do the fields in this Entity look like?
src/Tutorial/CoreBundle/Entity/recipe.php
/**
* @var string
*
* @ORMColumn(name="category", type="string", length=255)
*/
private $category;
Symfony Content Types
Building an Entity
So that’s it, we have our content type minus the
different relationships?
Not quite.
Symfony Content Types
Building an Entity
We have to tell Symfony to update our schema:
php app/console doctrine:schema:update --force
One Data Entry to Rule Them All
Drupal
One Data Entry to Rule Them All
Symfony

Remember, this is just a framework.
Also, don’t do mysql inserts directly like that. It’s hard to
establish relationships by hand.
One Data Entry to Rule Them All
$RecipeObj = new Recipe();
$RecipeObj->setTitle(“Yummy Recipe”);
$RecipeObj->setInstructions(“Some set of instructions”);
$RecipeObj->setCategory($CategoryObj);
$RecipeObj->setRating(2.5);
$em = $this->getDoctrine()->getManager();
$em->persist($RecipeObj);
$em->flush();
My First Symfony Site
How do we let Symfony know about our
new bundle?
Routing
src/Tutorial/CoreBundle/Resources/routing.yml
My First Symfony Site
By Default, our bundle routing looks like this:
tutorial_core_homepage:
pattern: /hello/{name}
defaults: { _controller: TutorialCoreBundle:Default:index }

Which we can access here:
http://localhost/symfony/web/app_dev.php/hello/test
My First Symfony Site
By Default, our bundle routing looks like this:
tutorial_core_homepage:
pattern: /hello/{name}
defaults: { _controller: TutorialCoreBundle:Default:index }

Which we can access here:
http://localhost/symfony/web/app_dev.php/hello/test
My First Symfony Site

Imagine trying to build a custom Drupal module
page and not implementing hook_menu()
This is the same logic behind Symfony routing
My First Symfony Site
My First Symfony Site
Let’s open
src/Tutorial/CoreBundle/Resources/routing.yml

pattern:

/hello/{name}

Change To
pattern:

/

We might as well set it to our homepage.
My First Symfony Site
Because we’ve removed the {name} placeholder,
we have to update our Controller and Twig.
src/Tutorial/CoreBundle/Controller/DefaultController.php
$recipes = $this->getDoctrine()
->getRepository(TutorialCoreBundle:recipe')
->findBy(array(), array('name' => 'asc'));
return $this->render('TutorialCoreBundle:Default:index.html.
twig',
array('recipes' => $recipes));
My First Symfony Site
What did we just do?
getRepository(TutorialCoreBunder:recipe')
->findBy(array(), array('name' => 'asc'))

Is basically the same as building a View
- of node.type = ‘recipe’
- sort by node.title, asc
But instead of outputting formatting or building a block, we’re
just storing a collection of objects.
My First Symfony Site
What did we just do?
We pass that $recipes collection on to Twig
My First Symfony Site
Twig index.html.twig
●

Drupal’s page.tpl.php

●

We can add whatever markup we need, but no PHP

●

Even better, define a base.html.twig and extend it

●

Extend allows us to use all the features of the parent, but
override when necessary

{% extends 'TutorialCoreBundle:Default:base.html.twig' %}
My First Symfony Site
Twig index.html.twig
<div>
{% for recipe in recipes %}
<h1>{{ recipe.title }}</h1>
{% endfor %}
</div>
My First Symfony Site
Twig index.html.twig
My First Symfony Site
Drupal page.tpl.php
My First Symfony Site
Twig
My First Symfony Site
Twig
One last thing ...
My First Symfony Site
Twig index.html.twig
My First Symfony Site
Twig index.html.twig
Except, that wasn’t Twig
That was Django. Python.
My First Symfony Site
Django index.html
My First Symfony Site
Twig index.html.twig
Because the backend logic is decoupled from the front
end display, the markup structure is so similar any
themer or front end developer can pick up these
templates without first having to learn the backend
code.
Thank You!

Questions?
@Mediacurrent

Mediacurrent.com

slideshare.net/mediacurrent
Ad

More Related Content

What's hot (20)

A dive into Symfony 4
A dive into Symfony 4A dive into Symfony 4
A dive into Symfony 4
Michele Orselli
 
Symfony2 Introduction Presentation
Symfony2 Introduction PresentationSymfony2 Introduction Presentation
Symfony2 Introduction Presentation
Nerd Tzanetopoulos
 
Symfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worldsSymfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worlds
Ignacio Martín
 
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
Ryan Weaver
 
Symfony Components
Symfony ComponentsSymfony Components
Symfony Components
guest0de7c2
 
Keeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro frameworkKeeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro framework
Jeremy Kendall
 
Effective Doctrine2: Performance Tips for Symfony2 Developers
Effective Doctrine2: Performance Tips for Symfony2 DevelopersEffective Doctrine2: Performance Tips for Symfony2 Developers
Effective Doctrine2: Performance Tips for Symfony2 Developers
Marcin Chwedziak
 
Keeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro frameworkKeeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro framework
Jeremy Kendall
 
PHP 良好實踐 (Best Practice)
PHP 良好實踐 (Best Practice)PHP 良好實踐 (Best Practice)
PHP 良好實踐 (Best Practice)
Win Yu
 
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and moreSymfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Ryan Weaver
 
Short Intro to PHP and MySQL
Short Intro to PHP and MySQLShort Intro to PHP and MySQL
Short Intro to PHP and MySQL
Jussi Pohjolainen
 
Keeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro FrameworkKeeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro Framework
Jeremy Kendall
 
Symfony2 San Francisco Meetup 2009
Symfony2 San Francisco Meetup 2009Symfony2 San Francisco Meetup 2009
Symfony2 San Francisco Meetup 2009
Fabien Potencier
 
Symfony CMF - PHP Conference Brazil 2011
Symfony CMF - PHP Conference Brazil 2011Symfony CMF - PHP Conference Brazil 2011
Symfony CMF - PHP Conference Brazil 2011
Jacopo Romei
 
Php tutorial
Php tutorialPhp tutorial
Php tutorial
Prof.Dharmishtha R. Chaudhari
 
PHP 5.3 Overview
PHP 5.3 OverviewPHP 5.3 Overview
PHP 5.3 Overview
jsmith92
 
Ruby on Rails at PROMPT ISEL '11
Ruby on Rails at PROMPT ISEL '11Ruby on Rails at PROMPT ISEL '11
Ruby on Rails at PROMPT ISEL '11
Pedro Cunha
 
O que vem por aí com Rails 3
O que vem por aí com Rails 3O que vem por aí com Rails 3
O que vem por aí com Rails 3
Frevo on Rails
 
Symfony console: build awesome command line scripts with ease
Symfony console: build awesome command line scripts with easeSymfony console: build awesome command line scripts with ease
Symfony console: build awesome command line scripts with ease
Oscar Merida
 
ReactPHP
ReactPHPReactPHP
ReactPHP
Philip Norton
 
Symfony2 Introduction Presentation
Symfony2 Introduction PresentationSymfony2 Introduction Presentation
Symfony2 Introduction Presentation
Nerd Tzanetopoulos
 
Symfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worldsSymfony & Javascript. Combining the best of two worlds
Symfony & Javascript. Combining the best of two worlds
Ignacio Martín
 
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
The Coolest Symfony Components you’ve never heard of - DrupalCon 2017
Ryan Weaver
 
Symfony Components
Symfony ComponentsSymfony Components
Symfony Components
guest0de7c2
 
Keeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro frameworkKeeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro framework
Jeremy Kendall
 
Effective Doctrine2: Performance Tips for Symfony2 Developers
Effective Doctrine2: Performance Tips for Symfony2 DevelopersEffective Doctrine2: Performance Tips for Symfony2 Developers
Effective Doctrine2: Performance Tips for Symfony2 Developers
Marcin Chwedziak
 
Keeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro frameworkKeeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro framework
Jeremy Kendall
 
PHP 良好實踐 (Best Practice)
PHP 良好實踐 (Best Practice)PHP 良好實踐 (Best Practice)
PHP 良好實踐 (Best Practice)
Win Yu
 
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and moreSymfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Symfony Guard Authentication: Fun with API Token, Social Login, JWT and more
Ryan Weaver
 
Short Intro to PHP and MySQL
Short Intro to PHP and MySQLShort Intro to PHP and MySQL
Short Intro to PHP and MySQL
Jussi Pohjolainen
 
Keeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro FrameworkKeeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro Framework
Jeremy Kendall
 
Symfony2 San Francisco Meetup 2009
Symfony2 San Francisco Meetup 2009Symfony2 San Francisco Meetup 2009
Symfony2 San Francisco Meetup 2009
Fabien Potencier
 
Symfony CMF - PHP Conference Brazil 2011
Symfony CMF - PHP Conference Brazil 2011Symfony CMF - PHP Conference Brazil 2011
Symfony CMF - PHP Conference Brazil 2011
Jacopo Romei
 
PHP 5.3 Overview
PHP 5.3 OverviewPHP 5.3 Overview
PHP 5.3 Overview
jsmith92
 
Ruby on Rails at PROMPT ISEL '11
Ruby on Rails at PROMPT ISEL '11Ruby on Rails at PROMPT ISEL '11
Ruby on Rails at PROMPT ISEL '11
Pedro Cunha
 
O que vem por aí com Rails 3
O que vem por aí com Rails 3O que vem por aí com Rails 3
O que vem por aí com Rails 3
Frevo on Rails
 
Symfony console: build awesome command line scripts with ease
Symfony console: build awesome command line scripts with easeSymfony console: build awesome command line scripts with ease
Symfony console: build awesome command line scripts with ease
Oscar Merida
 

Similar to Create a Symfony Application from a Drupal Perspective (20)

Hands-on with the Symfony2 Framework
Hands-on with the Symfony2 FrameworkHands-on with the Symfony2 Framework
Hands-on with the Symfony2 Framework
Ryan Weaver
 
The Naked Bundle - Symfony Usergroup Belgium
The Naked Bundle - Symfony Usergroup BelgiumThe Naked Bundle - Symfony Usergroup Belgium
The Naked Bundle - Symfony Usergroup Belgium
Matthias Noback
 
The Naked Bundle - Symfony Barcelona
The Naked Bundle - Symfony BarcelonaThe Naked Bundle - Symfony Barcelona
The Naked Bundle - Symfony Barcelona
Matthias Noback
 
The Naked Bundle - Symfony Live London 2014
The Naked Bundle - Symfony Live London 2014The Naked Bundle - Symfony Live London 2014
The Naked Bundle - Symfony Live London 2014
Matthias Noback
 
Sympal - Symfony CMS Preview
Sympal - Symfony CMS PreviewSympal - Symfony CMS Preview
Sympal - Symfony CMS Preview
Jonathan Wage
 
Symfony finally swiped right on envvars
Symfony finally swiped right on envvarsSymfony finally swiped right on envvars
Symfony finally swiped right on envvars
Sam Marley-Jarrett
 
Fabien Potencier "Symfony 4 in action"
Fabien Potencier "Symfony 4 in action"Fabien Potencier "Symfony 4 in action"
Fabien Potencier "Symfony 4 in action"
Fwdays
 
Using HttpKernelInterface for Painless Integration
Using HttpKernelInterface for Painless IntegrationUsing HttpKernelInterface for Painless Integration
Using HttpKernelInterface for Painless Integration
CiaranMcNulty
 
Ran Mizrahi - Symfony2 meets Drupal8
Ran Mizrahi - Symfony2 meets Drupal8Ran Mizrahi - Symfony2 meets Drupal8
Ran Mizrahi - Symfony2 meets Drupal8
Ran Mizrahi
 
Oop's in php
Oop's in php Oop's in php
Oop's in php
umesh patil
 
Creating a modern web application using Symfony API Platform Atlanta
Creating a modern web application using  Symfony API Platform AtlantaCreating a modern web application using  Symfony API Platform Atlanta
Creating a modern web application using Symfony API Platform Atlanta
Jesus Manuel Olivas
 
Symfony quick tour_2.3
Symfony quick tour_2.3Symfony quick tour_2.3
Symfony quick tour_2.3
Frédéric Delorme
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
Ralf Eggert
 
Symfony tips and tricks
Symfony tips and tricksSymfony tips and tricks
Symfony tips and tricks
Javier Eguiluz
 
Create Your Own Framework by Fabien Potencier
Create Your Own Framework by Fabien PotencierCreate Your Own Framework by Fabien Potencier
Create Your Own Framework by Fabien Potencier
Himel Nag Rana
 
Symfony 4 & Flex news
Symfony 4 & Flex newsSymfony 4 & Flex news
Symfony 4 & Flex news
🌘 Alex Rock
 
Symfony 4: A new way to develop applications #phpsrb
 Symfony 4: A new way to develop applications #phpsrb Symfony 4: A new way to develop applications #phpsrb
Symfony 4: A new way to develop applications #phpsrb
Antonio Peric-Mazar
 
The Naked Bundle - Tryout
The Naked Bundle - TryoutThe Naked Bundle - Tryout
The Naked Bundle - Tryout
Matthias Noback
 
The Symfony CLI
The Symfony CLIThe Symfony CLI
The Symfony CLI
Sarah El-Atm
 
Behaviour Driven Development con Behat & Drupal
Behaviour Driven Development con Behat & DrupalBehaviour Driven Development con Behat & Drupal
Behaviour Driven Development con Behat & Drupal
DrupalDay
 
Hands-on with the Symfony2 Framework
Hands-on with the Symfony2 FrameworkHands-on with the Symfony2 Framework
Hands-on with the Symfony2 Framework
Ryan Weaver
 
The Naked Bundle - Symfony Usergroup Belgium
The Naked Bundle - Symfony Usergroup BelgiumThe Naked Bundle - Symfony Usergroup Belgium
The Naked Bundle - Symfony Usergroup Belgium
Matthias Noback
 
The Naked Bundle - Symfony Barcelona
The Naked Bundle - Symfony BarcelonaThe Naked Bundle - Symfony Barcelona
The Naked Bundle - Symfony Barcelona
Matthias Noback
 
The Naked Bundle - Symfony Live London 2014
The Naked Bundle - Symfony Live London 2014The Naked Bundle - Symfony Live London 2014
The Naked Bundle - Symfony Live London 2014
Matthias Noback
 
Sympal - Symfony CMS Preview
Sympal - Symfony CMS PreviewSympal - Symfony CMS Preview
Sympal - Symfony CMS Preview
Jonathan Wage
 
Symfony finally swiped right on envvars
Symfony finally swiped right on envvarsSymfony finally swiped right on envvars
Symfony finally swiped right on envvars
Sam Marley-Jarrett
 
Fabien Potencier "Symfony 4 in action"
Fabien Potencier "Symfony 4 in action"Fabien Potencier "Symfony 4 in action"
Fabien Potencier "Symfony 4 in action"
Fwdays
 
Using HttpKernelInterface for Painless Integration
Using HttpKernelInterface for Painless IntegrationUsing HttpKernelInterface for Painless Integration
Using HttpKernelInterface for Painless Integration
CiaranMcNulty
 
Ran Mizrahi - Symfony2 meets Drupal8
Ran Mizrahi - Symfony2 meets Drupal8Ran Mizrahi - Symfony2 meets Drupal8
Ran Mizrahi - Symfony2 meets Drupal8
Ran Mizrahi
 
Creating a modern web application using Symfony API Platform Atlanta
Creating a modern web application using  Symfony API Platform AtlantaCreating a modern web application using  Symfony API Platform Atlanta
Creating a modern web application using Symfony API Platform Atlanta
Jesus Manuel Olivas
 
PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)PHP Frameworks: I want to break free (IPC Berlin 2024)
PHP Frameworks: I want to break free (IPC Berlin 2024)
Ralf Eggert
 
Symfony tips and tricks
Symfony tips and tricksSymfony tips and tricks
Symfony tips and tricks
Javier Eguiluz
 
Create Your Own Framework by Fabien Potencier
Create Your Own Framework by Fabien PotencierCreate Your Own Framework by Fabien Potencier
Create Your Own Framework by Fabien Potencier
Himel Nag Rana
 
Symfony 4: A new way to develop applications #phpsrb
 Symfony 4: A new way to develop applications #phpsrb Symfony 4: A new way to develop applications #phpsrb
Symfony 4: A new way to develop applications #phpsrb
Antonio Peric-Mazar
 
The Naked Bundle - Tryout
The Naked Bundle - TryoutThe Naked Bundle - Tryout
The Naked Bundle - Tryout
Matthias Noback
 
Behaviour Driven Development con Behat & Drupal
Behaviour Driven Development con Behat & DrupalBehaviour Driven Development con Behat & Drupal
Behaviour Driven Development con Behat & Drupal
DrupalDay
 
Ad

More from Acquia (20)

Acquia_Adcetera Webinar_Marketing Automation.pdf
Acquia_Adcetera Webinar_Marketing Automation.pdfAcquia_Adcetera Webinar_Marketing Automation.pdf
Acquia_Adcetera Webinar_Marketing Automation.pdf
Acquia
 
Acquia Webinar Deck - 9_13 .pdf
Acquia Webinar Deck - 9_13 .pdfAcquia Webinar Deck - 9_13 .pdf
Acquia Webinar Deck - 9_13 .pdf
Acquia
 
Taking Your Multi-Site Management at Scale to the Next Level
Taking Your Multi-Site Management at Scale to the Next LevelTaking Your Multi-Site Management at Scale to the Next Level
Taking Your Multi-Site Management at Scale to the Next Level
Acquia
 
CDP for Retail Webinar with Appnovation - Q2 2022.pdf
CDP for Retail Webinar with Appnovation - Q2 2022.pdfCDP for Retail Webinar with Appnovation - Q2 2022.pdf
CDP for Retail Webinar with Appnovation - Q2 2022.pdf
Acquia
 
May Partner Bootcamp 2022
May Partner Bootcamp 2022May Partner Bootcamp 2022
May Partner Bootcamp 2022
Acquia
 
April Partner Bootcamp 2022
April Partner Bootcamp 2022April Partner Bootcamp 2022
April Partner Bootcamp 2022
Acquia
 
How to Unify Brand Experience: A Hootsuite Story
How to Unify Brand Experience: A Hootsuite Story How to Unify Brand Experience: A Hootsuite Story
How to Unify Brand Experience: A Hootsuite Story
Acquia
 
Using Personas to Guide DAM Results: How Life Time Pumped Up Their UX and CX
Using Personas to Guide DAM Results: How Life Time Pumped Up Their UX and CXUsing Personas to Guide DAM Results: How Life Time Pumped Up Their UX and CX
Using Personas to Guide DAM Results: How Life Time Pumped Up Their UX and CX
Acquia
 
Improve Code Quality and Time to Market: 100% Cloud-Based Development Workflow
Improve Code Quality and Time to Market: 100% Cloud-Based Development WorkflowImprove Code Quality and Time to Market: 100% Cloud-Based Development Workflow
Improve Code Quality and Time to Market: 100% Cloud-Based Development Workflow
Acquia
 
September Partner Bootcamp
September Partner BootcampSeptember Partner Bootcamp
September Partner Bootcamp
Acquia
 
August partner bootcamp
August partner bootcampAugust partner bootcamp
August partner bootcamp
Acquia
 
July 2021 Partner Bootcamp
July  2021 Partner BootcampJuly  2021 Partner Bootcamp
July 2021 Partner Bootcamp
Acquia
 
May Partner Bootcamp
May Partner BootcampMay Partner Bootcamp
May Partner Bootcamp
Acquia
 
DRUPAL 7 END OF LIFE IS NEAR - MIGRATE TO DRUPAL 9 FAST AND EASY
DRUPAL 7 END OF LIFE IS NEAR - MIGRATE TO DRUPAL 9 FAST AND EASYDRUPAL 7 END OF LIFE IS NEAR - MIGRATE TO DRUPAL 9 FAST AND EASY
DRUPAL 7 END OF LIFE IS NEAR - MIGRATE TO DRUPAL 9 FAST AND EASY
Acquia
 
Work While You Sleep: The CMO’s Guide to a 24/7/365 Lead Machine
Work While You Sleep: The CMO’s Guide to a 24/7/365 Lead MachineWork While You Sleep: The CMO’s Guide to a 24/7/365 Lead Machine
Work While You Sleep: The CMO’s Guide to a 24/7/365 Lead Machine
Acquia
 
Acquia webinar: Leveraging Drupal to Bury Your Sales Team In B2B Leads
Acquia webinar: Leveraging Drupal to Bury Your Sales Team In B2B LeadsAcquia webinar: Leveraging Drupal to Bury Your Sales Team In B2B Leads
Acquia webinar: Leveraging Drupal to Bury Your Sales Team In B2B Leads
Acquia
 
April partner bootcamp deck cookieless future
April partner bootcamp deck  cookieless futureApril partner bootcamp deck  cookieless future
April partner bootcamp deck cookieless future
Acquia
 
How to enhance cx through personalised, automated solutions
How to enhance cx through personalised, automated solutionsHow to enhance cx through personalised, automated solutions
How to enhance cx through personalised, automated solutions
Acquia
 
DRUPAL MIGRATIONS AND DRUPAL 9 INNOVATION: HOW PAC-12 DELIVERED DIGITALLY FOR...
DRUPAL MIGRATIONS AND DRUPAL 9 INNOVATION: HOW PAC-12 DELIVERED DIGITALLY FOR...DRUPAL MIGRATIONS AND DRUPAL 9 INNOVATION: HOW PAC-12 DELIVERED DIGITALLY FOR...
DRUPAL MIGRATIONS AND DRUPAL 9 INNOVATION: HOW PAC-12 DELIVERED DIGITALLY FOR...
Acquia
 
Customer Experience (CX): 3 Key Factors Shaping CX Redesign in 2021
Customer Experience (CX): 3 Key Factors Shaping CX Redesign in 2021Customer Experience (CX): 3 Key Factors Shaping CX Redesign in 2021
Customer Experience (CX): 3 Key Factors Shaping CX Redesign in 2021
Acquia
 
Acquia_Adcetera Webinar_Marketing Automation.pdf
Acquia_Adcetera Webinar_Marketing Automation.pdfAcquia_Adcetera Webinar_Marketing Automation.pdf
Acquia_Adcetera Webinar_Marketing Automation.pdf
Acquia
 
Acquia Webinar Deck - 9_13 .pdf
Acquia Webinar Deck - 9_13 .pdfAcquia Webinar Deck - 9_13 .pdf
Acquia Webinar Deck - 9_13 .pdf
Acquia
 
Taking Your Multi-Site Management at Scale to the Next Level
Taking Your Multi-Site Management at Scale to the Next LevelTaking Your Multi-Site Management at Scale to the Next Level
Taking Your Multi-Site Management at Scale to the Next Level
Acquia
 
CDP for Retail Webinar with Appnovation - Q2 2022.pdf
CDP for Retail Webinar with Appnovation - Q2 2022.pdfCDP for Retail Webinar with Appnovation - Q2 2022.pdf
CDP for Retail Webinar with Appnovation - Q2 2022.pdf
Acquia
 
May Partner Bootcamp 2022
May Partner Bootcamp 2022May Partner Bootcamp 2022
May Partner Bootcamp 2022
Acquia
 
April Partner Bootcamp 2022
April Partner Bootcamp 2022April Partner Bootcamp 2022
April Partner Bootcamp 2022
Acquia
 
How to Unify Brand Experience: A Hootsuite Story
How to Unify Brand Experience: A Hootsuite Story How to Unify Brand Experience: A Hootsuite Story
How to Unify Brand Experience: A Hootsuite Story
Acquia
 
Using Personas to Guide DAM Results: How Life Time Pumped Up Their UX and CX
Using Personas to Guide DAM Results: How Life Time Pumped Up Their UX and CXUsing Personas to Guide DAM Results: How Life Time Pumped Up Their UX and CX
Using Personas to Guide DAM Results: How Life Time Pumped Up Their UX and CX
Acquia
 
Improve Code Quality and Time to Market: 100% Cloud-Based Development Workflow
Improve Code Quality and Time to Market: 100% Cloud-Based Development WorkflowImprove Code Quality and Time to Market: 100% Cloud-Based Development Workflow
Improve Code Quality and Time to Market: 100% Cloud-Based Development Workflow
Acquia
 
September Partner Bootcamp
September Partner BootcampSeptember Partner Bootcamp
September Partner Bootcamp
Acquia
 
August partner bootcamp
August partner bootcampAugust partner bootcamp
August partner bootcamp
Acquia
 
July 2021 Partner Bootcamp
July  2021 Partner BootcampJuly  2021 Partner Bootcamp
July 2021 Partner Bootcamp
Acquia
 
May Partner Bootcamp
May Partner BootcampMay Partner Bootcamp
May Partner Bootcamp
Acquia
 
DRUPAL 7 END OF LIFE IS NEAR - MIGRATE TO DRUPAL 9 FAST AND EASY
DRUPAL 7 END OF LIFE IS NEAR - MIGRATE TO DRUPAL 9 FAST AND EASYDRUPAL 7 END OF LIFE IS NEAR - MIGRATE TO DRUPAL 9 FAST AND EASY
DRUPAL 7 END OF LIFE IS NEAR - MIGRATE TO DRUPAL 9 FAST AND EASY
Acquia
 
Work While You Sleep: The CMO’s Guide to a 24/7/365 Lead Machine
Work While You Sleep: The CMO’s Guide to a 24/7/365 Lead MachineWork While You Sleep: The CMO’s Guide to a 24/7/365 Lead Machine
Work While You Sleep: The CMO’s Guide to a 24/7/365 Lead Machine
Acquia
 
Acquia webinar: Leveraging Drupal to Bury Your Sales Team In B2B Leads
Acquia webinar: Leveraging Drupal to Bury Your Sales Team In B2B LeadsAcquia webinar: Leveraging Drupal to Bury Your Sales Team In B2B Leads
Acquia webinar: Leveraging Drupal to Bury Your Sales Team In B2B Leads
Acquia
 
April partner bootcamp deck cookieless future
April partner bootcamp deck  cookieless futureApril partner bootcamp deck  cookieless future
April partner bootcamp deck cookieless future
Acquia
 
How to enhance cx through personalised, automated solutions
How to enhance cx through personalised, automated solutionsHow to enhance cx through personalised, automated solutions
How to enhance cx through personalised, automated solutions
Acquia
 
DRUPAL MIGRATIONS AND DRUPAL 9 INNOVATION: HOW PAC-12 DELIVERED DIGITALLY FOR...
DRUPAL MIGRATIONS AND DRUPAL 9 INNOVATION: HOW PAC-12 DELIVERED DIGITALLY FOR...DRUPAL MIGRATIONS AND DRUPAL 9 INNOVATION: HOW PAC-12 DELIVERED DIGITALLY FOR...
DRUPAL MIGRATIONS AND DRUPAL 9 INNOVATION: HOW PAC-12 DELIVERED DIGITALLY FOR...
Acquia
 
Customer Experience (CX): 3 Key Factors Shaping CX Redesign in 2021
Customer Experience (CX): 3 Key Factors Shaping CX Redesign in 2021Customer Experience (CX): 3 Key Factors Shaping CX Redesign in 2021
Customer Experience (CX): 3 Key Factors Shaping CX Redesign in 2021
Acquia
 
Ad

Recently uploaded (20)

TrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business ConsultingTrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business Consulting
Trs Labs
 
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
BookNet Canada
 
Transcript: Canadian book publishing: Insights from the latest salary survey ...
Transcript: Canadian book publishing: Insights from the latest salary survey ...Transcript: Canadian book publishing: Insights from the latest salary survey ...
Transcript: Canadian book publishing: Insights from the latest salary survey ...
BookNet Canada
 
Q1 2025 Dropbox Earnings and Investor Presentation
Q1 2025 Dropbox Earnings and Investor PresentationQ1 2025 Dropbox Earnings and Investor Presentation
Q1 2025 Dropbox Earnings and Investor Presentation
Dropbox
 
MINDCTI revenue release Quarter 1 2025 PR
MINDCTI revenue release Quarter 1 2025 PRMINDCTI revenue release Quarter 1 2025 PR
MINDCTI revenue release Quarter 1 2025 PR
MIND CTI
 
The Microsoft Excel Parts Presentation.pdf
The Microsoft Excel Parts Presentation.pdfThe Microsoft Excel Parts Presentation.pdf
The Microsoft Excel Parts Presentation.pdf
YvonneRoseEranista
 
How to Install & Activate ListGrabber - eGrabber
How to Install & Activate ListGrabber - eGrabberHow to Install & Activate ListGrabber - eGrabber
How to Install & Activate ListGrabber - eGrabber
eGrabber
 
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptxReimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
John Moore
 
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep DiveDesigning Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
ScyllaDB
 
Heap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and DeletionHeap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and Deletion
Jaydeep Kale
 
Viam product demo_ Deploying and scaling AI with hardware.pdf
Viam product demo_ Deploying and scaling AI with hardware.pdfViam product demo_ Deploying and scaling AI with hardware.pdf
Viam product demo_ Deploying and scaling AI with hardware.pdf
camilalamoratta
 
GDG Cloud Southlake #42: Suresh Mathew: Autonomous Resource Optimization: How...
GDG Cloud Southlake #42: Suresh Mathew: Autonomous Resource Optimization: How...GDG Cloud Southlake #42: Suresh Mathew: Autonomous Resource Optimization: How...
GDG Cloud Southlake #42: Suresh Mathew: Autonomous Resource Optimization: How...
James Anderson
 
Unlocking Generative AI in your Web Apps
Unlocking Generative AI in your Web AppsUnlocking Generative AI in your Web Apps
Unlocking Generative AI in your Web Apps
Maximiliano Firtman
 
Hybridize Functions: A Tool for Automatically Refactoring Imperative Deep Lea...
Hybridize Functions: A Tool for Automatically Refactoring Imperative Deep Lea...Hybridize Functions: A Tool for Automatically Refactoring Imperative Deep Lea...
Hybridize Functions: A Tool for Automatically Refactoring Imperative Deep Lea...
Raffi Khatchadourian
 
UiPath Agentic Automation: Community Developer Opportunities
UiPath Agentic Automation: Community Developer OpportunitiesUiPath Agentic Automation: Community Developer Opportunities
UiPath Agentic Automation: Community Developer Opportunities
DianaGray10
 
Foundations of Cybersecurity - Google Certificate
Foundations of Cybersecurity - Google CertificateFoundations of Cybersecurity - Google Certificate
Foundations of Cybersecurity - Google Certificate
VICTOR MAESTRE RAMIREZ
 
AI 3-in-1: Agents, RAG, and Local Models - Brent Laster
AI 3-in-1: Agents, RAG, and Local Models - Brent LasterAI 3-in-1: Agents, RAG, and Local Models - Brent Laster
AI 3-in-1: Agents, RAG, and Local Models - Brent Laster
All Things Open
 
GyrusAI - Broadcasting & Streaming Applications Driven by AI and ML
GyrusAI - Broadcasting & Streaming Applications Driven by AI and MLGyrusAI - Broadcasting & Streaming Applications Driven by AI and ML
GyrusAI - Broadcasting & Streaming Applications Driven by AI and ML
Gyrus AI
 
The Changing Compliance Landscape in 2025.pdf
The Changing Compliance Landscape in 2025.pdfThe Changing Compliance Landscape in 2025.pdf
The Changing Compliance Landscape in 2025.pdf
Precisely
 
Webinar - Top 5 Backup Mistakes MSPs and Businesses Make .pptx
Webinar - Top 5 Backup Mistakes MSPs and Businesses Make   .pptxWebinar - Top 5 Backup Mistakes MSPs and Businesses Make   .pptx
Webinar - Top 5 Backup Mistakes MSPs and Businesses Make .pptx
MSP360
 
TrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business ConsultingTrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business Consulting
Trs Labs
 
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
BookNet Canada
 
Transcript: Canadian book publishing: Insights from the latest salary survey ...
Transcript: Canadian book publishing: Insights from the latest salary survey ...Transcript: Canadian book publishing: Insights from the latest salary survey ...
Transcript: Canadian book publishing: Insights from the latest salary survey ...
BookNet Canada
 
Q1 2025 Dropbox Earnings and Investor Presentation
Q1 2025 Dropbox Earnings and Investor PresentationQ1 2025 Dropbox Earnings and Investor Presentation
Q1 2025 Dropbox Earnings and Investor Presentation
Dropbox
 
MINDCTI revenue release Quarter 1 2025 PR
MINDCTI revenue release Quarter 1 2025 PRMINDCTI revenue release Quarter 1 2025 PR
MINDCTI revenue release Quarter 1 2025 PR
MIND CTI
 
The Microsoft Excel Parts Presentation.pdf
The Microsoft Excel Parts Presentation.pdfThe Microsoft Excel Parts Presentation.pdf
The Microsoft Excel Parts Presentation.pdf
YvonneRoseEranista
 
How to Install & Activate ListGrabber - eGrabber
How to Install & Activate ListGrabber - eGrabberHow to Install & Activate ListGrabber - eGrabber
How to Install & Activate ListGrabber - eGrabber
eGrabber
 
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptxReimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
Reimagine How You and Your Team Work with Microsoft 365 Copilot.pptx
John Moore
 
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep DiveDesigning Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
Designing Low-Latency Systems with Rust and ScyllaDB: An Architectural Deep Dive
ScyllaDB
 
Heap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and DeletionHeap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and Deletion
Jaydeep Kale
 
Viam product demo_ Deploying and scaling AI with hardware.pdf
Viam product demo_ Deploying and scaling AI with hardware.pdfViam product demo_ Deploying and scaling AI with hardware.pdf
Viam product demo_ Deploying and scaling AI with hardware.pdf
camilalamoratta
 
GDG Cloud Southlake #42: Suresh Mathew: Autonomous Resource Optimization: How...
GDG Cloud Southlake #42: Suresh Mathew: Autonomous Resource Optimization: How...GDG Cloud Southlake #42: Suresh Mathew: Autonomous Resource Optimization: How...
GDG Cloud Southlake #42: Suresh Mathew: Autonomous Resource Optimization: How...
James Anderson
 
Unlocking Generative AI in your Web Apps
Unlocking Generative AI in your Web AppsUnlocking Generative AI in your Web Apps
Unlocking Generative AI in your Web Apps
Maximiliano Firtman
 
Hybridize Functions: A Tool for Automatically Refactoring Imperative Deep Lea...
Hybridize Functions: A Tool for Automatically Refactoring Imperative Deep Lea...Hybridize Functions: A Tool for Automatically Refactoring Imperative Deep Lea...
Hybridize Functions: A Tool for Automatically Refactoring Imperative Deep Lea...
Raffi Khatchadourian
 
UiPath Agentic Automation: Community Developer Opportunities
UiPath Agentic Automation: Community Developer OpportunitiesUiPath Agentic Automation: Community Developer Opportunities
UiPath Agentic Automation: Community Developer Opportunities
DianaGray10
 
Foundations of Cybersecurity - Google Certificate
Foundations of Cybersecurity - Google CertificateFoundations of Cybersecurity - Google Certificate
Foundations of Cybersecurity - Google Certificate
VICTOR MAESTRE RAMIREZ
 
AI 3-in-1: Agents, RAG, and Local Models - Brent Laster
AI 3-in-1: Agents, RAG, and Local Models - Brent LasterAI 3-in-1: Agents, RAG, and Local Models - Brent Laster
AI 3-in-1: Agents, RAG, and Local Models - Brent Laster
All Things Open
 
GyrusAI - Broadcasting & Streaming Applications Driven by AI and ML
GyrusAI - Broadcasting & Streaming Applications Driven by AI and MLGyrusAI - Broadcasting & Streaming Applications Driven by AI and ML
GyrusAI - Broadcasting & Streaming Applications Driven by AI and ML
Gyrus AI
 
The Changing Compliance Landscape in 2025.pdf
The Changing Compliance Landscape in 2025.pdfThe Changing Compliance Landscape in 2025.pdf
The Changing Compliance Landscape in 2025.pdf
Precisely
 
Webinar - Top 5 Backup Mistakes MSPs and Businesses Make .pptx
Webinar - Top 5 Backup Mistakes MSPs and Businesses Make   .pptxWebinar - Top 5 Backup Mistakes MSPs and Businesses Make   .pptx
Webinar - Top 5 Backup Mistakes MSPs and Businesses Make .pptx
MSP360
 

Create a Symfony Application from a Drupal Perspective

  • 1. Creating a Symfony 2 Application from a Drupal Perspective Robyn Green February 26, 2014
  • 2. Robyn Green ● Senior Developer and Themer for Mediacurrent. ● Bachelor of Science in Journalism, Computer Science from University of Central Arkansas. ● Background in Media, news agencies. ● Web app and Front End developer since 1996. ● Live in Little Rock, Arkansas. ● Build AngularJS, XCode, Django/Python projects in my spare time.
  • 3. What’s Going On? ● Why we talking about Symfony? ● What does this have to do with Drupal? ● Hasn’t this been covered already?
  • 4. The Fine Print ● This is a high level presentation ○ There is no Symfony Apples === Drupal Oranges
  • 5. The Fine Print ● This is a high level presentation ○ There is no Symfony Apples === Drupal Oranges Drupal Blueberries
  • 6. The Fine Print ● This is a high level presentation ○ There is no Symfony Apples === Drupal Oranges Drupal Blueberries ● Won’t be going over Drupal 8 ● No Drupal 7 to Drupal 8 module conversions I solemnly swear to not rant and rave about best practices, my opinion or procedural PHP vs MVC/OOP beyond what’s required for Symfony 2 examples.
  • 7. What Will You Do? Build a simple Symfony 2 site using Drupal terminology. (with examples … maybe)
  • 8. MVC Symfony: PHP web application framework using MVC Drupal doesn’t have any sort of strict MVC requirement. Example: PHP and SQL queries in theme tpl files.
  • 9. MVC Symfony: PHP web application framework using MVC M: Model ● V: View ● C: Controller ●
  • 10. MVC “Drupal” Symfony: PHP web application framework using MVC ● M: Model ○ Content Types ● V: View ○ Theme template tpl files ● C: Controller ○ Modules
  • 11. Lock and (down)load Let’s create a basic site in Symfony and Drupal Drush vs Composer Both are CLI tools You can install Drupal via Drush You can install Symfony via Composer Drush is 100% Drupal Composer is a dependency manager for PHP. It owes allegiance to no one
  • 16. Lock and (down)load We need to configure Symfony first Load config.php Fix any Problems, most likely permissions
  • 17. Lock and (down)load Plug in your database information
  • 19. Lock and (down)load Note the URL: app_dev.php Symfony has a built-in development environment toggle that defaults to enabled. This runs a different URL based on the environment parameter set
  • 20. If You Build It, They Will Come Basic Recipe site should have … recipes ● ● ● ● ● Title Category Ingredients Instructions Ratings. Maybe.
  • 21. If You Build It, They Will Come In Drupal, this is pretty standard* *Field Collection and Fivestar contrib modules used
  • 22. If You Build It, They Will Come Let’s see that again, but in Symfony this time.
  • 23. If You Build It, They Will Come Building a Bundle php app/console generate:bundle --namespace=Tutorial/CoreBundle --format=yml
  • 24. If You Build It, They Will Come Warning: Namespace Discussions Ahead
  • 25. If You Build It, They Will Come Building a Bundle php app/console generate:bundle --namespace=Tutorial/CoreBundle --format=yml Namespaces. There are standards to how this is done and Drupal is currently using PSR-0 but heavily debating a move to PSR-4. Symfony as of 2.4 still uses PSR-0, 1 or 2. http://symfony.com/doc/current/contributing/code/standards.html
  • 26. If You Build It, They Will Come Building a Bundle php app/console generate:bundle --namespace=Tutorial/CoreBundle --format=yml Tutorial here is the vendor name. CoreBundle is the package name.
  • 27. If You Build It, They Will Come Building a Bundle php app/console generate:bundle --namespace=Recipes/WebBundle --format=yml YAML Format. From Symfony’s own documentation: “YAML, YAML Ain't Markup Language, is a human friendly data serialization standard for all programming languages.”
  • 28. If You Build It, They Will Come YAML Drupal 7 Module .info YAML
  • 29. If You Build It, They Will Come Ignore Acme - default example We’ve got a Tutorial directory CoreBundle falls under that Everything related to that bundle is in here
  • 30. Symfony Content Types That’s all great, but what about our Drupal Content Type? ● We have to declare the bundle before we can generate the entity. Don’t get confused with between Models, Entities, Bundles and Content Types.
  • 31. Symfony Content Types Building an Entity php app/console doctrine:generate:entity --entity="TutorialCoreBundle:recipe" The console is going to ask us about fields in this entity. Let’s treat it like our content type* *we can pass fields in the command as a shortcut, but we’ll keep it simple here.
  • 33. Symfony Content Types What does this look like in Drupal?
  • 34. Symfony Content Types Building an Entity Think about relationships when deciding fields. Ingredients is better as its own Entity, not on it’s own as a Field. We’ll establish a Many-to-Many relationship. Categories as well.
  • 35. Symfony Content Types Building an Entity Drupal: Nodereferences, Taxonomy, even Images - anything that needs a complex set of its own fields or data is perhaps better suited as its own Entity in Symfony We have to tell Symfony these items will have a relationship In Drupal, the power of the community has done this for us with modules like Entity Reference and Node Reference
  • 36. Symfony Content Types Building an Entity ManyToMany OneToMany ManyToOne OneToOne These relationships are extremely powerful, and unfortunately beyond the scope of what we can cover here.
  • 37. Symfony Content Types Building an Entity What do the fields in this Entity look like? src/Tutorial/CoreBundle/Entity/recipe.php /** * @var string * * @ORMColumn(name="category", type="string", length=255) */ private $category;
  • 38. Symfony Content Types Building an Entity So that’s it, we have our content type minus the different relationships? Not quite.
  • 39. Symfony Content Types Building an Entity We have to tell Symfony to update our schema: php app/console doctrine:schema:update --force
  • 40. One Data Entry to Rule Them All Drupal
  • 41. One Data Entry to Rule Them All Symfony Remember, this is just a framework. Also, don’t do mysql inserts directly like that. It’s hard to establish relationships by hand.
  • 42. One Data Entry to Rule Them All $RecipeObj = new Recipe(); $RecipeObj->setTitle(“Yummy Recipe”); $RecipeObj->setInstructions(“Some set of instructions”); $RecipeObj->setCategory($CategoryObj); $RecipeObj->setRating(2.5); $em = $this->getDoctrine()->getManager(); $em->persist($RecipeObj); $em->flush();
  • 43. My First Symfony Site How do we let Symfony know about our new bundle? Routing src/Tutorial/CoreBundle/Resources/routing.yml
  • 44. My First Symfony Site By Default, our bundle routing looks like this: tutorial_core_homepage: pattern: /hello/{name} defaults: { _controller: TutorialCoreBundle:Default:index } Which we can access here: http://localhost/symfony/web/app_dev.php/hello/test
  • 45. My First Symfony Site By Default, our bundle routing looks like this: tutorial_core_homepage: pattern: /hello/{name} defaults: { _controller: TutorialCoreBundle:Default:index } Which we can access here: http://localhost/symfony/web/app_dev.php/hello/test
  • 46. My First Symfony Site Imagine trying to build a custom Drupal module page and not implementing hook_menu() This is the same logic behind Symfony routing
  • 48. My First Symfony Site Let’s open src/Tutorial/CoreBundle/Resources/routing.yml pattern: /hello/{name} Change To pattern: / We might as well set it to our homepage.
  • 49. My First Symfony Site Because we’ve removed the {name} placeholder, we have to update our Controller and Twig. src/Tutorial/CoreBundle/Controller/DefaultController.php $recipes = $this->getDoctrine() ->getRepository(TutorialCoreBundle:recipe') ->findBy(array(), array('name' => 'asc')); return $this->render('TutorialCoreBundle:Default:index.html. twig', array('recipes' => $recipes));
  • 50. My First Symfony Site What did we just do? getRepository(TutorialCoreBunder:recipe') ->findBy(array(), array('name' => 'asc')) Is basically the same as building a View - of node.type = ‘recipe’ - sort by node.title, asc But instead of outputting formatting or building a block, we’re just storing a collection of objects.
  • 51. My First Symfony Site What did we just do? We pass that $recipes collection on to Twig
  • 52. My First Symfony Site Twig index.html.twig ● Drupal’s page.tpl.php ● We can add whatever markup we need, but no PHP ● Even better, define a base.html.twig and extend it ● Extend allows us to use all the features of the parent, but override when necessary {% extends 'TutorialCoreBundle:Default:base.html.twig' %}
  • 53. My First Symfony Site Twig index.html.twig <div> {% for recipe in recipes %} <h1>{{ recipe.title }}</h1> {% endfor %} </div>
  • 54. My First Symfony Site Twig index.html.twig
  • 55. My First Symfony Site Drupal page.tpl.php
  • 56. My First Symfony Site Twig
  • 57. My First Symfony Site Twig One last thing ...
  • 58. My First Symfony Site Twig index.html.twig
  • 59. My First Symfony Site Twig index.html.twig Except, that wasn’t Twig That was Django. Python.
  • 60. My First Symfony Site Django index.html
  • 61. My First Symfony Site Twig index.html.twig Because the backend logic is decoupled from the front end display, the markup structure is so similar any themer or front end developer can pick up these templates without first having to learn the backend code.