Rest in practice con Symfony2

Daniel Londero
Daniel LonderoPHP Software Engineer at Cargo Media AG
REST in pratica
con Symfony2
@dlondero
Rest in practice con Symfony2
Rest in practice con Symfony2
Rest in practice con Symfony2
Rest in practice con Symfony2
DI SOLITO...
Richardson Maturity Model
NON
PARLIAMO DI...
PARLIAMO DI
COME FARE
COSA CI SERVE
•symfony/framework-standard-edition
•friendsofsymfony/rest-bundle
•jms/serializer-bundle
•nelmio/api-doc-bundle
//src/Acme/ApiBundle/Entity/Product.php;
use SymfonyComponentValidatorConstraints as Assert;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity
* @ORMTable(name="product")
*/
class Product
{
/**
* @ORMColumn(type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORMColumn(type="string", length=100)
* @AssertNotBlank()
*/
protected $name;
/**
* @ORMColumn(type="decimal", scale=2)
*/
protected $price;
/**
* @ORMColumn(type="text")
*/
protected $description;
CRUD
Create
HTTP POST
Request
POST /products HTTP/1.1
Host: acme.com
Content-Type: application/json
{
"name": "Product #1",
"price": 19.90,
"description": "Awesome product"
}
Response
HTTP/1.1 201 Created
Location: http://acme.com/products/1
Content-Type: application/json
{
"product": {
"id": 1,
"name": "Product #1",
"price": 19.9,
"description": "Awesome product"
}
//src/Acme/ApiBundle/Resources/config/routing.yml
acme_api_product_post:
pattern: /products
defaults: { _controller: AcmeApiBundle:ApiProduct:post,
_format: json }
requirements:
_method: POST
//src/Acme/ApiBundle/Controller/ApiProductController.php
use FOSRestBundleViewView;
public function postAction(Request $request)
{
$product = $this->deserialize(
'AcmeApiBundleEntityProduct',
$request
);
if ($product instanceof Product === false) {
return View::create(array('errors' => $product), 400);
}
$em = $this->getEM();
$em->persist($product);
$em->flush();
$url = $this->generateUrl(
'acme_api_product_get_single',
array('id' => $product->getId()),
true
);
$response = new Response();
$response->setStatusCode(201);
$response->headers->set('Location', $url);
return $response;
}
Read
HTTP GET
Request
GET /products/1 HTTP/1.1
Host: acme.com
Response
HTTP/1.1 200 OK
Content-Type: application/json
{
"product": {
"id": 1,
"name": "Product #1",
"price": 19.9,
"description": "Awesome product"
}
public function getSingleAction(Product $product)
{
return array('product' => $product);
}
Update
HTTP PUT
Request
PUT /products/1 HTTP/1.1
Host: acme.com
Content-Type: application/json
{
"name": "Product #1",
"price": 29.90,
"description": "Awesome product"
}
Response
HTTP/1.1 204 No Content
HTTP/1.1 200 OK
Content-Type: application/json
{
"product": {
"id": 1,
"name": "Product #1",
"price": 29.90,
"description": "Awesome product"
}
//src/Acme/ApiBundle/Controller/ApiProductController.php
use FOSRestBundleControllerAnnotationsView as RestView;
/**
* @RestView(statusCode=204)
*/
public function putAction(Product $product, Request $request)
{
$newProduct = $this->deserialize(
'AcmeApiBundleEntityProduct',
$request
);
if ($newProduct instanceof Product === false) {
return View::create(array('errors' => $newProduct), 400);
}
$product->merge($newProduct);
$this->getEM()->flush();
}
Partial Update
HTTP PATCH
Request
PATCH /products/1 HTTP/1.1
Host: acme.com
Content-Type: application/json
{
"price": 39.90,
}
Response
HTTP/1.1 204 No Content
HTTP/1.1 200 OK
Content-Type: application/json
{
"product": {
"id": 1,
"name": "Product #1",
"price": 39.90,
"description": "Awesome product"
}
//src/Acme/ApiBundle/Controller/ApiProductController.php
use FOSRestBundleControllerAnnotationsView as RestView;
/**
* @RestView(statusCode=204)
*/
public function patchAction(Product $product, Request $request)
{
$validator = $this->get('validator');
$raw = json_decode($request->getContent(), true);
$product->patch($raw);
if (count($errors = $validator->validate($product))) {
return $errors;
}
$this->getEM()->flush();
}
Delete
HTTP DELETE
Request
DELETE /products/1 HTTP/1.1
Host: acme.com
Response

HTTP/1.1 204 No Content
//src/Acme/ApiBundle/Controller/ApiProductController.php
use FOSRestBundleControllerAnnotationsView as RestView;
/**
* @RestView(statusCode=204)
*/
public function deleteAction(Product $product)
{
$em = $this->getEM();
$em->remove($product);
$em->flush();
}
Serialization
use JMSSerializerAnnotation as Serializer;
/**
* @SerializerExclusionPolicy("all")
*/
class Product
{
/**
* @SerializerExpose
* @SerializerType("integer")
*/
protected $id;
/**
* @SerializerExpose
* @SerializerType("string")
*/
protected $name;
/**
* @SerializerExpose
* @SerializerType("double")
*/
protected $price;
/**
* @SerializerExpose
* @SerializerType("string")
*/
protected $description;
Deserialization
//src/Acme/ApiBundle/Controller/ApiController.php
protected function deserialize($class, Request $request, $format = 'json')
{
$serializer = $this->get('serializer');
$validator = $this->get('validator');
try {
$entity = $serializer->deserialize(
$request->getContent(),
$class,
$format
);
} catch (RuntimeException $e) {
throw new HttpException(400, $e->getMessage());
}
if (count($errors = $validator->validate($entity))) {
return $errors;
}
return $entity;
}
Testing
Rest in practice con Symfony2
//src/Acme/ApiBundle/Tests/Controller/ApiProductControllerTest.php
use LiipFunctionalTestBundleTestWebTestCase;
class ApiProductControllerTest extends WebTestCase
{
public function testPost()
{
$this->loadFixtures(array());
$product = array(
'name' => 'Product #1',
'price' => 19.90,
'description' => 'Awesome product',
);
$client = static::createClient();
$client->request(
'POST',
'/products',
array(), array(), array(),
json_encode($product)
);
$this->assertEquals(201, $client->getResponse()->getStatusCode());
$this->assertTrue($client->getResponse()->headers->has('Location'));
$this->assertContains(
"/products/1",
$client->getResponse()->headers->get('Location')
);
}
//src/Acme/ApiBundle/Tests/Controller/ApiProductControllerTest.php
public function testPostValidation()
{
$this->loadFixtures(array());
$product = array(
'name' => '',
'price' => 19.90,
'description' => 'Awesome product',
);
$client = static::createClient();
$client->request(
'POST',
'/products',
array(), array(), array(),
json_encode($product)
);
$this->assertEquals(400, $client->getResponse()->getStatusCode());
}
//src/Acme/ApiBundle/Tests/Controller/ApiProductControllerTest.php
public function testGetAction()
{
$this->loadFixtures(array(
'AcmeApiBundleTestsFixturesProduct',
));
$client = static::createClient();
$client->request('GET', '/products');
$this->isSuccessful($client->getResponse());
$response = json_decode($client->getResponse()->getContent());
$this->assertTrue(isset($response->products));
$this->assertCount(1, $response->products);
$product = $response->products[0];
$this->assertSame('Product #1', $product->name);
$this->assertSame(19.90, $product->price);
$this->assertSame('Awesome product!', $product->description);
}
//src/Acme/ApiBundle/Tests/Fixtures/Product.php
use AcmeApiBundleEntityProduct as ProductEntity;
use DoctrineCommonPersistenceObjectManager;
use DoctrineCommonDataFixturesFixtureInterface;
class Product implements FixtureInterface
{
public function load(ObjectManager $em)
{
$product = new ProductEntity();
$product->setName('Product #1');
$product->setPrice(19.90);
$product->setDescription('Awesome product!');
$em->persist($product);
$em->flush();
}
}
//src/Acme/ApiBundle/Tests/Controller/ApiProductControllerTest.php
public function testGetSingleAction()
{
$this->loadFixtures(array(
'AcmeApiBundleTestsFixturesProduct',
));
$client = static::createClient();
$client->request('GET', '/products/1');
$this->isSuccessful($client->getResponse());
$response = json_decode($client->getResponse()->getContent());
$this->assertTrue(isset($response->product));
$this->assertEquals(1, $response->product->id);
$this->assertSame('Product #1', $response->product->name);
$this->assertSame(19.90, $response->product->price);
$this->assertSame(
'Awesome product!',
$response->product->description
);
}
//src/Acme/ApiBundle/Tests/Controller/ApiProductControllerTest.php
public function testPutAction()
{
$this->loadFixtures(array(
'AcmeApiBundleTestsFixturesProduct',
));
$product = array(
'name' => 'New name',
'price' => 39.90,
'description' => 'Awesome new description'
);
$client = static::createClient();
$client->request(
'PUT',
'/products/1',
array(), array(), array(),
json_encode($product)
);
$this->isSuccessful($client->getResponse());
$this->assertEquals(204, $client->getResponse()->getStatusCode());
}
//src/Acme/ApiBundle/Tests/Controller/ApiProductControllerTest.php
/**
* @depends testPutAction
*/
public function testPutActionWithVerification()
{
$client = static::createClient();
$client->request('GET', '/products/1');
$this->isSuccessful($client->getResponse());
$response = json_decode($client->getResponse()->getContent());
$this->assertTrue(isset($response->product));
$this->assertEquals(1, $response->product->id);
$this->assertSame('New name', $response->product->name);
$this->assertSame(39.90, $response->product->price);
$this->assertSame(
'Awesome new description',
$response->product->description
);
}
//src/Acme/ApiBundle/Tests/Controller/ApiProductControllerTest.php
public function testPatchAction()
{
$this->loadFixtures(array(
'AcmeApiBundleTestsFixturesProduct',
));
$patch = array(
'price' => 29.90
);
$client = static::createClient();
$client->request(
'PATCH',
'/products/1',
array(), array(), array(),
json_encode($patch)
);
$this->isSuccessful($client->getResponse());
$this->assertEquals(204, $client->getResponse()->getStatusCode());
}
//src/Acme/ApiBundle/Tests/Controller/ApiProductControllerTest.php
public function testDeleteAction()
{
$this->loadFixtures(array(
'AcmeApiBundleTestsFixturesProduct',
));
$client = static::createClient();
$client->request('DELETE', '/products/1');
$this->assertEquals(204, $client->getResponse()->getStatusCode());
}
Documentation
Rest in practice con Symfony2
//src/Acme/ApiBundle/Controller/ApiProductController.php
use NelmioApiDocBundleAnnotationApiDoc;
/**
* Returns representation of a given product
*
* **Response Format**
*
*
{
*
"product": {
*
"id": 1,
*
"name": "Product #1",
*
"price": 19.9,
*
"description": "Awesome product"
*
}
*
}
*
* @ApiDoc(
*
section="Products",
*
statusCodes={
*
200="OK",
*
404="Not Found"
*
}
* )
*/
public function getSingleAction(Product $product)
{
return array('product' => $product);
}
Rest in practice con Symfony2
Rest in practice con Symfony2
Hypermedia?
There’s a bundle
for that™
willdurand/hateoas-bundle
fsc/hateoas-bundle
//src/Acme/ApiBundle/Entity/Product.php;
use JMSSerializerAnnotation as Serializer;
use FSCHateoasBundleAnnotation as Rest;
use DoctrineORMMapping as ORM;
/**
* @ORMEntity
* @ORMTable(name="product")
* @SerializerExclusionPolicy("all")
* @RestRelation(
*
"self",
*
href = @RestRoute("acme_api_product_get_single",
*
parameters = { "id" = ".id" })
* )
* @RestRelation(
*
"products",
*
href = @RestRoute("acme_api_product_get")
* )
*/
class Product
{
...
}
Rest in practice con Symfony2
application/hal+json
Rest in practice con Symfony2
GET /orders/523 HTTP/1.1
Host: example.org
Accept: application/hal+json
HTTP/1.1 200 OK
Content-Type: application/hal+json
{
"_links": {
"self": { "href": "/orders/523" },
"invoice": { "href": "/invoices/873" }
},
"currency": "USD",
"total": 10.20
}
“What needs to be done to make the REST
architectural style clear on the notion that
hypertext is a constraint? In other words, if the
engine of application state (and hence the API)
is not being driven by hypertext, then it cannot
be RESTful and cannot be a REST API. Period.
Is there some broken manual somewhere that
needs to be fixed?”
Roy Fielding
“Tuttavia, essendo pragmatici, a volte anche
un livello 2 ben fatto è garanzia di una buona
API...”
Daniel Londero
“But don’t call it RESTful. Period.”
Roy Fielding
“Ok.”
Daniel Londero
GRAZIE
@dlondero
1 of 69

Recommended

PHP Built-in String Validation Functions by
PHP Built-in String Validation FunctionsPHP Built-in String Validation Functions
PHP Built-in String Validation FunctionsAung Khant
9K views86 slides
Perl.predefined.variables by
Perl.predefined.variablesPerl.predefined.variables
Perl.predefined.variablesKing Hom
420 views4 slides
CGI With Object Oriented Perl by
CGI With Object Oriented PerlCGI With Object Oriented Perl
CGI With Object Oriented PerlBunty Ray
32.3K views24 slides
Plsql coding conventions by
Plsql coding conventionsPlsql coding conventions
Plsql coding conventionsFang Yu
4.4K views33 slides
Swift - the future of iOS app development by
Swift - the future of iOS app developmentSwift - the future of iOS app development
Swift - the future of iOS app developmentopenak
731 views50 slides
Php My Sql by
Php My SqlPhp My Sql
Php My Sqlmussawir20
2.1K views24 slides

More Related Content

What's hot

TYPO3 Flow 2.0 Workshop T3BOARD13 by
TYPO3 Flow 2.0 Workshop T3BOARD13TYPO3 Flow 2.0 Workshop T3BOARD13
TYPO3 Flow 2.0 Workshop T3BOARD13Robert Lemke
16K views69 slides
Shell scripting - By Vu Duy Tu from eXo Platform SEA by
Shell scripting - By Vu Duy Tu from eXo Platform SEAShell scripting - By Vu Duy Tu from eXo Platform SEA
Shell scripting - By Vu Duy Tu from eXo Platform SEAThuy_Dang
1.3K views22 slides
파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD) by
파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD)파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD)
파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD)성일 한
18.3K views48 slides
Mocks Enabling Test-Driven Design by
Mocks Enabling Test-Driven DesignMocks Enabling Test-Driven Design
Mocks Enabling Test-Driven DesignAlexandre Martins
133 views115 slides
Swift Programming Language by
Swift Programming LanguageSwift Programming Language
Swift Programming LanguageGiuseppe Arici
108.7K views167 slides
perltut by
perltutperltut
perltuttutorialsruby
657 views16 slides

What's hot(12)

TYPO3 Flow 2.0 Workshop T3BOARD13 by Robert Lemke
TYPO3 Flow 2.0 Workshop T3BOARD13TYPO3 Flow 2.0 Workshop T3BOARD13
TYPO3 Flow 2.0 Workshop T3BOARD13
Robert Lemke16K views
Shell scripting - By Vu Duy Tu from eXo Platform SEA by Thuy_Dang
Shell scripting - By Vu Duy Tu from eXo Platform SEAShell scripting - By Vu Duy Tu from eXo Platform SEA
Shell scripting - By Vu Duy Tu from eXo Platform SEA
Thuy_Dang1.3K views
파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD) by 성일 한
파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD)파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD)
파이썬 플라스크로 배우는 웹프로그래밍 #4 (ABCD)
성일 한18.3K views
Swift Programming Language by Giuseppe Arici
Swift Programming LanguageSwift Programming Language
Swift Programming Language
Giuseppe Arici108.7K views
[PL] Jak nie zostać "programistą" PHP? by Radek Benkel
[PL] Jak nie zostać "programistą" PHP?[PL] Jak nie zostać "programistą" PHP?
[PL] Jak nie zostać "programistą" PHP?
Radek Benkel3K views
Php Reusing Code And Writing Functions by mussawir20
Php Reusing Code And Writing FunctionsPhp Reusing Code And Writing Functions
Php Reusing Code And Writing Functions
mussawir204.5K views
Introduction to Swift programming language. by Icalia Labs
Introduction to Swift programming language.Introduction to Swift programming language.
Introduction to Swift programming language.
Icalia Labs10K views
Denis Lebedev, Swift by Yandex
Denis  Lebedev, SwiftDenis  Lebedev, Swift
Denis Lebedev, Swift
Yandex38.4K views
GHC Participant Training by AidIQ
GHC Participant TrainingGHC Participant Training
GHC Participant Training
AidIQ605 views

Viewers also liked

Why Use “REST” Architecture for Web Services? by
Why Use “REST” Architecture for Web Services?Why Use “REST” Architecture for Web Services?
Why Use “REST” Architecture for Web Services?Arinto Murdopo
1.7K views9 slides
Rest Teoria E Pratica by
Rest Teoria E PraticaRest Teoria E Pratica
Rest Teoria E PraticaSergio Azevedo
2.8K views49 slides
Level 3 REST Makes Your API Browsable by
Level 3 REST Makes Your API BrowsableLevel 3 REST Makes Your API Browsable
Level 3 REST Makes Your API BrowsableMatt Bishop
3.9K views7 slides
Make Your API Irresistible by
Make Your API IrresistibleMake Your API Irresistible
Make Your API Irresistibleduvander
4.8K views38 slides
jQuery na Prática - Cauê Fajoli by
jQuery na Prática - Cauê FajolijQuery na Prática - Cauê Fajoli
jQuery na Prática - Cauê FajoliCaue Fajoli
390 views73 slides
Representational State Transfer (REST) and HATEOAS by
Representational State Transfer (REST) and HATEOASRepresentational State Transfer (REST) and HATEOAS
Representational State Transfer (REST) and HATEOASGuy K. Kloss
12.9K views84 slides

Viewers also liked(9)

Why Use “REST” Architecture for Web Services? by Arinto Murdopo
Why Use “REST” Architecture for Web Services?Why Use “REST” Architecture for Web Services?
Why Use “REST” Architecture for Web Services?
Arinto Murdopo1.7K views
Level 3 REST Makes Your API Browsable by Matt Bishop
Level 3 REST Makes Your API BrowsableLevel 3 REST Makes Your API Browsable
Level 3 REST Makes Your API Browsable
Matt Bishop3.9K views
Make Your API Irresistible by duvander
Make Your API IrresistibleMake Your API Irresistible
Make Your API Irresistible
duvander4.8K views
jQuery na Prática - Cauê Fajoli by Caue Fajoli
jQuery na Prática - Cauê FajolijQuery na Prática - Cauê Fajoli
jQuery na Prática - Cauê Fajoli
Caue Fajoli390 views
Representational State Transfer (REST) and HATEOAS by Guy K. Kloss
Representational State Transfer (REST) and HATEOASRepresentational State Transfer (REST) and HATEOAS
Representational State Transfer (REST) and HATEOAS
Guy K. Kloss12.9K views
REST - Representational State Transfer by Peter R. Egli
REST - Representational State TransferREST - Representational State Transfer
REST - Representational State Transfer
Peter R. Egli10.9K views
RestFest - Designing an API for developer happiness by Garry Shutler
RestFest - Designing an API for developer happinessRestFest - Designing an API for developer happiness
RestFest - Designing an API for developer happiness
Garry Shutler184 views
What REALLY Differentiates The Best Content Marketers From The Rest by Ross Simmonds
What REALLY Differentiates The Best Content Marketers From The RestWhat REALLY Differentiates The Best Content Marketers From The Rest
What REALLY Differentiates The Best Content Marketers From The Rest
Ross Simmonds2.5M views

Similar to Rest in practice con Symfony2

REST in practice with Symfony2 by
REST in practice with Symfony2REST in practice with Symfony2
REST in practice with Symfony2Daniel Londero
5.8K views72 slides
Symfony2. Database and Doctrine by
Symfony2. Database and DoctrineSymfony2. Database and Doctrine
Symfony2. Database and DoctrineVladimir Doroshenko
2.3K views32 slides
Doctrine in FLOW3 by
Doctrine in FLOW3Doctrine in FLOW3
Doctrine in FLOW3Karsten Dambekalns
4.9K views26 slides
Hacking 101 for developers by
Hacking 101 for developersHacking 101 for developers
Hacking 101 for developersTomer Zait
307 views31 slides
Migrare da symfony 1 a Symfony2 by
 Migrare da symfony 1 a Symfony2  Migrare da symfony 1 a Symfony2
Migrare da symfony 1 a Symfony2 Massimiliano Arione
930 views23 slides
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017) by
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)James Titcumb
1.6K views94 slides

Similar to Rest in practice con Symfony2(20)

REST in practice with Symfony2 by Daniel Londero
REST in practice with Symfony2REST in practice with Symfony2
REST in practice with Symfony2
Daniel Londero5.8K views
Hacking 101 for developers by Tomer Zait
Hacking 101 for developersHacking 101 for developers
Hacking 101 for developers
Tomer Zait307 views
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017) by James Titcumb
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
Kicking off with Zend Expressive and Doctrine ORM (Sunshine PHP 2017)
James Titcumb1.6K views
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017) by James Titcumb
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP UK 2017)
James Titcumb3.1K views
IPCSE12: Hands on FLOW3 by Robert Lemke
IPCSE12: Hands on FLOW3IPCSE12: Hands on FLOW3
IPCSE12: Hands on FLOW3
Robert Lemke649 views
Fluent Development with FLOW3 1.0 by Robert Lemke
Fluent Development with FLOW3 1.0Fluent Development with FLOW3 1.0
Fluent Development with FLOW3 1.0
Robert Lemke3.1K views
Hands on FLOW3 (DPC12) by Robert Lemke
Hands on FLOW3 (DPC12)Hands on FLOW3 (DPC12)
Hands on FLOW3 (DPC12)
Robert Lemke1.2K views
Treatment, Architecture and Threads by Mathias Seguy
Treatment, Architecture and ThreadsTreatment, Architecture and Threads
Treatment, Architecture and Threads
Mathias Seguy865 views
Desymfony 2011 - Habemus Bundles by Albert Jessurum
Desymfony 2011 - Habemus BundlesDesymfony 2011 - Habemus Bundles
Desymfony 2011 - Habemus Bundles
Albert Jessurum629 views
InspiringCon15: Bringing TYPO3 Legacy Applications into the Flow by mhelmich
InspiringCon15: Bringing TYPO3 Legacy Applications into the FlowInspiringCon15: Bringing TYPO3 Legacy Applications into the Flow
InspiringCon15: Bringing TYPO3 Legacy Applications into the Flow
mhelmich3K views
オレオレSecurityバンドル作っちゃいました by Katsuhiro Ogawa
オレオレSecurityバンドル作っちゃいましたオレオレSecurityバンドル作っちゃいました
オレオレSecurityバンドル作っちゃいました
Katsuhiro Ogawa5.6K views
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017) by James Titcumb
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)
James Titcumb1.5K views
Symfony2 Building on Alpha / Beta technology by Daniel Knell
Symfony2 Building on Alpha / Beta technologySymfony2 Building on Alpha / Beta technology
Symfony2 Building on Alpha / Beta technology
Daniel Knell750 views

More from Daniel Londero

Magento meets vagrant by
Magento meets vagrantMagento meets vagrant
Magento meets vagrantDaniel Londero
636 views40 slides
Random Tips for Remote Working by
Random Tips for Remote WorkingRandom Tips for Remote Working
Random Tips for Remote WorkingDaniel Londero
532 views8 slides
Lavorare da casa: siamo pronti? by
Lavorare da casa: siamo pronti?Lavorare da casa: siamo pronti?
Lavorare da casa: siamo pronti?Daniel Londero
739 views53 slides
Symfony2, SQL e NoSQL. Assieme. Si può. by
Symfony2, SQL e NoSQL. Assieme. Si può.Symfony2, SQL e NoSQL. Assieme. Si può.
Symfony2, SQL e NoSQL. Assieme. Si può.Daniel Londero
842 views38 slides
Lavorare da casa: siamo pronti? by
Lavorare da casa: siamo pronti?Lavorare da casa: siamo pronti?
Lavorare da casa: siamo pronti?Daniel Londero
1K views41 slides
Io cache, tu database by
Io cache, tu databaseIo cache, tu database
Io cache, tu databaseDaniel Londero
747 views22 slides

More from Daniel Londero(9)

Random Tips for Remote Working by Daniel Londero
Random Tips for Remote WorkingRandom Tips for Remote Working
Random Tips for Remote Working
Daniel Londero532 views
Lavorare da casa: siamo pronti? by Daniel Londero
Lavorare da casa: siamo pronti?Lavorare da casa: siamo pronti?
Lavorare da casa: siamo pronti?
Daniel Londero739 views
Symfony2, SQL e NoSQL. Assieme. Si può. by Daniel Londero
Symfony2, SQL e NoSQL. Assieme. Si può.Symfony2, SQL e NoSQL. Assieme. Si può.
Symfony2, SQL e NoSQL. Assieme. Si può.
Daniel Londero842 views
Lavorare da casa: siamo pronti? by Daniel Londero
Lavorare da casa: siamo pronti?Lavorare da casa: siamo pronti?
Lavorare da casa: siamo pronti?
Daniel Londero1K views
Symfony e grandi numeri: si può fare! by Daniel Londero
Symfony e grandi numeri: si può fare!Symfony e grandi numeri: si può fare!
Symfony e grandi numeri: si può fare!
Daniel Londero1.4K views
Enterprise Open Source: Il caso PHP by Daniel Londero
Enterprise Open Source: Il caso PHPEnterprise Open Source: Il caso PHP
Enterprise Open Source: Il caso PHP
Daniel Londero433 views

Recently uploaded

NTGapps NTG LowCode Platform by
NTGapps NTG LowCode Platform NTGapps NTG LowCode Platform
NTGapps NTG LowCode Platform Mustafa Kuğu
437 views30 slides
Initiating and Advancing Your Strategic GIS Governance Strategy by
Initiating and Advancing Your Strategic GIS Governance StrategyInitiating and Advancing Your Strategic GIS Governance Strategy
Initiating and Advancing Your Strategic GIS Governance StrategySafe Software
184 views68 slides
"Node.js Development in 2024: trends and tools", Nikita Galkin by
"Node.js Development in 2024: trends and tools", Nikita Galkin "Node.js Development in 2024: trends and tools", Nikita Galkin
"Node.js Development in 2024: trends and tools", Nikita Galkin Fwdays
33 views38 slides
Cencora Executive Symposium by
Cencora Executive SymposiumCencora Executive Symposium
Cencora Executive Symposiummarketingcommunicati21
160 views14 slides
Ransomware is Knocking your Door_Final.pdf by
Ransomware is Knocking your Door_Final.pdfRansomware is Knocking your Door_Final.pdf
Ransomware is Knocking your Door_Final.pdfSecurity Bootcamp
98 views46 slides
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ... by
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...ShapeBlue
129 views10 slides

Recently uploaded(20)

NTGapps NTG LowCode Platform by Mustafa Kuğu
NTGapps NTG LowCode Platform NTGapps NTG LowCode Platform
NTGapps NTG LowCode Platform
Mustafa Kuğu437 views
Initiating and Advancing Your Strategic GIS Governance Strategy by Safe Software
Initiating and Advancing Your Strategic GIS Governance StrategyInitiating and Advancing Your Strategic GIS Governance Strategy
Initiating and Advancing Your Strategic GIS Governance Strategy
Safe Software184 views
"Node.js Development in 2024: trends and tools", Nikita Galkin by Fwdays
"Node.js Development in 2024: trends and tools", Nikita Galkin "Node.js Development in 2024: trends and tools", Nikita Galkin
"Node.js Development in 2024: trends and tools", Nikita Galkin
Fwdays33 views
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ... by ShapeBlue
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
Live Demo Showcase: Unveiling Dell PowerFlex’s IaaS Capabilities with Apache ...
ShapeBlue129 views
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue by ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlueCloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
CloudStack Object Storage - An Introduction - Vladimir Petrov - ShapeBlue
ShapeBlue139 views
Webinar : Desperately Seeking Transformation - Part 2: Insights from leading... by The Digital Insurer
Webinar : Desperately Seeking Transformation - Part 2:  Insights from leading...Webinar : Desperately Seeking Transformation - Part 2:  Insights from leading...
Webinar : Desperately Seeking Transformation - Part 2: Insights from leading...
How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ... by ShapeBlue
How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ...How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ...
How to Re-use Old Hardware with CloudStack. Saving Money and the Environment ...
ShapeBlue171 views
Transcript: Redefining the book supply chain: A glimpse into the future - Tec... by BookNet Canada
Transcript: Redefining the book supply chain: A glimpse into the future - Tec...Transcript: Redefining the book supply chain: A glimpse into the future - Tec...
Transcript: Redefining the book supply chain: A glimpse into the future - Tec...
BookNet Canada41 views
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti... by ShapeBlue
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...
DRaaS using Snapshot copy and destination selection (DRaaS) - Alexandre Matti...
ShapeBlue141 views
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda... by ShapeBlue
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...
Hypervisor Agnostic DRS in CloudStack - Brief overview & demo - Vishesh Jinda...
ShapeBlue164 views
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P... by ShapeBlue
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...
Developments to CloudStack’s SDN ecosystem: Integration with VMWare NSX 4 - P...
ShapeBlue196 views
"Surviving highload with Node.js", Andrii Shumada by Fwdays
"Surviving highload with Node.js", Andrii Shumada "Surviving highload with Node.js", Andrii Shumada
"Surviving highload with Node.js", Andrii Shumada
Fwdays58 views
Why and How CloudStack at weSystems - Stephan Bienek - weSystems by ShapeBlue
Why and How CloudStack at weSystems - Stephan Bienek - weSystemsWhy and How CloudStack at weSystems - Stephan Bienek - weSystems
Why and How CloudStack at weSystems - Stephan Bienek - weSystems
ShapeBlue247 views
ESPC 2023 - Protect and Govern your Sensitive Data with Microsoft Purview in ... by Jasper Oosterveld
ESPC 2023 - Protect and Govern your Sensitive Data with Microsoft Purview in ...ESPC 2023 - Protect and Govern your Sensitive Data with Microsoft Purview in ...
ESPC 2023 - Protect and Govern your Sensitive Data with Microsoft Purview in ...
The Role of Patterns in the Era of Large Language Models by Yunyao Li
The Role of Patterns in the Era of Large Language ModelsThe Role of Patterns in the Era of Large Language Models
The Role of Patterns in the Era of Large Language Models
Yunyao Li91 views
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit... by ShapeBlue
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...
Transitioning from VMware vCloud to Apache CloudStack: A Path to Profitabilit...
ShapeBlue162 views
Updates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBIT by ShapeBlue
Updates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBITUpdates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBIT
Updates on the LINSTOR Driver for CloudStack - Rene Peinthor - LINBIT
ShapeBlue208 views

Rest in practice con Symfony2