Hoje vamos brincar com os QR codes e saber como usá-los dentro de um aplicativo Silex usando um service provider. Primeiro, precisamos de um gerador de QR codes. Se encontrarmos no Packagist, podemos ver várias bibliotecas. Nós vamos usar a biblioteca endroid/qrcode.
Nós não vamos modificar o endroid/qrcode, porque vamos criar um wrapper. Esse wrapper vai receber no construtor uma instância de endroid/qrcode. Sua responsabilidade será a de levar um objeto QRCode e gerar um Symfony\Component\HttpFoundation\Response com o nosso QR code e os cabeçalhos corretamente. Aqui você pode ver os testes de unidade do nosso QrWrapper:
use Symfony\Component\HttpFoundation\Response; use G\QrWrapper; class QrWrapperTest extends PHPUnit_Framework_TestCase { public function testObjectInit() { $qrCode = $this->getMockBuilder('Endroid\QrCode\QrCode') ->disableOriginalConstructor() ->getMock(); $wrapper = new QrWrapper($qrCode); $this->assertInstanceOf('G\QrWrapper', $wrapper); } public function testGetResponseWithDefaultParameters() { $qrCode = $this->getMockBuilder('Endroid\QrCode\QrCode') ->disableOriginalConstructor() ->getMock(); $qrCode->expects($this->any())->method('get')->will($this->returnValue("hello")); $wrapper = new QrWrapper($qrCode); $response = $wrapper->getResponse(); $this->assertInstanceOf('Symfony\Component\HttpFoundation\Response', $response); $this->assertEquals("hello", $response->getContent()); $this->assertEquals("image/png", $response->headers->get('Content-Type')); } public function testGetResponseForJpg() { $qrCode = $this->getMockBuilder('Endroid\QrCode\QrCode') ->disableOriginalConstructor() ->getMock(); $qrCode->expects($this->any())->method('get')->will($this->returnValue("hello")); $wrapper = new QrWrapper($qrCode); $wrapper->setImageType('jpg'); $response = $wrapper->getResponse(); $this->assertInstanceOf('Symfony\Component\HttpFoundation\Response', $response); $this->assertEquals("hello", $response->getContent()); $this->assertEquals("image/jpeg", $response->headers->get('Content-Type')); } public function testGetResponseForJpeg() { $qrCode = $this->getMockBuilder('Endroid\QrCode\QrCode') ->disableOriginalConstructor() ->getMock(); $qrCode->expects($this->any())->method('get')->will($this->returnValue("hello")); $wrapper = new QrWrapper($qrCode); $wrapper->setImageType('jpeg'); $response = $wrapper->getResponse(); $this->assertInstanceOf('Symfony\Component\HttpFoundation\Response', $response); $this->assertEquals("hello", $response->getContent()); $this->assertEquals("image/jpeg", $response->headers->get('Content-Type')); } public function testReusingResponse() { $qrCode = $this->getMockBuilder('Endroid\QrCode\QrCode') ->disableOriginalConstructor() ->getMock(); $qrCode->expects($this->any())->method('get')->will($this->returnValue("hello")); $wrapper = new QrWrapper($qrCode); $response = new Response('foo'); $response->headers->set('xxx', 'gonzalo'); $response = $wrapper->getResponse($response); $this->assertEquals("hello", $response->getContent()); $this->assertEquals("image/png", $response->headers->get('Content-Type')); $this->assertEquals("gonzalo", $response->headers->get('xxx')); } }
Agora vamos criar o ServiceProvider. Nós só precisamos implementar ServiceProviderInterface.
use Silex\Application; use Silex\ServiceProviderInterface; use Endroid\QrCode\QrCode; class QrServiceProvider implements ServiceProviderInterface { public function register(Application $app) { $app['qrCode'] = $app->protect(function ($text, $size = null) use ($app) { $default = $app['qr.defaults']; $qr = new QrWrapper(new QrCode()); $qr->setText($text); $qr->setPadding($default['padding']); $qr->setSize(is_null($size) ? $default['size'] : $size); $qr->setImageType($default['imageType']); return $qr; }); } public function boot(Application $app) { } }
E isso é tudo. Agora podemos usar o nosso service provider dentro de uma aplicação Silex:
use Silex\Application; use G\QrServiceProvider; $app = new Application(); $app->register(new QrServiceProvider(), [ 'qr.defaults' => [ 'padding' => 5, // default: 0 'size' => 200, 'imageType' => 'png', // png, gif, jpeg, wbmp (default: png) ] ]); $app->get("/qr/base64/{text}", function($text) use ($app) { return $app['qrCode'](base64_decode($text))->getResponse(); }); $app->get("/qr/{text}", function($text) use ($app) { return $app['qrCode']($text)->getResponse(); }); $app->run();
Você pode buscar o código completo no github e também usá-lo com composer.
***
Artigo traduzido pela Redação iMasters, com autorização do autor. Publicado originalmente em http://gonzalo123.com/2013/09/02/creating-qr-codes-with-php-and-silex/