105
2013.05.24 Takashi Ohida LARAVEL4 HAPPY HACKING 13529日水曜日

Laravel4 Happy Hacking

Embed Size (px)

DESCRIPTION

Laravel 勉強会 東京 #1でのプレゼン資料です

Citation preview

Page 1: Laravel4 Happy Hacking

2013.05.24Takashi Ohida

LARAVEL4HAPPY HACKING

13年5月29日水曜日

Page 2: Laravel4 Happy Hacking

目次

自己紹介

PHP / フレームワーク歴

Laravel4でつくってみた

Laravel4のすごいところ紹介

13年5月29日水曜日

Page 3: Laravel4 Happy Hacking

自己紹介

13年5月29日水曜日

Page 4: Laravel4 Happy Hacking

自己紹介

名前:大日田 貴司(オオヒダ タカシ)

所属:都内ウェブ系企業

職業:開発、企画

コード書いてません(^_^;)

サービス設計とかUI/UXとか

13年5月29日水曜日

Page 5: Laravel4 Happy Hacking

PHP歴

PHP歴 8年くらい

Python / Rubyとかなんとなくわかる

GAE / Railsとか少し触ったことある

色々あるけどPHPはかわいい

13年5月29日水曜日

Page 6: Laravel4 Happy Hacking

フレームワーク歴

僕がPHPをはじめた頃

外の会社からできるプログラマが手伝いに来て言った

「まずフレームワークをつくりましょう」

13年5月29日水曜日

Page 7: Laravel4 Happy Hacking

フレームワーク歴

「フレームワーク?なにそれ?おいしいの?」

13年5月29日水曜日

Page 8: Laravel4 Happy Hacking

フレームワーク歴

当時はまだRailsなど存在せず

PHP界隈には、JavaのStrutsに影響をうけたフレームワークが出てきた頃かもという時代

13年5月29日水曜日

Page 9: Laravel4 Happy Hacking

フレームワーク歴

フレームワークとは何かがんばって調べた

MVC、アーキテクチャ設計、デザインパターン、etc ...

13年5月29日水曜日

Page 10: Laravel4 Happy Hacking

フレームワーク歴

概念のすべてを理解しきれなかったけど

「フレームワークってなんだかかっこいい!」

13年5月29日水曜日

Page 11: Laravel4 Happy Hacking

フレームワーク歴

二人でフレームワークをつくった

今思えばとても原始的なものだったけど

フレームワークをつくるのはすごく楽しかった

し、勉強になった

13年5月29日水曜日

Page 12: Laravel4 Happy Hacking

フレームワーク歴

そんなこんなでフレームワークに関心を持つようになった

13年5月29日水曜日

Page 13: Laravel4 Happy Hacking

フレームワーク歴

Railsが出た頃さわってみて、超すごい!と興奮した

PHPでいいのないのか

なかった

つくった

Railsのソースを読んでPHPでそれっぽく実装

13年5月29日水曜日

Page 14: Laravel4 Happy Hacking

フレームワーク歴

自作フレームワーカーだったので

CakePHPとか

CodeIgniter / FuelPHPとか

Symfonyとか

ちゃんと使ったことない

自作も大変なのでイイのに乗り換えたい願望

13年5月29日水曜日

Page 15: Laravel4 Happy Hacking

フレームワーク歴

PHP歴 ≒ フレームワーク歴

自作フレームワーク()

メジャーどころはなんとなく知ってる

けどちゃんと使ったことは無い

まとめ

13年5月29日水曜日

Page 16: Laravel4 Happy Hacking

LARAVEL3

13年5月29日水曜日

Page 17: Laravel4 Happy Hacking

LARAVEL3

去年のちょうど今頃、HackerNewsでみかけた

https://news.ycombinator.com/item?id=4029427

13年5月29日水曜日

Page 18: Laravel4 Happy Hacking

LARAVEL3

シンプルでクリーンな設計思想

軽量だがひと通りの機能は揃っている

拡張性(bundles)もある

が、

13年5月29日水曜日

Page 19: Laravel4 Happy Hacking

LARAVEL3

Staticメソッド多用

新しいフレームワークって色々不安

命名規則が好みではない

function action_index()とか

13年5月29日水曜日

Page 20: Laravel4 Happy Hacking

LARAVEL3

なんか惜しいというか

そんなにビビビッとこなかった

名前はかわいいのだけれど・・・

13年5月29日水曜日

Page 21: Laravel4 Happy Hacking

LARAVEL3

(́・ω・`)

13年5月29日水曜日

Page 22: Laravel4 Happy Hacking

LARAVEL3

そして、ときは流れ…

13年5月29日水曜日

Page 23: Laravel4 Happy Hacking

LARAVEL4

13年5月29日水曜日

Page 24: Laravel4 Happy Hacking

LARAVEL4

最近、ふと思った

ブログでも書こう

どうせなら自分でつくろう

全然プログラミングしてないし

リハビリもかねて

13年5月29日水曜日

Page 25: Laravel4 Happy Hacking

LARAVEL4

フレームワーク何にしよう?

13年5月29日水曜日

Page 26: Laravel4 Happy Hacking

LARAVEL4

軽量系のフレームワークをいくつか試した

Slim

Silex

Phalcon(micro)

FuelPHP

...

13年5月29日水曜日

Page 27: Laravel4 Happy Hacking

LARAVEL4

Laravel4のベータが出ていた

ので試した

13年5月29日水曜日

Page 28: Laravel4 Happy Hacking

LARAVEL4

3の思い出(使ってないけど)

13年5月29日水曜日

Page 29: Laravel4 Happy Hacking

LARAVEL4

4をみてみたらびっくり

3でイケてなかった点が

悉く「解消」していた

13年5月29日水曜日

Page 30: Laravel4 Happy Hacking

LARAVEL4

もちろん良かった点はそのままに

13年5月29日水曜日

Page 31: Laravel4 Happy Hacking

LARAVEL4

「ららべる子?」

「顔はかわいいんだけど」

「ちょっとおてんばな性格がなぁ…」

13年5月29日水曜日

Page 32: Laravel4 Happy Hacking

LARAVEL4

そんなららべる子と1年ぶりに偶然再開したら

13年5月29日水曜日

Page 33: Laravel4 Happy Hacking

LARAVEL4

かわいらしさはそのままにとても品のよい子に成長していた ...!

13年5月29日水曜日

Page 34: Laravel4 Happy Hacking

HAPPY HACKINGwith Laravel4

13年5月29日水曜日

Page 35: Laravel4 Happy Hacking

HAPPY HACKING

楽しいって何か

書いてて楽しい、嬉しい

ラクに書ける、シンプルで書きやすい

わかりやすい、悩まない

思い通りに操れる

13年5月29日水曜日

Page 36: Laravel4 Happy Hacking

HAPPY HACKING

楽しいって何か

プログラマーズハイ・高揚感

スーパーハカーな気分

マジカルな感じ・支配感

ゆけおれのコードよ

13年5月29日水曜日

Page 37: Laravel4 Happy Hacking

HAPPY HACKING

Laravelにあるもの

しっかりした枠組み

プログラミングを楽しくしてくれる仕組み

プログラミングのレベルを底上げしてくれるような思想

13年5月29日水曜日

Page 38: Laravel4 Happy Hacking

HAPPY HACKING

IoC Containerによるパワフルで賢い依存性解決

シンプルでクリーンな設計思想・記述

軽量で追いやすいコアコード

実績のある基盤(symfony component)

柔軟性、拡張性

13年5月29日水曜日

Page 39: Laravel4 Happy Hacking

HAPPY HACKING

Staticメソッド多用

IoC Container x Facadeにより解決しました

新しいフレームワークって色々不安

信頼と実績のSymfony Componentが基盤になりました

命名規則が好みではない

好みな感じ(PSR-1準拠)になりました

Laravel3のとき気になってたあれらはどうなったのか

13年5月29日水曜日

Page 40: Laravel4 Happy Hacking

HAPPY HACKING

もはやハッピーな感じしかしない

13年5月29日水曜日

Page 41: Laravel4 Happy Hacking

HAPPY HACKING

ということで

Laravel4でブログをつくってみました

13年5月29日水曜日

Page 42: Laravel4 Happy Hacking

POCHIKAポーチカ

13年5月29日水曜日

Page 43: Laravel4 Happy Hacking

POCHIKA

Laravel4でつくった軽量ブログエンジン

データベースは使わず、markdownファイルを変換

jekyll風味(けどstatic file generatorではない)

php的に動的に動作する

キャッシュとかプラグインとか

13年5月29日水曜日

Page 44: Laravel4 Happy Hacking

POCHIKA

使ってる機能

Routing

Config

Controller

Error & Logging

Cache

Events

IoC Container

View / Templates / Blade

Unit Testing

Artisan CLI

まだ使ってない機能

Forms & HTML

Database

Eloquent ORM

Localization

Queues

Mail

Security

Session

Validation

13年5月29日水曜日

Page 45: Laravel4 Happy Hacking

http://github.com/ohida/pochika

POCHIKA

13年5月29日水曜日

Page 46: Laravel4 Happy Hacking

LARAVEL4

13年5月29日水曜日

Page 47: Laravel4 Happy Hacking

LARAVEL4

IoC Container / Facade

Illuminate / composer / symfony components

psr-0(autoload) / psr-1(coding standard)

その他色々パワーアップ

3からの変更点

13年5月29日水曜日

Page 48: Laravel4 Happy Hacking

LARAVEL4

IoC Container... どのように依存性を解決するか

Facade... シンプルで強力なインターフェイス

おまけ:UnitTest

... IoC ContainerとFacadeが必要な理由

13年5月29日水曜日

Page 49: Laravel4 Happy Hacking

IOC CONTAINER

13年5月29日水曜日

Page 50: Laravel4 Happy Hacking

IOC CONTAINER

IoC ... Inversion of Control

制御の逆転

13年5月29日水曜日

Page 51: Laravel4 Happy Hacking

IOC CONTAINER

“The IoC container is at the heart of the entire application and all dependencies are resolved through that.”

Taylor Otwellさん

IoC Containerはアプリケーション全体における心臓部で、すべての依存性を解決します。

13年5月29日水曜日

Page 52: Laravel4 Happy Hacking

IOC CONTAINER

The Laravel inversion of control container is a powerful tool for managing class dependencies. Dependency injection is a method of removing hard-coded class dependencies. Instead, the dependencies are injected at run-time, allowing for greater flexibility as dependency implementations may be swapped easily.

http://four.laravel.com/docs/ioc

LaravelのIoCコンテナはクラス依存性解決のためのパワフルなツールです。DI(依存性の注入)はコードによるクラス解決を取り除き、代わりにアプリ

ケーションの実行時に依存性を注入します。このことにより依存の実装を容

易に入れ替えられるという柔軟性を得ることができます。

13年5月29日水曜日

Page 53: Laravel4 Happy Hacking

IOC CONTAINER

Basic Usage

13年5月29日水曜日

Page 54: Laravel4 Happy Hacking

IOC CONTAINER

$foo = new Foo;

13年5月29日水曜日

Page 55: Laravel4 Happy Hacking

IOC CONTAINER

$foo = App::make('Foo');

13年5月29日水曜日

Page 56: Laravel4 Happy Hacking

IOC CONTAINER

App::bind('foo', function() { return new Foo;});

$foo = App::make('foo');

13年5月29日水曜日

Page 57: Laravel4 Happy Hacking

IOC CONTAINER

$view = new SmartyView;

"

App::bind('view', function() { $smarty = new SmartyView; $smarty->.. return $smarty;});

$view = App::make('view');

13年5月29日水曜日

Page 58: Laravel4 Happy Hacking

IOC CONTAINER

$view = new TwigView;

"

App::bind('view', function() { return new TwigView([ .. ]);});

$view = App::make('view');

13年5月29日水曜日

Page 59: Laravel4 Happy Hacking

IOC CONTAINER

クラスを「直接」呼ぶのではなくIoC Containerを通して「間接的」に呼び出す

13年5月29日水曜日

Page 60: Laravel4 Happy Hacking

IOC CONTAINER

クラスが必要になった時IoC Containerさんがよしなにつくってくれる

13年5月29日水曜日

Page 61: Laravel4 Happy Hacking

IOC CONTAINER

僕:IoCさん、僕がfeedくれっていったらAtomFeedのことですからよろしくですよ

IoCさん:(o e o)アイヨ

~そしてその時がきた~

僕:「feedくれ!」

IoCさん:(o e o)つ アイヨ ~【AtomFeed】

13年5月29日水曜日

Page 62: Laravel4 Happy Hacking

IOC CONTAINER

登録App::bind('feed', function() { return new AtomFeed;});

使う$feed = App::make('feed');echo $feed->generate(); //render xml/atom

13年5月29日水曜日

Page 63: Laravel4 Happy Hacking

IOC CONTAINER

登録App::bind('feed', function() { return new RssFeed;});

使う$feed = App::make('feed');echo $feed->generate(); //render xml/rss

13年5月29日水曜日

Page 64: Laravel4 Happy Hacking

IOC CONTAINER

singletonもIoCが解決

App::singleton('foo', function(){ return new FooBar;});

13年5月29日水曜日

Page 65: Laravel4 Happy Hacking

IOC CONTAINER

既にあるインスタンスを登録することも

$foo = new Foo;

App::instance('foo', $foo);

13年5月29日水曜日

Page 66: Laravel4 Happy Hacking

IOC CONTAINER

Automatic Resolution

The IoC container is powerful enough to resolve classes without any configuration at all in many scenarios.

IoCコンテナは強力なので、多くの場合においてクラス解決のために何かをする必要はありません。

13年5月29日水曜日

Page 67: Laravel4 Happy Hacking

IOC CONTAINER

class FooBar {

public function __construct(Baz $baz) { $this->baz = $baz; }

}

$foobar = new FooBar(new Baz);

13年5月29日水曜日

Page 68: Laravel4 Happy Hacking

IOC CONTAINER

class FooBar {

public function __construct(Baz $baz) { $this->baz = $baz; }

}

$foobar = App::make(‘FooBar’);

13年5月29日水曜日

Page 69: Laravel4 Happy Hacking

IOC CONTAINER

class FooBar {

public function __construct(PiyoInterface $baz) { $this->baz = $baz; }

}

IoCさん (o e o)Interfaceかー 解決できねー...orz

なんていうことはなく

13年5月29日水曜日

Page 70: Laravel4 Happy Hacking

IOC CONTAINER

App::bind(‘PiyoInterface’, Poyo);# PiyoInterfaceが呼ばれたらPoyoのことなんだからね

13年5月29日水曜日

Page 71: Laravel4 Happy Hacking

IOC CONTAINER

class FooBar {

public function __construct(PiyoInterface $baz) { $this->baz = $baz; }

}

App::bind(‘PiyoInterface’, Poyo);

App::make(‘FooBar’);(o e o)/

13年5月29日水曜日

Page 72: Laravel4 Happy Hacking

IOC CONTAINER

class Eva {

public function __construct(PilotInterface $pilot) { $this->pilot = $pilot; }

}

App::bind(‘PilotInterface’, ‘Ayanami’)

$eva = App::make(‘Eva’);# get_class($eva->pilot) == ‘Ayanami’

13年5月29日水曜日

Page 73: Laravel4 Happy Hacking

Practical Usage実用例

IOC CONTAINER

13年5月29日水曜日

Page 74: Laravel4 Happy Hacking

IOC CONTAINER

class OrderController extends BaseController {

public function __construct(OrderRepository $orders) { $this->orders = $orders; }

public function getIndex() { $all = $this->orders->all();

return View::make('orders', compact('all')); }

}

13年5月29日水曜日

Page 75: Laravel4 Happy Hacking

IOC CONTAINER

$orders = new OrderRepository();

new OrderController($orders);

App::bind(‘OrderRepository’, ‘MockOrders’)

App::make(‘OrderControler’)

普通に書くとデータベースへの接続が発生

IoCを使うとスタブで置き換えられる

13年5月29日水曜日

Page 76: Laravel4 Happy Hacking

IOC CONTAINER

In this example, the OrderRepository class will automatically be injected into the controller. This means that when unit testing a "mock" OrderRepository may be bound into the container and injected into the controller, allowing for painless stubbing of database layer interaction.

この例では、OrderRepositoryクラスは自動的にコントローラーに注入され

ます。このことは、ユニットテストの際にモックのOrderRepositoryクラスを

コントローラに注入することができ、データベース操作部分のスタブ化が容

易になることを意味しています。

13年5月29日水曜日

Page 77: Laravel4 Happy Hacking

IOC CONTAINER

まとめ

IoCとは、Inversion Of Control(制御の逆転)

よしなにクラスをつくってくれる

よしなに依存関係を解決してくれる

テストもしやすくなる

13年5月29日水曜日

Page 78: Laravel4 Happy Hacking

FACADE

13年5月29日水曜日

Page 79: Laravel4 Happy Hacking

Facade(ファサード)とは「建物の正面」を意味する。

(wikipediaより)

FACADE

13年5月29日水曜日

Page 80: Laravel4 Happy Hacking

FACADE

なんの正面か = クラス

13年5月29日水曜日

Page 81: Laravel4 Happy Hacking

FACADE

Page::find('about');

13年5月29日水曜日

Page 82: Laravel4 Happy Hacking

FACADE

Behind the scene

13年5月29日水曜日

Page 83: Laravel4 Happy Hacking

FACADE

class Page {

private static $pages;

public static function find($name) { return self::$pages[$name]; }

}

# なるほどstaticね。Pageクラスの中身はこんな感じかな

Page::find('about');

13年5月29日水曜日

Page 84: Laravel4 Happy Hacking

FACADE

Page::find('about');

class Page {

private $pages;

public function find($name) { return $this->pages[$name]; }

}

# ちがうよ。Pageクラスはstaticメソッド持ってないよ

13年5月29日水曜日

Page 85: Laravel4 Happy Hacking

FACADE

Page::find('about');

Pageクラスではなく、実は

Facadeが呼ばれている

13年5月29日水曜日

Page 86: Laravel4 Happy Hacking

FACADE

Page::method()って書いたら、普通はPageクラスがよばれる

そして ”そのメソッドはstaticに呼べません”

というエラーが出る

Facadeを介すには?

13年5月29日水曜日

Page 87: Laravel4 Happy Hacking

FACADE

Page::method()って書いたら、Facadeの方よんでねとLaravelに教える

app/config/app.phpに書く

aliases = [ ‘Page’ => ‘Facades\Page’,];

13年5月29日水曜日

Page 88: Laravel4 Happy Hacking

FACADE

<?php namespace Pochika\Facades;

use Illuminate\Support\Facades\Facade;

class Page extends Facade { /** * Get the registered name of the component. * * @return string */ protected static function getFacadeAccessor() { return 'page'; // IoC Containerが解決できる名前 }}

13年5月29日水曜日

Page 89: Laravel4 Happy Hacking

FACADE

Page::find(‘about’);

"

Pageファサード

"

App::resolve(‘page’)->find(‘about’);

13年5月29日水曜日

Page 90: Laravel4 Happy Hacking

FACADE

$this->input->get(‘hoge’);

"

Input::get(‘hoge‘);

13年5月29日水曜日

Page 91: Laravel4 Happy Hacking

FACADE

$view = new View;$view->render(‘index.html’);"

View::make(‘index.html’);

13年5月29日水曜日

Page 92: Laravel4 Happy Hacking

FACADE

どこからでも単独で呼び出せる

$thisって誰?を意識しない

誰でもいいしいなくてもいい

疎結合

依存性、コンテキストの排除

統一されたクリーンなインターフェイス

$this->hogeだったりnew Fuga()だったりしない

13年5月29日水曜日

Page 93: Laravel4 Happy Hacking

FACADE

まとめ

Facadeを利用することで、シンプルで強力なインターフェイスでクラスを扱うことができる

13年5月29日水曜日

Page 94: Laravel4 Happy Hacking

FACADE

Laravel4はIoC ContainerとFacadeがキモ

Laravel4使うなら最初に理解するべきポイント

13年5月29日水曜日

Page 95: Laravel4 Happy Hacking

FACADE

Router

Router::get(‘/’, ‘IndexController@index’);

Event

Event::fire(‘post.converted’);

View

View::make(‘index.html’, $payload);

13年5月29日水曜日

Page 96: Laravel4 Happy Hacking

UNITTEST

13年5月29日水曜日

Page 97: Laravel4 Happy Hacking

UNITTEST

テストしやすい/しにくいってなにか

Staticメソッドでテストが難しいのはなぜか

13年5月29日水曜日

Page 98: Laravel4 Happy Hacking

UNITTEST

UnitTestではテスト毎に初期化されることが前提

前のテストの影響をうけるとまともなテストにならない

13年5月29日水曜日

Page 99: Laravel4 Happy Hacking

UNITTEST

staticオブジェクトにはconstructorとdestructorがない

初期化処理と終了処理が行われない

始まりと終わりがない

ひとつのテストによって生じた状態をクリアできない

13年5月29日水曜日

Page 100: Laravel4 Happy Hacking

UNITTEST

function testEach(){ PostRepository::each(function($post) { $post->title .= ‘:hoge’; }); $this->assertHoge(..);}

function testHoge(){ $posts = PostRepository::load(); ↑ testEachの処理を経た状態になっている ..}

class PostRepository {

private static $posts = [];

public static function load() { return self::$posts; }

public static function each ($func) { array_walk( self::$posts, $func ); }

}

テストクラス

13年5月29日水曜日

Page 101: Laravel4 Happy Hacking

まとめ

13年5月29日水曜日

Page 102: Laravel4 Happy Hacking

まとめ

Laravel4は3のときのよさ(クリーンさとか)はそのままに

IoC Containerとかcomposerで中身がおとなになった

テストもしやすい(規模に関わらずテストは必要)

PHPもここまで来たかくらいイケてる感じで書ける

13年5月29日水曜日

Page 103: Laravel4 Happy Hacking

LARAVEL4たのしい☆彡のでみんなつかおう

(自分に合うかは見極めよう)

13年5月29日水曜日

Page 104: Laravel4 Happy Hacking

13年5月29日水曜日

Page 105: Laravel4 Happy Hacking

http://solvalou.net/

http://twitter.com/ohida

http://www.facebook.com/takashi.ohida

http://github.com/ohida

Takashi Ohida

13年5月29日水曜日