• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Symfony2 for Midgard Developers
 

Symfony2 for Midgard Developers

on

  • 8,098 views

Symfony2 tutorial geared towards Midgard developers

Symfony2 tutorial geared towards Midgard developers

Statistics

Views

Total Views
8,098
Views on SlideShare
3,347
Embed Views
4,751

Actions

Likes
1
Downloads
42
Comments
0

36 Embeds 4,751

http://bergie.iki.fi 1973
http://www.planet-php.net 1969
http://www.planet-php.org 137
http://planet-php.org 132
http://www.midgard-project.org 109
http://css.dzone.com 94
http://localhost:8001 74
http://confluence.bigpoint.net:8080 64
http://www.phpeye.com 60
http://blogsiple.herokuapp.com 25
http://phpeye.com 20
http://192.168.176.147:8001 18
http://localhost:4000 17
https://twitter.com 9
http://translate.googleusercontent.com 5
http://webcache.googleusercontent.com 4
http://nemein.com 4
http://twitter.com 4
http://planet-php.net 3
http://www.hanrss.com 3
http://wall.bit-tests.1and1.com 3
http://www.sfexception.com 3
http://symfony2developer.com 2
http://www.dzone.com 2
http://intranet 2
http://scriptgold.net 2
http://dev.symfony2developer.com 2
http://www.slideshare.net 2
http://hotmonitor.org 2
http://www.infosult.de 1
http://php.dzone.com 1
http://127.0.0.1:8795 1
http://192.81.220.87 1
http://www.btechblog.com 1
http://ipv6.symfony2developer.com 1
http://www.onlydoo.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Symfony2 for Midgard Developers Symfony2 for Midgard Developers Presentation Transcript

    • Symfony2 for Midgard Developers
    • Symfony2 is becoming thede-facto web framework for PHP 5.3
    • Drupal
    • Zend Framework
    • Midgard MVC
    • MidCOM
    • The PHP world is starting to unite around Symfony2
    • Under MIT LicenseCopyright (c) 2004-2011 Fabien PotencierPermission is hereby granted, free of charge, to any personobtaining a copy of this software and associated documentationfiles (the "Software"), to deal in the Software withoutrestriction, including without limitation the rights to use,copy, modify, merge, publish, distribute, sublicense, and/orsell copies of the Software, and to permit persons to whomthe Software is furnished to do so, subject to the followingconditions:The above copyright notice and this permission notice shallbe included in all copies or substantial portions of theSoftware.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANYKIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THEWARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSEAND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHTHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISINGFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OROTHER DEALINGS IN THE SOFTWARE.
    • Symfony 2.0 was released on July 28 2011
    • Symfony2 is a collection of standalone PHP componentsbundled together into a single framework
    • You can choose what to take, and what to not use
    • ✔ Authentication and Authorization✔ Forms and Validation✔ Templating✔ Logging✔ Asset Management✔ Routing✔ Internationalization✔ Console Tasks✔ Caching
    • Dependency Injection means you can changeany of these to another implementation
    • <?php $this->container->get(security.context)->isGranted( READ, $object)The actual service checking this could beMidCOM-style ACL, or simple "allow authenticatedusers to do anything" check.
    • PHP 5.3 and namespaces
    • Midgard MVC & MidCOM<?phpclass example_mycomponent_controllers_some{Symfony2<?phpnamespace ExampleMyBundleController;use SymfonyFrameworkWebBundleController;class SomeController extends Controller{
    • is the new _
    • With namespaces all projects can share one autoloader.
    • <?php$crRoot = realpath(__DIR__ . /..);// register the autoloadersrequire "{$crRoot}/SplClassLoader.php";// Tell where Midgard stuff is$midgardAutoloader = new SplClassLoader(Midgard, "{$crRoot}/src");$midgardAutoloader->register();// Tell where code from some other project is$phpcrAutoloader = new SplClassLoader(PHPCR, "{$crRoot}/lib/PHPCR/src");$phpcrAutoloader->register();
    • Time to get the hands dirty
    • Youll need:• PHP 5.3• php5-midgard2• PEAR installer• Git
    • Symfony2 Standard Edition
    • http://symfony.com/download
    • $ php app/check.php********************************* ** Symfony requirements check ** *********************************php.ini used by PHP: /etc/php5/cli/php.ini** Mandatory requirements **OK Checking that PHP version is at least 5.3.2 (5.3.5-1ubuntu7.2 installed)OK Checking that the "date.timezone" setting is setOK Checking that app/cache/ directory is writable...
    • Dependencies are defined in the deps file[AsseticBundle] git=http://github.com/symfony/AsseticBundle.git target=/bundles/Symfony/Bundle/AsseticBundle version=v1.0.0RC2
    • Now you could just use the web dirstuff in your regular web server.
    • However, well be using AppServer-in-PHP$ pear channel-discover pear.indeyets.pp.ru$ pear install indeyets/aip
    • Add AiP integration as dependency[AppServerBundle] git=http://github.com/bergie/MidgardAppServerBundle.git target=Midgard/AppServerBundleInstall with $ php bin/vendors install --reinstall
    • Copy aip.yaml.example fromvendor/Midgard/AppServerBundleto the app dir as aip.yaml
    • Add Midgard namespace to autoloader$loader->registerNamespaces(array( ... Midgard => __DIR__./../vendor,
    • Start AiP aip app app/aip.yamlGo to http://localhost:8001
    • Now, to write some code!$ php app/console generate:bundleLet Symfony2 create a Acme/ExampleBundle for you.
    • src/Acme/ExampleBundle
    • http://localhost:8001/hello/World
    • src/Acme/ExampleBundle/Controller/DefaultController.php<?phpnamespace AcmeExampleBundleController;use SymfonyBundleFrameworkBundleControllerController;use SensioBundleFrameworkExtraBundleConfigurationRoute;use SensioBundleFrameworkExtraBundleConfigurationTemplate;class DefaultController extends Controller{ /** * @Route("/hello/{name}") * @Template() */ public function indexAction($name) { return array(name => $name); }}
    • src/Acme/ExampleBundle/Resources/views/Default/index.html.twigHello {{ name }}!
    • How did this template get loaded?/** * @Template() */...return array(name => $name);⇒ Defaults to Bundle/Resources/views/Controller/action.html.twigWe could also do:return $this->render( AcmeExampleBundle:Default:index.html.twig, array(name => $name));
    • Page generation process:1. Match the URL to a route (/hello/{name}) /hello/World ⇒ /hello/{name}2. Instantiate Controller new AcmeExampleBundleControllerDefaultController3. Run action method with arguments ->indexAction(World)3. Controller returns a Response Hello World!
    • Templating in Symfony2
    • Twig is the default templating engine for Symfony2
    • In Midgard you only define the elements you want to overrideIn Twig you define a new root element that inherits and thenoverrides.
    • src/Acme/ExampleBundle/Resources/views/Default/index.html.twig{% extends AcmeDemoBundle::layout.html.twig %}{% block content %}Hello {{ name }}!{% endblock %}
    • http://localhost:8001/hello/World
    • You can also use other templating enginesTAL, PHP, MidCOM, ...http://symfony.com/doc/2.0/cookbook/templating/PHP.html
    • Exercise:Create your own base layout templateMake the routes template inherit that
    • Routing in Symfony2
    • Registering routes with PHPapp/config/routing.ymlAcmeExampleBundle: resource: "@AcmeExampleBundle/Controller/" type: annotation prefix: /In Controller action methods:/** * @Route("/hello/{name}") */
    • Registering routes with YAMLAcmeExampleBundle: resource: "@AcmeExampleBundle/Resources/config/routing.yml" prefix: /examplesrc/Acme/ExampleBundle/Resources/config/routing.ymlhello_user: pattern: /hello/{name} defaults: { _controller: AcmeExampleBundle:Default:index}(format is NamespaceBundle:Controller:action)
    • $ php app/console router:debug[router] Current routesName Method Pattern_welcome ANY /_demo_login ANY /demo/secured/login_security_check ANY /demo/secured/login_check_demo_logout ANY /demo/secured/logout..._configurator_final ANY /_configurator/finalacme_example_default_index ANY /example/hello/{name}
    • Supporting other output formats/** * @Route("/hello/{name}.{_format}", defaults={"_format"="html"}) */http://localhost:8001/hello/World andhttp://localhost:8001/hello/World.htmlwill both work
    • src/Acme/ExampleBundle/Resources/views/Default/index.json.twig{% set arr = { name: name } %}{{ arr | json_encode | raw }}
    • http://localhost:8001/hello/World.json
    • Exercise:Create two routes• One with no parameters• One with two parameters• Provide a default value for parameter
    • Using Midgard inside Symfony2
    • Add Midgard ConnectionBundle as dependency[MidgardConnectionBundle] git=git://github.com/bergie/MidgardConnectionBundle.git target=Midgard/ConnectionBundleInstall with $ php bin/vendors installEnable in app/AppKernel.php$bundles = array( ... new MidgardConnectionBundleMidgardConnectionBundle());
    • Configure Midgard connectionapp/config/config.ymlmidgard_connection: type: SQLite name: midgard2 databasedir: "%kernel.root_dir%" logfile: "%kernel.root_dir%/logs/midgard2.log" loglevel: debug blobdir: "%kernel.root_dir%/blobs" sharedir: "/usr/share/midgard2"
    • Now you can create a database$ php app/console midgard:connection:init
    • Using Midgard in controllerssrc/Acme/ExampleBundle/Controller/DefaultController.php/** * @Route("/hello/{name}.{_format}", defaults={"_format"="html"}) * @Template() */public function indexAction($name){ $qb = new midgard_query_builder(midgard_person); $qb->add_constraint(firstname, =, Midgard); $persons = $qb->execute(); return array(name => $persons[0]->firstname);}
    • Hello, Midgard!
    • Exercise:Create a route displaying all personobjects in the Midgard database
    • MidCOM components inside Symfony2
    • Warning: Here be Dragons
    • Add Midgard MidcomCompatBundle as dependency[MidcomCompatBundle] git=git://github.com/bergie/MidgardMidcomCompatBundle.git target=Midgard/MidcomCompatBundleInstall with $ php bin/vendors installEnable in app/AppKernel.php$bundles = array( ... new MidgardMidcomCompatBundleMidgardMidcomCompatBundle());
    • Install Flacks version of MidCOM$ git clone https://github.com/flack/openpsa.gitCopy schemas from openpsa/schemas to MgdSchema dirapp/config/config.ymlmidgard_midcom_compat: root: "%kernel.root_dir%/../openpsa/lib"framework: templating: { engines: [twig, midcom] }Run $ php app/console midgard:connection:init
    • Enable component in app/AppKernel.php$bundles = array( ... new MidgardMidcomCompatBundleBundleComponentBundle( net.nehmer.blog));Add a component to routing configuration:NetNehmerBlog: resource: "net.nehmer.blog" type: midcom prefix: /blog
    • http://localhost:8001/blog/
    • Loading a layout for your MidCOM viewsapp/config/config.ymlmidgard_midcom_compat: layout: "MidgardMidcomCompatBundle::layout.html.twig"
    • Some areas to follow:• Symfony CMF: node-based routing, etc• PHPCR: standard content repository APIs• MidCOM and Midgard MVC compat work
    • Photos:http://www.flickr.com/photos/bfs_man/4939624151/http://www.flickr.com/photos/jeremyhiebert/5105804864/http://www.flickr.com/photos/donkeyhotey/5527263186/http://www.flickr.com/photos/eustaquio/2750429774/http://www.flickr.com/photos/hatwar/5022365448/http://www.flickr.com/photos/jordanfischer/72510316/http://www.flickr.com/photos/bellatrix6/130907944/Inspiration:http://www.slideshare.net/weaverryan/handson-with-the-symfony2-framework