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
340
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
86
Clean Code - Como não escrever um código digno de "WTF?!"
jeanpimentel
0
68
Acessibilidade no Android - 101 - Google IO Extended 2017
jeanpimentel
0
180
DiffUtil
jeanpimentel
0
120
Recursos do iOS que talvez você não conheça!
jeanpimentel
2
270
Apps realtime com Firebase
jeanpimentel
0
74
A Linguagem Swift
jeanpimentel
0
49
Other Decks in Programming
See All in Programming
Claude Codeログ基盤の構築
giginet
PRO
7
3.4k
Understanding Apache Lucene - More than just full-text search
spinscale
0
120
Takumiから考えるSecurity_Maturity_Model.pdf
gessy0129
1
150
RubyとGoでゼロから作る証券システム: 高信頼性が求められるシステムのコードの外側にある設計と運用のリアル
free_world21
0
300
Rで始めるML・LLM活用入門
wakamatsu_takumu
0
180
Fundamentals of Software Engineering In the Age of AI
therealdanvega
1
260
ポーリング処理廃止によるイベント駆動アーキテクチャへの移行
seitarof
3
1.1k
AHC061解説
shun_pi
0
380
The free-lunch guide to idea circularity
hollycummins
0
240
AWS Infrastructure as Code の新機能 2025 総まとめ 〜SA 4人による怒涛のデモ祭り〜
konokenj
10
3.4k
How to stabilize UI tests using XCTest
akkeylab
0
130
ふつうのRubyist、ちいさなデバイス、大きな一年 / Ordinary Rubyists, Tiny Devices, Big Year
chobishiba
1
460
Featured
See All Featured
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
180
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
260
Git: the NoSQL Database
bkeepers
PRO
432
66k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
85
Optimizing for Happiness
mojombo
378
71k
For a Future-Friendly Web
brad_frost
183
10k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
63
51k
Speed Design
sergeychernyshev
33
1.6k
Unsuck your backbone
ammeep
672
58k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
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!