Archives pour la catégorie symfony2

Symfony2 how to add a response header for each request

JsonResponseListener.php

<?php
namespace MyCorp\MyBundle\Listener;
 
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
 
class JsonResponseListener
{
    public function onKernelResponse(FilterResponseEvent $event)
    {   
        $request = $event->getRequest();
 
        if(strpos($request->getHost(), 'api.') === false) {
            return;
        }                                                                                                                                                                                                                         
        $event->getResponse()->headers->set('Access-Control-Allow-Headers', 'origin, content-type, accept');
        $event->getResponse()->headers->set('Access-Control-Allow-Origin', '*');
        $event->getResponse()->headers->set('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE OPTIONS');
    }   
}

services.xml

<?xml version="1.0" ?>
 
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
 
    <services>
        <service id="mycorp.filter_response_listener" class="MyCorp\MyBundle\Listener\JsonResponseListener">
            <tag name="kernel.event_listener" event="kernel.response" method="onKernelResponse" />
        </service>
    </services>
</container>

Symfony2 preExecute Controller

Listener/PublisherListener.php

<?php
namespace Main\PublisherBundle\Listener;
 
use Symfony\Component\EventDispatcher\Event; 
use Symfony\Component\HttpKernel\HttpKernelInterface; 
use Symfony\Component\HttpKernel\Event\FilterControllerEvent; 
 
class PublisherListener {
 
    public function onCoreController(FilterControllerEvent $event) {
        if(HttpKernelInterface::MASTER_REQUEST == $event->getRequestType()) {
            $_controller = $event->getController();
            if(isset($_controller[0])) {
                $controller = $_controller[0];
                if(method_exists($controller, 'preExecute')) {
                    $controller->preExecute();
                }
            }
        }
    }
}

Resources/config/services.xml

<?xml version="1.0" ?>
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
 
    <parameters>
        <parameter key="main_publisher.listener.class">Main\PublisherBundle\Listener\PublisherListener</parameter>
    </parameters>
 
    <services>
        <service id="main_publisher_listener" class="%main_publisher.listener.class%">
            <tag name="kernel.event_listener" event="kernel.controller" method="onCoreController"/>
        </service>
    </services>
</container>

Controller/PublisherController.php

<?php
namespace Main\PublisherBundle\Controller;
 
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
 
class GamesController extends Controller {
   public function preExecute() {
        $this->gameManager = $this->container->get('main_publisher.game.manager');
        $this->userManager = $this->container->get('main_user_manager');
    }
}

symfony2 twig i18n date

sudo aptitude install php5-intl

app/config/config.yml

services:
    twig.extension.intl:
       class: Twig_Extensions_Extension_Intl
       tags:
           - { name: twig.extension }

In twig template

{{ game.created_at| localizeddate('full', 'none') }}

twig macro link title translation

{% macro link(route, title, name, attr) %}
{% spaceless %}
<a href="{{ path(route) }}" title="{{ title|trans({}, 'link') }}"{% for attrname,attrvalue in attr %} {{attrname}}="{{attrvalue}}"{% endfor %}>{{ name|trans({}, 'link') }}</a>
{% endspaceless %}
{% endmacro %}
 
<!-- Usage 
{{ macro.link('route_name', 'link title', 'link name', {'class':'css_class'}) }}
-->
 
<!-- HTML
<a href="/dashboard" title="Manage" class="pouet">Manage</a>
-->

Symfony2 service + manager

Resources/config/services.xml

<?xml version="1.0" ?>
 
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
 
    <parameters>
        <parameter key="main_publisher.game.manager.class">Main\PublisherBundle\Manager\GameManager</parameter>
    </parameters>
 
    <services>
        <service id="main_publisher.game.manager" class="%main_publisher.game.manager.class%">
            <argument type="service" id="doctrine.orm.entity_manager" />
        </service>
    </services>
</container>

Manager/BaseManager.php

<?php
namespace Main\PublisherBundle\Manager;
 
class BaseManager {
 
    protected function persistAndFlush($entity) {
        $this->_em->persist($entity);
        $this->_em->flush();
    }
 
}

Manager/GameManager.php

<?php
namespace Main\PublisherBundle\Manager;
 
use Doctrine\ORM\EntityManager;
use Main\PublisherBundle\Manager\BaseManager;
use Main\PublisherBundle\Entity\Game;
 
class GameManager extends BaseManager {
    protected $_em;
 
    public function __construct(EntityManager $em) {
        $this->_em = $em;
    } 
 
    public function save(Game $game) {
        return $this->persistAndFlush($game);
    }
 
    public function getRepository() {
        return $this->_em->getRepository('MainPublisherBundle:Game');
    }
}

Controller/GamesController.php

<?php
 
namespace Main\PublisherBundle\Controller;
 
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Request;
 
use Main\PublisherBundle\Entity\Game;
use Main\PublisherBundle\Form\GameType;
 
class GamesController extends Controller
{
    public function newAction(Request $request) {
        $form = $this->createForm(new GameType(), new Game());
        if($request->getMethod() == 'POST') {
            $form->bindRequest($request);
            if($form->isValid()) {
                $game = $form->getData();
                $manager = $this->container->get('main_publisher.game.manager');
                $manager->save($game);
                return $this->redirect($this->get('router')->generate('homepage'));
            }
 
        }
        return $this->render('MainPublisherBundle:Games:new.html.twig',
            array('form' => $form->createView()));
    }
}

doctrine2 yaml mapping example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
Doctrine\Tests\ORM\Mapping\User:
  type: entity
  table: cms_users
  namedQueries:
    all: SELECT u FROM __CLASS__ u
  id:
    id:
      type: integer
      generator:
        strategy: AUTO
      sequenceGenerator:
        sequenceName: tablename_seq
        allocationSize: 100
        initialValue: 1
  fields:
    name:
      type: string
      length: 50
      nullable: true
      unique: true
    email:
      type: string
      column: user_email
      columnDefinition: CHAR(32) NOT NULL
  oneToOne:
    address:
      targetEntity: Address
      inversedBy: user
      joinColumn:
        name: address_id
        referencedColumnName: id
        onDelete: CASCADE
        onUpdate: CASCADE
      cascade: [ remove ]
  oneToMany:
    phonenumbers:
      targetEntity: Phonenumber
      orphanRemoval: true
      mappedBy: user
      orderBy:
        number: ASC
      cascade: [ persist ]
  manyToMany:
    groups:
      targetEntity: Group
      joinTable:
        name: cms_users_groups
        joinColumns:
          user_id:
            referencedColumnName: id
            nullable: false
            unique: false
        inverseJoinColumns:
          group_id:
            referencedColumnName: id
            columnDefinition: INT NULL
      cascade:
        - all
  lifecycleCallbacks:
    prePersist: [ doStuffOnPrePersist, doOtherStuffOnPrePersistToo ]
    postPersist: [ doStuffOnPostPersist ]
  uniqueConstraints:
    search_idx:
      columns: name,user_email
  indexes:
    name_idx:
      columns: name
    0:
      columns: user_email

Doctrine Field Types Reference

Strings

string (used for shorter strings)
text (used for larger strings)
Numbers
integer
smallint
bigint
decimal
float

Dates and Times (use a DateTime object for these fields in PHP)

date
time
datetime

Other Types

boolean
object (serialized and stored in a CLOB field)
array (serialized and stored in a CLOB field)

Symfony2 memo

php app/console generate:bundle --namespace=Gallery/AlbumBundle --format=yml
 
php app/console doctrine:database:create
 
php app/console doctrine:generate:entity --entity="GalleryAlbumBundle:Album" --fields="name:string(255) description:text"
 
php app/console doctrine:generate:entities Gallery
php app/console doctrine:generate:entities GalleryAlbumBundle
php app/console doctrine:generate:entities Gallery/AlbumBundle/Entity/Album
 
php app/console doctrine:schema:update --force