symfony tips and tricks

43
PHPers Poznań #3 23.02.2016 Symfony tips & tricks

Upload: mariusz-kozlowski

Post on 21-Mar-2017

366 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Symfony tips and tricks

PHPers Poznań #323.02.2016

Symfony tips & tricks

Page 3: Symfony tips and tricks

Accessing request

parameters

Page 4: Symfony tips and tricks

/*** @param Request $request** @return JsonResponse*/public function getCandidateVisitAction(Request $request){ $candidateId = (int) $request->get('id'); $candidates = $this->getDoctrine() ->getRepository('EspeoCommonBundle:CandidateVisit') ->getVisitStatistics($candidateId);

return new JsonResponse($candidates);}

Page 5: Symfony tips and tricks

/*** @param Request $request** @return JsonResponse*/public function getCandidateVisitAction(Request $request){ $candidateId = $request->query->getInt('id'); $candidates = $this->getDoctrine() ->getRepository('EspeoCommonBundle:CandidateVisit') ->getVisitStatistics($candidateId);

return new JsonResponse($candidates);}

Page 6: Symfony tips and tricks

Namingstrategies

Page 7: Symfony tips and tricks

/*** CandidateVisit.** @ORM\Table(name="candidate_visit")* @ORM\Entity(repositoryClass="Espeo\CommonBundle\Entity\Repository\CandidateVisitRepository")*/class CandidateVisit{ /** * @var \DateTime * * @ORM\Column(name="date_visit", type="datetime") */ private $dateVisit;}

Page 8: Symfony tips and tricks

# app/config/config.yml

doctrine: dbal: (...) orm: naming_strategy: doctrine.orm.naming_strategy.underscore

Page 9: Symfony tips and tricks

<?php

namespace Doctrine\ORM\Mapping;

interface NamingStrategy{ function classToTableName($className);

function propertyToColumnName($propertyName, $className = null);

function referenceColumnName(); function joinColumnName($propertyName); function joinTableName($sourceEntity, $targetEntity, $propertyName); function joinKeyColumnName($entityName, $referencedColumnName = null);}

Page 10: Symfony tips and tricks

Twig &app.user

Page 11: Symfony tips and tricks

{% if app.user and is_granted('ROLE_ADMIN') %} ...{% endif %}

Page 12: Symfony tips and tricks

Email deliverywhitelist

Page 13: Symfony tips and tricks

# Swiftmailer Configurationswiftmailer: transport: "%mailer_transport%" host: "%mailer_host%" username: "%mailer_user%" password: "%mailer_password%" spool: type: file path: "%kernel.root_dir%/spool"

Page 14: Symfony tips and tricks

# app/config/config_dev.yml

swiftmailer: delivery_address: [email protected] delivery_whitelist: # all email addresses matching these regexes will be delivered # like normal, as well as being sent to [email protected] - '/@specialdomain\.com$/' - '/^admin@mydomain\.com$/'

Page 15: Symfony tips and tricks

Automatic "smoke testing"

for services

Page 16: Symfony tips and tricks

public function testContainerServices(){ $client = static::createClient(); foreach ($client->getContainer()->getServiceIds() as $serviceId) { $service = $client->getContainer()->get($serviceId); $this->assertNotNull($service); }}

Page 17: Symfony tips and tricks

public function testContainerServices(){ $client = static::createClient(); foreach ($client->getContainer()->getServiceIds() as $serviceId) { try { $startedAt = microtime(true); $service = $client->getContainer()->get($serviceId); $elapsed = (microtime(true) - $startedAt) * 1000; $this->assertLessThan(50, $elapsed); } catch(InactiveScopeException $e) { } }}

Page 18: Symfony tips and tricks

symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/converters.html

ParamConverter

Page 19: Symfony tips and tricks

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;

/*** @Route("/blog/{id}")* @ParamConverter("post", class="SensioBlogBundle:Post")*/public function showAction(Post $post){}

Page 20: Symfony tips and tricks

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;

/*** @Route("/blog/{id}")* @ParamConverter("post", class="SensioBlogBundle:Post", options={"entity_manager" = "foo"})*/public function showAction(Post $post){}

Page 21: Symfony tips and tricks

Bundle

Page 22: Symfony tips and tricks

http://jmsyst.com/bundles/JMSDiExtraBundle

JMSDiExtraBundle

Page 23: Symfony tips and tricks

// composer.json{ // ... require: { // ... "jms/di-extra-bundle": "dev-master" }}

Page 24: Symfony tips and tricks

#app/AppKernel.php

$bundles = array( // ... new JMS\DiExtraBundle\JMSDiExtraBundle($this), new JMS\AopBundle\JMSAopBundle(), // ...);

Page 25: Symfony tips and tricks

#app/config/config.yml

jms_di_extra: locations: all_bundles: false bundles: [FooBundle, AcmeBlogBundle] directories: ["%kernel.root_dir%/../src"]

Page 26: Symfony tips and tricks

<?php

namespace Espeo\CandidateBundle\Controller;

use Espeo\CandidateBundle\Service\CalendarEventProvider;use Espeo\CommonBundle\Controller\Controller;use Espeo\CommonBundle\Entity\Repository\CitiesRepository;use JMS\DiExtraBundle\Annotation as DI;use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;use Symfony\Component\Translation\TranslatorInterface;

class CalendarApiController extends Controller{ /** * @var CalendarEventProvider * @DI\Inject("espeo_candidate.calendar_event_provider") */ private $calendarEventProvider;

/** * @var TokenStorage * @DI\Inject("security.token_storage") */ private $tokenStorage;

/** * @var CitiesRepository * @DI\Inject("espeo_common.cities_repository") */ private $citiesRepository;}

Page 27: Symfony tips and tricks

<?php

class CalendarApiController extends Controller{ /** * @var CalendarEventProvider * @DI\Inject("espeo_candidate.calendar_event_provider") */ private $calendarEventProvider;

/** * @var TokenStorage * @DI\Inject("security.token_storage") */ private $tokenStorage;

/** * @var CityRepository * @DI\Inject("espeo_common.city_repository") */ private $cityRepository;}

Page 28: Symfony tips and tricks

private function getCoolCities(){ $cities = $this->cityRepository->getSosnowiecAndRadom();

return $cities;}

Page 29: Symfony tips and tricks

use JMS\DiExtraBundle\Annotation as DI;

class Controller{ private $em; private $session;

/** * @DI\InjectParams({ * "em" = @DI\Inject("doctrine.orm.entity_manager"), * "session" = @DI\Inject("session") * }) */ public function __construct($em, $session) { $this->em = $em; $this->session = $session; }}

Page 30: Symfony tips and tricks

https://github.com/willdurand/BazingaJsTranslationBundle

BazingaJsTranslationBundle

Page 31: Symfony tips and tricks

composer require "willdurand/js-translation-bundle"

Page 32: Symfony tips and tricks

// app/AppKernel.phppublic function registerBundles(){ return array( // ... new Bazinga\Bundle\JsTranslationBundle\BazingaJsTranslationBundle() );}

Page 33: Symfony tips and tricks

#app/config/routing.yml

_bazinga_jstranslation: resource: "@BazingaJsTranslationBundle/Resources/config/routing/routing.yml"

Page 34: Symfony tips and tricks

#app/config/assetic/js.yml

bazinga_js_translation_js: inputs: - '%kernel.root_dir%/../web/bundles/bazingajstranslation/js/translator.min.js' - '%kernel.root_dir%/../web/js/translations/config.js' - '%kernel.root_dir%/../web/js/translations/*/*.js'

Page 35: Symfony tips and tricks

compile: php app/console bazinga:js-translation:dump php app/console assetic:dump

Page 36: Symfony tips and tricks

{% javascripts '@bazinga_js_translation_js' %} <script src="{{ asset_url }}"></script>{% endjavascripts %}

Page 37: Symfony tips and tricks

https://github.com/boxuk/angular-symfony-translation

angular-symfony-translation

Page 38: Symfony tips and tricks

bower install --save angular-symfony-translation

Page 39: Symfony tips and tricks

#app/config/assetic/js.yml

bazinga_js_angular_js: inputs: - '%kernel.root_dir%/../bower_components/angular-symfony-translation/ dist/angular-symfony-translation.js'

Page 40: Symfony tips and tricks

var app = angular.module('my_module', [ 'boxuk.translation']);

Page 41: Symfony tips and tricks

{% javascripts '@bazinga_js_translation_js' '@bazinga_js_angular_js' %} <script src="{{ asset_url }}"></script>{% endjavascripts %}

Page 42: Symfony tips and tricks

[[ ('errand.status.in_progress') | trans ]]

#src/Espeo/CommonBundle/Resources/translations/messages.pl.yml

errand: status: in_progress: W trakcie closed: Zamknięte canceled: Odwołany new: Nowy

Page 43: Symfony tips and tricks

ESPEO SOFTWARE

Mariusz Kozł[email protected]