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/




