Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Silex - Talk is cheap, show me the c̶o̶d̶e̶ prototype!
Search
Jean Pimentel
June 25, 2012
Programming
3
290
Silex - Talk is cheap, show me the c̶o̶d̶e̶ prototype!
Por que prototipar?
O que são microframeworks?
Silex, microframework PHP.
Como usar o Silex?
Jean Pimentel
June 25, 2012
Tweet
Share
More Decks by Jean Pimentel
See All by Jean Pimentel
Introdução ao Flutter
jeanpimentel
0
73
Clean Code - Como não escrever um código digno de "WTF?!"
jeanpimentel
0
54
Acessibilidade no Android - 101 - Google IO Extended 2017
jeanpimentel
0
140
DiffUtil
jeanpimentel
0
73
Recursos do iOS que talvez você não conheça!
jeanpimentel
2
260
Apps realtime com Firebase
jeanpimentel
0
60
A Linguagem Swift
jeanpimentel
0
39
Other Decks in Programming
See All in Programming
はてなにおける CSS Modules、及び CSS Modules に足りないもの / CSS Modules in Hatena, and CSS Modules missing parts
mizdra
7
970
PHPの次期バージョンはこの時期どうなっているのか - Internalsの開発体制について - PHPカンファレンス小田原
youkidearitai
PRO
1
220
冗長なエラーログを削減し、スタックトレースを手に入れる / Reducing Verbose Error Logs and Obtaining Stack Traces
upamune
0
990
Snowflakeで眠ったデータを起こそう!
estie
0
140
SIMD Parallel Programming with the Vector API
josepaumard
0
230
#phpcon_odawara オープン・クローズドなテストフィクスチャを求めて / open closed test fixtures
77web
3
240
Fragment Composition of GraphQL
quramy
13
1.4k
2 週間で Twitter Bot を作ってみた
contour_gara
0
760
PostmanでAPIの動作確認が楽になった話
h455h1
0
180
検証も兼ねて個人開発でHonoとかと向き合った話
hanetsuki
1
1.3k
Let's learn code review
riofujimon
2
570
R言語の環境構築と基礎 Tokyo.R 112
bob3bob3
0
280
Featured
See All Featured
From Idea to $5000 a Month in 5 Months
shpigford
378
45k
Keith and Marios Guide to Fast Websites
keithpitt
408
22k
WebSockets: Embracing the real-time Web
robhawkes
59
7k
Infographics Made Easy
chrislema
238
18k
How to Ace a Technical Interview
jacobian
273
22k
GraphQLとの向き合い方2022年版
quramy
33
12k
KATA
mclloyd
16
12k
Testing 201, or: Great Expectations
jmmastey
30
6.4k
Atom: Resistance is Futile
akmur
260
25k
The Mythical Team-Month
searls
216
42k
Visualization
eitanlees
137
14k
How GitHub (no longer) Works
holman
305
140k
Transcript
None
JEAN PIMENTEL Ciência da Computação – UFJF Analista de Sistemas
– Bolt Brasil @jeanpimentel
IDEIAS NÃO VALEM NADA!
Etapas pra produzir sua ideia: 1. Ideia 2. Documentação 3.
Mockups 4. Protótipos 5. Vídeos
POR QUE PROTOTIPAR?
None
"IT'S ONE THING TO TALK ABOUT THEM AND HAVE STORYBOARDS
AND ANOTHER THING TO SEE THEM FOR REAL.“ ROBERT HOEKMAN, JR.
None
POR MELHOR QUE VOCÊ SEJA, SEMPRE COMETERÁ ERROS.
VOCÊ NÃO PRECISA FAZER TUDO, SOMENTE O PRINCIPAL.
TERMINE O PROTÓTIPO EM 1 DIA.
ITERAÇÕES: REESTUDE O PROBLEMA, REPENSE A SOLUÇÃO.
NÃO PERCA TEMPO COM O MELHOR CÓDIGO, ELE É DESCARTÁVEL
E SOFRERÁ MUITAS ALTERAÇÕES.
NÃO PERCA TEMPO COM O MELHOR CÓDIGO, ELE É DESCARTÁVEL
E SOFRERÁ MUITAS ALTERAÇÕES. NÃO PRECISA FUNCIONAR NO IE6, NEM TER UM BOM HTML. PODE ATÉ USAR TABELA.
MICROFRAMEWORK
MICROFRAMEWORK • Esqueleto da aplicação • Controllers (MVC) – Rotas
Ações – Requests Responses • Simples
MICROFRAMEWORK • Ruby Sinatra, Cuba • Python Flask,
Pyramid • PHP Silex, Slim, Flight • Java Napalm
SILEX
SILEX • Não é o Symfony2 • PHP 5.3 •
PSR-0 • PSR-1 (?) • PSR-2 (?) • Conciso, extensível e testável
COMO USAR
1 { 2 "require": { 3 "php": ">=5.3.2", 4 "silex/silex":
"*" 5 } 6 } 1 curl -s http://getcomposer.org/installer | php 2 php composer.phar install composer.json shell
1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5
6 $app = new Silex\Application(); 7 8 // SEUS MÉTODOS AQUI 9 10 $app->run(); public/index.php
SERVICE PROVIDERS
1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5
6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 // SEUS MÉTODOS AQUI 13 14 $app->run();
SERVICES PROVIDERS • Validator • Form • Monolog • Doctrine
• Translation • E você pode fazer o seu. Basta implementar uma interface.
ROUTING
1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5
6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 $app->get('/posts', function () { 13 $posts = /* Minha query */ 14 15 $output = ''; 16 foreach ($posts as $post) 17 $output .= $post['title'] . '<br />'; 18 19 return $output; 20 }); 21 22 $app->run();
1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5
6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 $app->get('/posts', function () use ($app) { 13 $posts = /* Minha query */ 14 return $app['twig']->render('blog.twig', array('posts' => $posts)); 15 }); 16 17 $app->run(); 1 {% if posts %} 2 <ul> 3 {% for post in posts %} 4 <li>{{ post.title }}<li> 5 {% endfor %} 6 </ul> 7 {% endif %} UTILIZANDO O TWIG views/blog.twig
1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5
6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 $app->get('/posts', function () use ($app) { 13 $posts = /* Minha query */ 14 return $app['twig']->render('blog.twig', array('posts' => $posts)); 15 }); 16 17 $app->get('/post/{id}', function ($id) use ($app) { 18 $post = /* Minha query buscando o post */ 19 return $app['twig']->render('post.twig', array('post' => $post)); 20 }) 21 ->assert('id', '\d+'); 22 23 $app->run(); UTILIZANDO PARÂMETROS
1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5
6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 $app->get('/posts', function () use ($app) { 13 $posts = /* Minha query */ 14 return $app['twig']->render('blog.twig', array('posts' => $posts)); 15 }); 16 17 $app->get('/post/{id}', function ($id) use ($app) { 18 return $app['twig']->render('post.twig', array('post' => $id)); 19 }) 20 ->convert('id', function ($id) { return /* Minha query buscando post */ }); 21 22 $app->run(); CONVERTENDO O PARÂMETRO
1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5
6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 $postProvider = function ($id) { 13 return /* Minha query buscando post */ 14 }; 15 16 $app->get('/posts', function () use ($app) { 17 $posts = /* Minha query */ 18 return $app['twig']->render('blog.twig', array('posts' => $posts)); 19 }); 20 21 $app->get('/post/{id}', function ($id) use ($app) { 22 return $app['twig']->render('post.twig', array('post' => $id)); 23 }) 24 ->convert('id', $postProvider); 25 26 $app->run(); REUTILIZANDO FUNÇÕES
2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5 6 $app
= new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 $postProvider = function ($id) { 13 return /* Minha query buscando o post */ 14 }; 15 16 $app->get('/posts', function () use ($app) { 17 $posts = /* Minha query */ 18 return $app['twig']->render('blog.twig', array('posts' => $posts)); 19 }); 20 21 $app->get('/post/{id}', function ($id) use ($app) { 22 return $app['twig']->render('post.twig', array('post' => $id)); 23 }) 24 ->convert('id', $postProvider); 25 26 $app->get('/posts/categoria/{categoria}', function ($id) use ($app) { 27 $posts = /* Minha query por posts com categoria X */ 28 return $app['twig']->render('blog.twig', array('posts' => $posts)); 29 }) 30 ->value('categoria', 'php'); 31 32 $app->run(); PARÂMETROS COM VALOR DEFAULT
1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5
6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 /* ... */ 13 14 $app->get('/contato', function () use ($app) { 15 return $app['twig']->render('contato.twig') 16 }); 17 18 $app->post('/contato', function (Request $request) use ($app) { 19 $contato = array( 20 'nome' => $request->get('nome'), 21 'email' => $request->get('email'), 22 'assunto' => $request->get('assunto'), 23 'mensagem' => $request->get('mensagem'), 24 ); 25 /* Minha query salvando o contato */ 26 return $app['twig']->render('contato-sucesso.twig') 27 }); 28 29 $app->run(); GET, POST, PUT, DELETE OU MATCH
ROUTE MIDDLEWARES
1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5
6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 /* ... */ 13 14 $mustBeAnonymous = function (Request $request) use ($app) { 15 if ($app['session']->has('user')) 16 return $app->redirect('/logout'); 17 }; 18 19 $app->get('/signup', function () use ($app) { 20 return $app['twig']->render('signup.twig') 21 }) 22 ->before($mustBeAnonymous); 23 24 $app->run(); BEFORE ROUTE
2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5 6 $app
= new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 /* ... */ 13 14 $app->get('/meu-relatorio', function () use ($app) { 15 return $app['twig']->render('signup.twig') 16 }) 17 ->before(function (Request $request) use ($app) { 18 if (!$app['session']->has('user')) 19 return $app->redirect('/login'); 20 }) 21 ->before(function (Request $request) use ($app) { 22 $app['time.start'] = microtime(true) 23 }) 24 ->after(function (Request $request, Response $response) use ($app) { 25 $duracao = microtime(true) - $app['time.start']; 26 /* Minha função pra gravar em logs */ 27 }); 28 29 $app->run(); AFTER ROUTE
APPLICATION FILTERS
1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5
6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 $app->before(function (Request $request) use ($app) { 13 // set up 14 $request->getSession()->start(); 15 $app['time.start'] = microtime(true); 16 }); 17 18 $app->after(function (Request $request, Response $response) use ($app) { 19 // tear down 20 $app['time.end'] = microtime(true); 21 }); 22 23 $app->finish(function (Request $request, Response $response) use ($app) { 24 // after response has been sent 25 $duracao = $app['time.end'] - $app['time.start']; 26 /* Minha função pra gravar em logs */ 27 }); 28 29 $app->run(); BEFORE, AFTER, FINISH
ERROR CONTROL
1 <?php 2 3 // COMPOSER 4 require_once __DIR__.'/../vendor/autoload.php'; 5
6 $app = new Silex\Application(); 7 $app->register(new Silex\Provider\SessionServiceProvider()); 8 $app->register(new Silex\Provider\TwigServiceProvider(), array( 9 'twig.path' => __DIR__ . '/../views', 10 )); 11 12 /* ... */ 13 14 $app['debug'] = TRUE; 15 16 $app->error(function (\Exception $e, $code) { 17 /* Tratamento da exception */ 18 }); 19 20 $app->error(function (\LogicException $e, $code) { 21 /* Tratamento da exception */ 22 }); 23 24 $app->run();
DÚVIDAS?
OBRIGADO!