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̶ pro...
Search
Jean Pimentel
June 25, 2012
Programming
3
320
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
80
Clean Code - Como não escrever um código digno de "WTF?!"
jeanpimentel
0
57
Acessibilidade no Android - 101 - Google IO Extended 2017
jeanpimentel
0
170
DiffUtil
jeanpimentel
0
110
Recursos do iOS que talvez você não conheça!
jeanpimentel
2
270
Apps realtime com Firebase
jeanpimentel
0
71
A Linguagem Swift
jeanpimentel
0
45
Other Decks in Programming
See All in Programming
monorepo の Go テストをはやくした〜い!~最小の依存解決への道のり~ / faster-testing-of-monorepos
convto
2
510
バッチ処理を「状態の記録」から「事実の記録」へ
panda728
PRO
0
180
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
510
技術的負債の正体を知って向き合う
irof
0
210
登壇は dynamic! な営みである / speech is dynamic
da1chi
0
350
NixOS + Kubernetesで構築する自宅サーバーのすべて
ichi_h3
0
1.1k
3年ぶりにコードを書いた元CTOが Claude Codeと30分でMVPを作った話
maikokojima
0
600
AI駆動で0→1をやって見えた光と伸びしろ
passion0102
1
620
ソフトウェア設計の実践的な考え方
masuda220
PRO
4
620
kiroとCodexで最高のSpec駆動開発を!!数時間で web3ネイティブなミニゲームを作ってみたよ!
mashharuki
0
770
フロントエンド開発のためのブラウザ組み込みAI入門
masashi
6
3.2k
オープンソースソフトウェアへの解像度🔬
utam0k
17
3.1k
Featured
See All Featured
A Tale of Four Properties
chriscoyier
161
23k
RailsConf 2023
tenderlove
30
1.3k
Git: the NoSQL Database
bkeepers
PRO
431
66k
Automating Front-end Workflow
addyosmani
1371
200k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Typedesign – Prime Four
hannesfritz
42
2.8k
Leading Effective Engineering Teams in the AI Era
addyosmani
7
520
Documentation Writing (for coders)
carmenintech
75
5.1k
It's Worth the Effort
3n
187
28k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.9k
The World Runs on Bad Software
bkeepers
PRO
72
11k
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!