Silex入門

12,191 views

Published on

第15回 LOCAL PHP部 勉強会

Published in: Technology
0 Comments
9 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
12,191
On SlideShare
0
From Embeds
0
Number of Embeds
588
Actions
Shares
0
Downloads
29
Comments
0
Likes
9
Embeds 0
No embeds

No notes for slide

Silex入門

  1. 1. 第15回 LOCAL PHP部勉強会 講演資料 それいけSilex LOCAL PHP部 佐藤琢哉(@nazo)
  2. 2. この発表ではSilexってものが 何なのかわかるようにする よ!
  3. 3. • もうおなじみの佐藤琢哉です• @nazo• なぞさんって今何やってるの? • それは聞いてはいけない • ただのニート? About
  4. 4. • Symfony2のコンポーネントを流用• sinatora風• PHP5.3.2以降• Symfony開発者のFabienさんが、直接開発している Silexとは
  5. 5. • http://silex-project.org/• INSTALL NOW! ダウンロード
  6. 6. なにこれファイルが1つしか ないんだけどしかもtgzとかzipじゃなくてpharって
  7. 7. • Phar=PHP Archive• 複数のPHPファイルを1つのアーカイブにしたもの• PHPソースから直接includeできる おさらい
  8. 8. • Hello Worldでもしてみよう とりあえず
  9. 9. require_once __DIR__./silex.phar;$app = new Silex¥Application();$app->get(/hello/{name}, function ($name) use ($app) { return Hello .$app->escape($name); });$app->run();
  10. 10. えっこれだけなの ってかもっと なんかないの
  11. 11. • namespace• new Silex¥Application()• SilexネームスペースのApplicationクラスを生成 おさらい
  12. 12. • 無名関数• function($name) use($app)• ここに一時的な関数を生成• use($app)は、外部変数$appを、この無名関数内で使用する おさらい
  13. 13. • $app->get()で、GETメソッドで呼ばれるURLに対するルーティングを指定 • もちろんPOSTもあるよ• 表示するHTMLを第二引数で指定 使い方
  14. 14. よしわかった
  15. 15. で、あれとか これとか それとか使えないの?
  16. 16. • 拡張機能• もちろんPharに入っているので、追加で何かダウンロードする必要はない• 基本的なものは大体ある• 非公式でも結構ある• 自作も可能 Extension
  17. 17. • DB(DoctrineExtension)• テンプレート(TwigExtension)• セッション(SessionExtension)• ログ(MonologExtension)• 国際化(TranslationExtension)• Validation(ValidatorExtension)• etc… Extension
  18. 18. 使用例$app->register(new Acme¥DatabaseExtension(), array( database.dsn => mysql:host=localhost;dbname=myapp, database.user => root, database.password => secret_root_password,));// $app[database] にインスタンスが入る Extension
  19. 19. • Symfony1から使われてるDoctrineをそのまま使える• ただしDBAL(DB抽象レイヤ)のみ、ORMは使えない • 非公式でORMが使えるExtension は存在する• DoctrineそのものはSilex.pharには 入っていないので注意 DB(Doctrine)
  20. 20. $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>";}); DB(Doctrine)
  21. 21. • Symfony2のテンプレートエンジ ンが使える• TwigそのものはSilex.pharには 入っていないので注意テンプレート(Twig)
  22. 22. $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, ));});テンプレート(Twig)
  23. 23. • セッション管理• 一般的な$_SESSIONと同等• 設計上はCookie以外にも保存 できるセッション(Session)
  24. 24. $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]}!";});セッション(Session)
  25. 25. ところでさっきから1ファイルに書いて るけど規模が大きくなったらどうするの?
  26. 26. • 他のファイルの処理をマウントす ることができる• 遅延読み込みをすることによって、 規模が大きいアプリケーションで もそれほど重くならない• $app->register等はマウント 先のアプリケーション単位で行う マウント
  27. 27. $app = new Silex¥Application();$app->mount(/blog,new Silex¥LazyApplication(__DIR__./blog.php));$app->run();// blog.phprequire_once __DIR__./silex.phar;$app = new Silex¥Application();// あなたのブログアプリケーションを定義$app->get(/post/{id}, function ($id) { ... });// アプリケーションのインスタンスを返すreturn $app; マウント
  28. 28. あと、 アクションはメソッドチェーンで いろいろ属性を 追加できるよ
  29. 29. • 正規表現で引数をバリデーション• $app->get(…)->assert(id, ¥d);簡単なバリデーション
  30. 30. • 2~3画面程度のシステム• 使い捨てシステム• 本格開発前のスクラッチ 使いどころ
  31. 31. • そこそこ使える• あれこれやってるうちに普通のフ レームワークを使ったほうが早い というオチになる可能性もある ので注意本格的には使える?
  32. 32. • 公式• http://silex-users-jp.phper.jp/ • ↑必見 もっと知りたい!
  33. 33. おわり

×