ºÝºÝߣ

ºÝºÝߣShare a Scribd company logo
S      f  2
                                &
                             R R3
                        Fr    f r   r

Monday, June 20, 2011
A      r C
                        S r P
                         A b r B rr ¨¤

Monday, June 20, 2011
Brescia - 24 settembre 2011




Monday, June 20, 2011
Why this speech?
             W        p  ?
               Agenda
                A
           Join the f***ing
          J      f***       f
               cooonf
Monday, June 20, 2011
come utente anonimo voglio poter vedere
   l'elenco delle conferenze ordinate per data
   decrescente
   come ua e ur voglio poter vedere l'elenco delle
   presentazioni di una conferenza ordinate in data
   crescente
   come ua e ur voglio porer vedere il dettaglio di
   una presenzatione
   come ua voglio potermi registrare
   come ur voglio poter aderire ad una conferenza
   come ur voglio poter commentare una
   conferenza
   come ur voglio poter commentare una
   presentazione
Monday, June 20, 2011
http://joinconf.heroku.com   https://github.com/cirpo/joinconf
                                  https://github.com/sandropaganoti/joinconf
                                            only Firefox 4 and Chrome 10+


Monday, June 20, 2011
R R3
                        ? Thank you Trygve Reenskaug
                        ? Thank you Matz
                        ? Thank you DHH




Monday, June 20, 2011
R b                            R                Ar               r
                                            rack stack
                                             middleware 1
         web server                                ...
                                             middleware N
                                                                     View
 response               request
                                  run Joinconf::Application.routes


                                            ActionController
                                            MiddlewareStack          Model

                                    Controller.new.process(action)




Monday, June 20, 2011
S        f      2
                        ?   Thank you RoR
                        ?   Thank you Fabien
                        ?   Thank you Doctrine
                        ?   Thank you Spring
                        ?   Thank you Cocoa




Monday, June 20, 2011
S            f         2 Ar                r
                                DI       View

     request                    Kernel       Event Dispatcher
                 response


                            Bundle*
                                         Model




Monday, June 20, 2011
S
                        ? Rack
                        ? Event Driven




Monday, June 20, 2011
<services>
                            <service id="fos_user.controller.user"
                             class="%fos_user.controller.user.class%">
                                <call method="setContainer">
                                    <argument type="service" id="service_container" />
                                </call>
                                <tag name="security.secure_service" />
                            </service>
                            <service id="fos_user.controller.security"
                             class="%fos_user.controller.security.class%">
                                <call method="setContainer">
                                    <argument type="service" id="service_container" />
                                </call>
                            </service>
                        </services>




Monday, June 20, 2011
services:
             ideato.joinconf.admin.talk:
               class: IdeatoDunlopBundleAdminNewsAdmin
               tags:
                 - { name: sonata.admin, manager_type: orm, group: Donlup News, label: News }
               arguments: [null, IdeatoDunlopBundleEntityNews,
           IdeatoDunlopBundle:NewsAdmin]




Monday, June 20, 2011
namespace IdeatoJoinConfBundleDataFixtruesORM;

        use DoctrineCommonDataFixturesFixtureInterface;
        use SymfonyComponentDependencyInjectionContainerInterface;
        use SymfonyComponentDependencyInjectionContainerAwareInterface;

        class UserFixtures implements FixtureInterface, ContainerAwareInterface {

              private $container;

              public function setContainer(ContainerInterface $container = null) {
                  $this->container = $container;
              }

              public function load($manager) {

                    $creator = $this->container->get('fos_user.user_creator');
                    $creator->create("Ideato", "Ideato", "alessandro.cinelli@gmail.com", false, true);
                    $creator->create("odracci", "odracci", "odracci@gmail.com", false, true);
                    $creator->create("alberto.barrila", "suka", "alberto.barilla@gmail.com", false, true);
                    $creator->create("sandro.paganotti", "suka", "sandro.paganotti@gmail.com", false,
        true);




Monday, June 20, 2011
S       f
                        e.g.: SymfonyComponentHttpKernel
                                 Stack
                        onCoreRequest
                        onCoreException
                        onCoreView
                        onCoreController
                        onCoreResponse



Monday, June 20, 2011
R
                            always tell your mama
                        before you go off somewhere!




Monday, June 20, 2011
R
                        resources :conferences do
                          resources :comments
                          resources :sessions do
                            resources :comments
                          end
                          resources :attendees
                        end




Monday, June 20, 2011
Symfony
       _welcome:
           pattern: /
           defaults: { _controller: 'IdeatoJoinConfBundle:Homepage:index' }

       conference:
           pattern:   /conference/{slug}
           defaults: { _controller: 'IdeatoJoinConfBundle:Blog:show', slug: 1 }
           requirements:
               page: d+




Monday, June 20, 2011
M           r
                        ? Routes to Rack and Engines
                        ? Bundles




Monday, June 20, 2011
C          r          r
                        class ConferencesController < ApplicationController
                            def index
                                @conferences = Conference.all
                                respond_with @conferences
                            end
                            def show
                                @conference = Conference.find(params[:id])
                            end
                        end




Monday, June 20, 2011
C      r    r
                        ? Function
                        ? Object method
                        ? Closure




Monday, June 20, 2011
C             r            r
                namespace IdeatoJoinConfBundleController;

                use IdeatoJoinConfBundleEntityConference;
                use SymfonyBundleFrameworkBundleControllerController;

                class HomepageController extends Controller {

                    public function indexAction()
                    {
                      $conference_repository = $this->get('doctrine.orm.entity_manager')
                                      ->getRepository('IdeatoJoinConfBundle:Conference');

                        $conferences = $conference_repository
                                        ->retrieveConferencesByAscendingOrder();

                        return $this->render
                (              ('IdeatoJoinConfBundle:Default:index.html.twig',
                                 array('conferences' => $conferences));




Monday, June 20, 2011
M
                        ? Doctrine 2
                        ? POPO
                        ? DataMapper
                        ? ODM




Monday, June 20, 2011
M
       namespace IdeatoJoinConfBundleEntity;

       /**
        * @orm:Entity(repositoryClass="IdeatoJoinConfBundleRepositories
       ConferenceRepository")
        */
       class Conference {

               /**
                * @orm:Id
                * @orm:Column(type="integer")
                * @orm:GeneratedValue(strategy="AUTO")
                */
               private $id;
               /**
                * @orm:Column(type="string", length="255")
                */
               private $title;
               /**
                * @orm:Column(type="datetime")
                */
               private $date;


Monday, June 20, 2011
M
     namespace IdeatpJoinConfBundleEntity;

     /**
      * @orm:Entity(repositoryClass="CirpoJoinConfBundleRepositories
     SessionRepository")
      */
     class Talk {

              /**
               * @orm:Id
               * @orm:Column(type="integer")
               * @orm:GeneratedValue(strategy="AUTO")
               */
              private $id;
              /**
               * @orm:Column(type="string", length="255")
               */
              private $title;
              /**
               * @ORMOneToMany(targetEntity="User", mappedBy="talk")
               */
              private $speakers;

Monday, June 20, 2011
M
                        class Conference < ActiveRecord::Base
                          validates :name, :start, :end, :users_max,
                                    :location, :presence => true
                          default_scope :order => "start DESC"

                          has_many :sessions
                          has_many :attendees
                          has_many :comments, :as => :commentable

                        end




Monday, June 20, 2011
M
                        ? ActiveModel
                        ? Arel
                        ? ActiveResource




Monday, June 20, 2011
V w
                        ? Twig
                        ? Plain PHP
                        ? Assetic




Monday, June 20, 2011
{% if loop.index is not divisibleby(3) %}



                         View
        {{ post.published_at|date("m/d/Y") }}

        {{ "I like %this% and %that%."|replace({'%this
        %': foo, '%that%': "bar"}) }}

        {{ var.foo|default('foo item on var is not
        defined') }}
        {{ var is even }}
        {{ var is odd }}
        {% if foo.attribute is sameas(false) %}
        {% for i in range(0, 3) %}



Monday, June 20, 2011
V w
                        <section id="conferences">
                          <h1><%= I18n.t(:conference_list)%></h1>
                          <%= render @conferences %>
                        </section>

                        <article class="conference">
                          <header>
                            <h1><%= conference.name %></h1>
                            <dl>
                              <!-- some stuff -->
                            </dl>
                          </header>
                          <p><%= conference.description %></p>
                          <footer>
                            <menu>
                              <li><%= link_to I18n.t(:view_the_sessions ),
                                   conference_sessions_path(conference)%></li>
                              <!-- other links -->
                            </menu>
                          </footer>
                        </article>


Monday, June 20, 2011
V w
                        ? ERb
                        ? HTML 5
                        ? CoffeScript
                        ? SASS




Monday, June 20, 2011
T

Monday, June 20, 2011
Monday, June 20, 2011
Any Questions ????


Monday, June 20, 2011
S         ,
                            f r

                                                   alessandro.cinelli@gmail.com /@cirpo
                                      sandro.paganotti@wavegroup.it /@sandropaganotti
                                          alberto.barrila@wavegroup.it /@albertobarrila




Monday, June 20, 2011

More Related Content

Symfony2 and Ror3 friends for an hour

  • 1. S f 2 & R R3 Fr f r r Monday, June 20, 2011
  • 2. A r C S r P A b r B rr ¨¤ Monday, June 20, 2011
  • 3. Brescia - 24 settembre 2011 Monday, June 20, 2011
  • 4. Why this speech? W p ? Agenda A Join the f***ing J f*** f cooonf Monday, June 20, 2011
  • 5. come utente anonimo voglio poter vedere l'elenco delle conferenze ordinate per data decrescente come ua e ur voglio poter vedere l'elenco delle presentazioni di una conferenza ordinate in data crescente come ua e ur voglio porer vedere il dettaglio di una presenzatione come ua voglio potermi registrare come ur voglio poter aderire ad una conferenza come ur voglio poter commentare una conferenza come ur voglio poter commentare una presentazione Monday, June 20, 2011
  • 6. http://joinconf.heroku.com https://github.com/cirpo/joinconf https://github.com/sandropaganoti/joinconf only Firefox 4 and Chrome 10+ Monday, June 20, 2011
  • 7. R R3 ? Thank you Trygve Reenskaug ? Thank you Matz ? Thank you DHH Monday, June 20, 2011
  • 8. R b R Ar r rack stack middleware 1 web server ... middleware N View response request run Joinconf::Application.routes ActionController MiddlewareStack Model Controller.new.process(action) Monday, June 20, 2011
  • 9. S f 2 ? Thank you RoR ? Thank you Fabien ? Thank you Doctrine ? Thank you Spring ? Thank you Cocoa Monday, June 20, 2011
  • 10. S f 2 Ar r DI View request Kernel Event Dispatcher response Bundle* Model Monday, June 20, 2011
  • 11. S ? Rack ? Event Driven Monday, June 20, 2011
  • 12. <services> <service id="fos_user.controller.user" class="%fos_user.controller.user.class%"> <call method="setContainer"> <argument type="service" id="service_container" /> </call> <tag name="security.secure_service" /> </service> <service id="fos_user.controller.security" class="%fos_user.controller.security.class%"> <call method="setContainer"> <argument type="service" id="service_container" /> </call> </service> </services> Monday, June 20, 2011
  • 13. services: ideato.joinconf.admin.talk: class: IdeatoDunlopBundleAdminNewsAdmin tags: - { name: sonata.admin, manager_type: orm, group: Donlup News, label: News } arguments: [null, IdeatoDunlopBundleEntityNews, IdeatoDunlopBundle:NewsAdmin] Monday, June 20, 2011
  • 14. namespace IdeatoJoinConfBundleDataFixtruesORM; use DoctrineCommonDataFixturesFixtureInterface; use SymfonyComponentDependencyInjectionContainerInterface; use SymfonyComponentDependencyInjectionContainerAwareInterface; class UserFixtures implements FixtureInterface, ContainerAwareInterface { private $container; public function setContainer(ContainerInterface $container = null) { $this->container = $container; } public function load($manager) { $creator = $this->container->get('fos_user.user_creator'); $creator->create("Ideato", "Ideato", "alessandro.cinelli@gmail.com", false, true); $creator->create("odracci", "odracci", "odracci@gmail.com", false, true); $creator->create("alberto.barrila", "suka", "alberto.barilla@gmail.com", false, true); $creator->create("sandro.paganotti", "suka", "sandro.paganotti@gmail.com", false, true); Monday, June 20, 2011
  • 15. S f e.g.: SymfonyComponentHttpKernel Stack onCoreRequest onCoreException onCoreView onCoreController onCoreResponse Monday, June 20, 2011
  • 16. R always tell your mama before you go off somewhere! Monday, June 20, 2011
  • 17. R resources :conferences do resources :comments resources :sessions do resources :comments end resources :attendees end Monday, June 20, 2011
  • 18. Symfony _welcome: pattern: / defaults: { _controller: 'IdeatoJoinConfBundle:Homepage:index' } conference: pattern: /conference/{slug} defaults: { _controller: 'IdeatoJoinConfBundle:Blog:show', slug: 1 } requirements: page: d+ Monday, June 20, 2011
  • 19. M r ? Routes to Rack and Engines ? Bundles Monday, June 20, 2011
  • 20. C r r class ConferencesController < ApplicationController def index @conferences = Conference.all respond_with @conferences end def show @conference = Conference.find(params[:id]) end end Monday, June 20, 2011
  • 21. C r r ? Function ? Object method ? Closure Monday, June 20, 2011
  • 22. C r r namespace IdeatoJoinConfBundleController; use IdeatoJoinConfBundleEntityConference; use SymfonyBundleFrameworkBundleControllerController; class HomepageController extends Controller { public function indexAction() { $conference_repository = $this->get('doctrine.orm.entity_manager') ->getRepository('IdeatoJoinConfBundle:Conference'); $conferences = $conference_repository ->retrieveConferencesByAscendingOrder(); return $this->render ( ('IdeatoJoinConfBundle:Default:index.html.twig', array('conferences' => $conferences)); Monday, June 20, 2011
  • 23. M ? Doctrine 2 ? POPO ? DataMapper ? ODM Monday, June 20, 2011
  • 24. M namespace IdeatoJoinConfBundleEntity; /** * @orm:Entity(repositoryClass="IdeatoJoinConfBundleRepositories ConferenceRepository") */ class Conference { /** * @orm:Id * @orm:Column(type="integer") * @orm:GeneratedValue(strategy="AUTO") */ private $id; /** * @orm:Column(type="string", length="255") */ private $title; /** * @orm:Column(type="datetime") */ private $date; Monday, June 20, 2011
  • 25. M namespace IdeatpJoinConfBundleEntity; /** * @orm:Entity(repositoryClass="CirpoJoinConfBundleRepositories SessionRepository") */ class Talk { /** * @orm:Id * @orm:Column(type="integer") * @orm:GeneratedValue(strategy="AUTO") */ private $id; /** * @orm:Column(type="string", length="255") */ private $title; /** * @ORMOneToMany(targetEntity="User", mappedBy="talk") */ private $speakers; Monday, June 20, 2011
  • 26. M class Conference < ActiveRecord::Base validates :name, :start, :end, :users_max, :location, :presence => true default_scope :order => "start DESC" has_many :sessions has_many :attendees has_many :comments, :as => :commentable end Monday, June 20, 2011
  • 27. M ? ActiveModel ? Arel ? ActiveResource Monday, June 20, 2011
  • 28. V w ? Twig ? Plain PHP ? Assetic Monday, June 20, 2011
  • 29. {% if loop.index is not divisibleby(3) %} View {{ post.published_at|date("m/d/Y") }} {{ "I like %this% and %that%."|replace({'%this %': foo, '%that%': "bar"}) }} {{ var.foo|default('foo item on var is not defined') }} {{ var is even }} {{ var is odd }} {% if foo.attribute is sameas(false) %} {% for i in range(0, 3) %} Monday, June 20, 2011
  • 30. V w <section id="conferences"> <h1><%= I18n.t(:conference_list)%></h1> <%= render @conferences %> </section> <article class="conference"> <header> <h1><%= conference.name %></h1> <dl> <!-- some stuff --> </dl> </header> <p><%= conference.description %></p> <footer> <menu> <li><%= link_to I18n.t(:view_the_sessions ), conference_sessions_path(conference)%></li> <!-- other links --> </menu> </footer> </article> Monday, June 20, 2011
  • 31. V w ? ERb ? HTML 5 ? CoffeScript ? SASS Monday, June 20, 2011
  • 34. Any Questions ???? Monday, June 20, 2011
  • 35. S , f r alessandro.cinelli@gmail.com /@cirpo sandro.paganotti@wavegroup.it /@sandropaganotti alberto.barrila@wavegroup.it /@albertobarrila Monday, June 20, 2011