silex入門

34
それいけSilex 第15回 LOCAL PHP部勉強会 講演資料 LOCAL PHP部 佐藤琢哉(@nazo)

Upload: takuya-sato

Post on 12-Jul-2015

9.059 views

Category:

Technology


8 download

TRANSCRIPT

Page 1: Silex入門

それいけSilex

第15回 LOCAL PHP部勉強会 講演資料

LOCAL PHP部 佐藤琢哉(@nazo)

Page 2: Silex入門

この発表では Silexってものが 何なのか

わかるようにする よ!

Page 3: Silex入門

About

•もうおなじみの佐藤琢哉です •@nazo •なぞさんって今何やってるの? •それは聞いてはいけない •ただのニート?

Page 4: Silex入門

Silexとは

• Symfony2のコンポーネントを 流用 • sinatora風 • PHP5.3.2以降 • Symfony開発者のFabienさん が、直接開発している

Page 5: Silex入門

ダウンロード

• http://silex-project.org/ • INSTALL NOW!

Page 6: Silex入門
Page 7: Silex入門

なにこれ ファイルが1つしか ないんだけど

しかもtgzとかzip じゃなくてpharって

Page 8: Silex入門

おさらい

• Phar=PHP Archive • 複数のPHPファイルを1つの アーカイブにしたもの • PHPソースから直接include できる

Page 9: Silex入門

とりあえず

• Hello Worldでもしてみよう

Page 10: Silex入門

require_once __DIR__.'/silex.phar'; $app = new Silex¥Application(); $app->get('/hello/{name}', function ($name) use ($app) { return 'Hello '.$app->escape($name); } ); $app->run();

Page 11: Silex入門

えっこれだけなの ってかもっと なんかないの

Page 12: Silex入門

おさらい

• namespace • new Silex¥Application() • Silexネームスペースの Applicationクラスを生成

Page 13: Silex入門

おさらい

• 無名関数 • function($name) use($app) • ここに一時的な関数を生成 • use($app)は、外部変数$app を、この無名関数内で使用する

Page 14: Silex入門

使い方

• $app->get()で、GETメソッド で呼ばれるURLに対するルーティング を指定 • もちろんPOSTもあるよ

• 表示するHTMLを第二引数で指定

Page 15: Silex入門

よしわかった

Page 16: Silex入門

で、あれとか これとか それとか

使えないの?

Page 17: Silex入門

Extension

• 拡張機能 • もちろんPharに入っているので、 追加で何かダウンロードする必要 はない • 基本的なものは大体ある • 非公式でも結構ある • 自作も可能

Page 18: Silex入門

Extension

• DB(DoctrineExtension) • テンプレート(TwigExtension) • セッション(SessionExtension) • ログ(MonologExtension) • 国際化(TranslationExtension) • Validation(ValidatorExtension) • etc…

Page 19: Silex入門

Extension

$app->register(new Acme¥DatabaseExtension(), array( 'database.dsn' => 'mysql:host=localhost;dbname=myapp', 'database.user' => 'root', 'database.password' => 'secret_root_password', )); // $app['database'] にインスタンスが入る

使用例

Page 20: Silex入門

DB(Doctrine)

• Symfony1から使われてる Doctrineをそのまま使える • ただしDBAL(DB抽象レイヤ)のみ、 ORMは使えない • 非公式でORMが使えるExtensionは存在する

• DoctrineそのものはSilex.pharには入っていないので注意

Page 21: Silex入門

DB(Doctrine)

$app->register(new Silex¥Extension¥DoctrineExtension(), array( 'db.options' => array( 'driver' => 'pdo_sqlite', 'path' => __DIR__.'/app.db', ), 'db.dbal.class_path' => __DIR__.'/vendor/doctrine-dbal/lib', 'db.common.class_path' => __DIR__.'/vendor/doctrine-common/lib', )); $app->get('/blog/show/{id}', function ($id) use ($app) { $sql = "SELECT * FROM posts WHERE id = ?"; $post = $app['db']->fetchAssoc($sql, array((int) $id)); return "<h1>{$post['title']}</h1>". "<p>{$post['body']}</p>"; });

Page 22: Silex入門

テンプレート(Twig)

• Symfony2のテンプレートエンジンが使える

• TwigそのものはSilex.pharには入っていないので注意

Page 23: Silex入門

テンプレート(Twig)

$app->register(new Silex¥Extension¥TwigExtension(), array( 'twig.path' => __DIR__.'/views', 'twig.class_path' => __DIR__.'/vendor/twig/lib', )); $app->get('/hello/{name}', function ($name) use ($app) { return $app['twig']->render('hello.twig', array( 'name' => $name, )); });

Page 24: Silex入門

セッション(Session)

• セッション管理 • 一般的な$_SESSIONと同等 • 設計上はCookie以外にも保存できる

Page 25: Silex入門

セッション(Session)

$app->register(new Silex¥Extension¥SessionExtension()); use Symfony¥Component¥HttpFoundation¥Response; $app->get('/login', function () use ($app) { $username = $app['request']->server->get('PHP_AUTH_USER', false); $password = $app['request']->server->get('PHP_AUTH_PW'); if ('igor' === $username && 'password' === $password) { $app['session']->set('user', array('username' => $username)); return $app->redirect('/account'); } $response = new Response(); $response->headers->set('WWW-Authenticate', sprintf('Basic realm="%s"', 'site_login')); $response->setStatusCode(401, 'Please sign in.'); return $response; }); $app->get('/account', function () use ($app) { if (null === $user = $app['session']->get('user')) { return $app->redirect('/login'); } return "Welcome {$user['username']}!"; });

Page 26: Silex入門

ところでさっきから 1ファイルに書いて

るけど 規模が大きくなったらどうするの?

Page 27: Silex入門

マウント

• 他のファイルの処理をマウントすることができる

• 遅延読み込みをすることによって、規模が大きいアプリケーションでもそれほど重くならない

• $app->register等はマウント先のアプリケーション単位で行う

Page 28: Silex入門

マウント

$app = new Silex¥Application(); $app->mount('/blog', new Silex¥LazyApplication(__DIR__.'/blog.php')); $app->run(); // blog.php require_once __DIR__.'/silex.phar'; $app = new Silex¥Application(); // あなたのブログアプリケーションを定義 $app->get('/post/{id}', function ($id) { ... }); // アプリケーションのインスタンスを返す return $app;

Page 29: Silex入門

あと、 アクションは

メソッドチェーンで いろいろ属性を 追加できるよ

Page 30: Silex入門

簡単なバリデーション

• 正規表現で引数をバリデーション • $app->get(…)->assert('id',

'¥d');

Page 31: Silex入門

使いどころ

• 2~3画面程度のシステム • 使い捨てシステム • 本格開発前のスクラッチ

Page 32: Silex入門

本格的には使える?

• そこそこ使える • あれこれやってるうちに普通のフレームワークを使ったほうが早いというオチになる可能性もあるので注意

Page 34: Silex入門

おわり