Silex入門
Upcoming SlideShare
Loading in...5
×
 

Silex入門

on

  • 8,755 views

第15回 LOCAL PHP部 勉強会

第15回 LOCAL PHP部 勉強会

Statistics

Views

Total Views
8,755
Views on SlideShare
8,188
Embed Views
567

Actions

Likes
8
Downloads
20
Comments
0

6 Embeds 567

http://labs.nazone.info 558
http://wiki.onakasuita.org 3
http://webcache.googleusercontent.com 3
http://tweetedtimes.com 1
http://us-w1.rockmelt.com 1
http://a0.twimg.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial LicenseCC Attribution-NonCommercial License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Silex入門 Silex入門 Presentation Transcript

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