Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Silex入門

12,942 views

Published on

第15回 LOCAL PHP部 勉強会

Published in: Technology
  • Be the first to comment

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. おわり

×