gmo technology boot camp2015(php編)

112
1 2015612GMOインターネット株式会社 世代システム研究室 藤村 2015 GMO TECHNOLOGY BOOT CAMP PHP

Upload: arata-fujimura

Post on 28-Jul-2015

230 views

Category:

Engineering


1 download

TRANSCRIPT

Page 1: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

1

2015年6月12日

GMOインターネット株式会社 次

世代システム研究室

藤村 新

2015

GMO TECHNOLOGY BOOT CAMP

PHP

Page 2: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

2

自己紹介

Page 3: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

藤村 新 ふじむら あらた

アジャイルPM研究会所属

省略

Page 4: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

4

伝えたいこと覚えてますか?

Page 5: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

1.夢や実現したいことを言葉に出そう

2.自己投資しよう 3.まずは行動しよう

伝えたいこと

Page 6: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

6

その後の近況報告

Page 7: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

スプツニ子!に会った(話し聞いた)

Page 9: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

9

5/29-30 Regional Scrum Gathering Vietnam 2015

• 参加してきた(自費)

Page 10: GMO TECHNOLOGY BOOT CAMP2015(PHP編)
Page 11: GMO TECHNOLOGY BOOT CAMP2015(PHP編)
Page 12: GMO TECHNOLOGY BOOT CAMP2015(PHP編)
Page 13: GMO TECHNOLOGY BOOT CAMP2015(PHP編)
Page 14: GMO TECHNOLOGY BOOT CAMP2015(PHP編)
Page 15: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

15

今日の目的

Page 16: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

1. PHPをざっくり理解する

2. チームで何かを作れるようになる

Page 17: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

個人開発 ≠

チーム開発

Page 18: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

18

PHPとは

Page 19: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

• PHP(PHP:Hypertext Preprocessor)は、1995年最初のバージョンが生み出された。

• 当時はPHP(Personal Home Page) Toolsと呼ばれていた

Page 20: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

• PHP(PHP:Hypertext Preprocessor)は、1995年最初のバージョンが生み出された。

• 当時はPHP(Personal Home Page) Toolsと呼ばれていた

昔からある

Page 21: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

[特徴]※Wikipediaから引用 •Webアプリケーションのサーバーサイド・スクリプトに専門化している。 •C言語やJava言語に似た、平易な文法。 •データベースへの容易なアクセス(組み込み関数、および、標準ライブラリPDOによる)。 •クラスベースオブジェクト指向のサポート。 •例外処理 (try, catch, throw) のサポート。 •多くのオープンソースのフレームワークやライブラリが利用可能である。 •ASP, JSPと似たHTML埋め込み型の構文をとる。ただし最近のフレームワークを使った開発では、埋め込み型の構文を使用しないことが多い。 •様々な付加機能がPEARというオンラインライブラリ集でモジュールとして提供されている。pearコマンドで導入/管理ができる。PerlでいうところのCPANである。 •ウィキ構築に用いられるソフトのMediaWiki(Wikipediaで使われている)やPukiwikiを始めとして、数多くのオープンソースウェブアプリケーションに利用されている。 •処理系本体は、C言語で書かれている。

Page 22: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

[特徴]※Wikipediaから引用 •Webアプリケーションのサーバーサイド・スクリプトに専門化している。 •C言語やJava言語に似た、平易な文法。 •データベースへの容易なアクセス(組み込み関数、および、標準ライブラリPDOによる)。 •クラスベースオブジェクト指向のサポート。 •例外処理 (try, catch, throw) のサポート。 •多くのオープンソースのフレームワークやライブラリが利用可能である。 •ASP, JSPと似たHTML埋め込み型の構文をとる。ただし最近のフレームワークを使った開発では、埋め込み型の構文を使用しないことが多い。 •様々な付加機能がPEARというオンラインライブラリ集でモジュールとして提供されている。pearコマンドで導入/管理ができる。PerlでいうところのCPANである。 •ウィキ構築に用いられるソフトのMediaWiki(Wikipediaで使われている)やPukiwikiを始めとして、数多くのオープンソースウェブアプリケーションに利用されている。 •処理系本体は、C言語で書かれている。

•Webアプリ向け •平易な文法 •世の中で数多く使われている

Page 23: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

その他の特徴として、

Page 24: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

Disられる

PHPは初心者に学びやすいと言われていることが問題である。 Webアプリケーションをなめるな!

PHPユーザーは他の言語から学んでいるのか、という点。 PHPユーザーが他の言語ユーザーよりも弱いのは、そこなのではないか。

Page 25: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

一貫性の欠如

混血言語(C, Perl, Java)

英語も同じ?

Page 26: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

強いアイデンティティを持たない

最も強いものが生き残るのではなく、最も賢いものが生き延びるわけでもない。 唯一、生き残るのは変化できるものだけである。

過去現在に渡って躊躇無く変化してきた

Page 27: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

「PHP開発者は、開発者宇宙におけるダークマターのようだ。目に見えないし、声もあげない。だが、そこには多くの開発者が存在している」(Heroku) PHP開発者は、何で作るかよりも、何を作るかに重きを置いているのではないか。(Fujimura)

Page 28: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

当たり前だけど、ちゃんと書く!

Page 29: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

29

皆さん、開発環境ありますか?

Page 30: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

Hello, world!

<?php echo 'Hello, world!';

# php test.php Hello, world!

Page 31: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

31

休憩

https://www.flickr.com/photos/emiliokuffer/8359208711/

Page 32: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

PHPのお約束

•PHPタグ •ここから •<?php

•ここまで •?> •省略した方が良い

Page 33: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

PHPのお約束

•文末にはセミコロン(;) •コメント •一行 •// or #

•複数行 •/* から */ まで

Page 34: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

変数への代入、出力

<?php $age = 38; // 数字 echo $age; // 38と出力 $name = "Fujimura ${age}才"; echo $name; // Fujimura 38才

Page 35: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

演算子

<?php $a = 2; $b = 3; echo $a * $b; // 6 $a++; // $a = $a + 1と同じ echo $a * $b; // 9 echo $a / $b; // 1 echo $a % $b; // 0 echo 'gmo' . '.jp' // gmo.jp

Page 36: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

条件で処理を分ける

<?php $age = 18; // 20に書き換えてみる if ($age < 20) { echo 'ジュースをどうぞ。'; } else { echo 'ビールはいかがですか?'; }

Page 37: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

条件で処理を分ける

<?php $age = 18; // 20に書き換えてみる $order = 'beer'; if ($age >= 20 && $order == 'beer') { echo 'ビールをどうぞ。'; }

Page 38: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

配列

<?php $animals = array( 'bear' => 'くま', 'rabbit' => 'うさぎ' ); print_r($animals); $animals['cat'] = 'ねこ'; print_r($animals); $animals['bear'] = 'ベアー'; print_r($animals);

Page 39: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

配列

<?php $bears = array('Teddy', 'Pooh', 'Brown'); print_r($bears); $bears[] = 'Momo'; print_r($bears); $bears[5] = 'Foo'; print_r($bears);

Page 40: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

配列

<?php $animals = array( 'bears' => array('Teddy', 'Pooh', 'Brown'), 'rabbits' => array('Peter', 'Miffy', 'Cony'), ); print_r($animals); echo $animals['bears'][2]; // Brown

Page 41: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

ループ(while)

<?php $i = 1; while ($i <= 10) { echo $i; $i++; } // 1から10までの数字が表示される

Page 42: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

ループ(for)

<?php for ($i =1; $i <=10; $i++) { echo $i; } // 1から10までの数字が表示される

Page 43: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

ループ(foreach)

<?php $bears = array('Teddy', 'Pooh', 'Brown'); foreach ($bears as $bear) { echo $bear . "はクマです。¥n"; }

Page 44: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

ループ(foreach)

<?php $animals = array( 'bear' => 'くま', 'rabbit' => 'うさぎ' ); foreach ($animals as $key => $value) { echo $key . 'は' . $value . "です。¥n"; }

Page 45: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

関数(内部関数)

<?php $scores = array(57, 89, 72); $sum = array_sum($scores); $count = count($scores); $average = round(($sum / $count), 1); echo $average; // 72.7

Page 46: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

関数(内部関数)

<?php $url = 'http://www.gmo.jp/'; $html = file_get_contents($url); echo $html; $url = 'http://feeds.feedburner.com/kumagai'; $rss = simplexml_load_file($url); var_dump($rss); echo $rss->item[0]->title; // 記事タイトル

Page 47: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

関数(ユーザー関数)

<?php function average($scores) { $sum = array_sum($scores); $count = count($scores); $average = round(($sum / $count), 1); return $average; } echo average(array(57, 89, 72)) . "¥n"; echo average(array(75, 66, 98)) . "¥n";

Page 48: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

変数のスコープ

<?php $word = 'りんご'; function say() { echo $word; } say(); /* PHP Notice: Undefined variable: word */

Page 49: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

変数のスコープ

<?php $word = 'りんご'; function say($word) { echo $word; } say($word); // りんご

Page 50: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

ペアで課題を 解いてください

Page 51: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

ペアプログラミングとは •ペアプログラミングとは、二人が一つのキーボードでプログラ ミングをすること。 •driverはキーボードを叩き、observer(あるいはnavigator)は driverの書くコードを眺め、エラーや設計を吟味する。 •driver側

•どうやって機能を作るか細かいことを考える。 •observerに言われたとおりにコードを打ち込むことような ことはしない

•observer側 •driverのコードを横から睨み、バグ、デザインの改善や簡 潔化、大局的な問題について考える。

Page 52: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

1.FizzBuzz問題 •1から100まで順番に数を表示する •ただし、その数が3で割り切れるなら“Fizz”、5で割り切れるなら“Buzz”、両方で割り切れるなら“FizzBuzz”と表示する •プログラムでは、剰余演算子(%)を使ってはならない

Page 53: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

1.FizzBuzz問題(実行例)

1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 … ※実際は改行区切りで出力

Page 54: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

2.insertNum関数 •与えられた文字列に対して、数字を挿入する関数。 •挿入ルールは、最初に"1",1文字あけて"2",2文字あけて"3",... •最後はあける文字数によらず数字で終わらせる。

Page 55: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

2.insertNum関数(実行例) •呼び出し $str = 'Hello Jason, how are you?'; echo insertNum($str); •実行結果 1H2el3lo 4Jaso5n, ho6w are 7you?8

Page 56: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

3.checkSamePath関数

•渡された2つのパスが同じ場所を指しているかチェックする関数。 •同じパスなら “Match”, 異なるパスなら “Not Match”を表示する。

Page 57: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

3.checkSamePath関数(実行例1) •呼び出し1 $pathA = '/home/admin/index.html'; $pathB = '/home/admin/public_html/index.html'; if(checkSamePath($pathA, $pathB)) { echo 'Match'; } else { echo 'Not Match'; } •実行結果1 Not Match

Page 58: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

3.checkSamePath関数(実行例2) •呼び出し2 $pathA = '/home/user/../admin/./index.html'; $pathB = '/home/admin/public_html/../index.html'; if(checkSamePath($pathA, $pathB)) { echo 'Match'; } else { echo 'Not Match'; } •実行結果2 Match

Page 59: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

59

昼休憩

https://www.flickr.com/photos/emiliokuffer/8359208711/

Page 60: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

60

パフォーマンス・チューニング

Page 61: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

4.素数の数を返す関数

•コマンドラインから1つの引数Nを受け取り、N以下の素数の数を返却する。 •Nは1桁から7桁の間の整数(1~9,999,999)であること。 •正しい答えを返すのは当たり前として、実行時間の短縮を工夫してください。

Page 62: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

アプリケーションフレームワークとは

Web アプリケーションフレームワークは、動的なウェブサイト、Webアプリケーション、Webサービスの開発をサポートするために設計されたアプリケーションフレームワークである。 フレームワークの目的は、Web開発で用いられる共通した作業に伴う労力を軽減することである。 たとえば、多数のフレームワークがデータベースへのアクセスのためのライブラリや、テンプレートエンジン、セッション管理を提供し、コードの再利用を促進させるものもある。

Page 63: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

ハッピーコーディング?

「ハッピーコーディング」とは、煩わしい定型処理はすべてフレームワークに任せて、アプリケーションの中核となるロジックに集中できる状態です。 入出力の処理やリダイレクト、データベースへの接続、ロジックと表示の分離、これらをフレームワークは担ってくれます。 あなたは実現したいことをコードに書くだけです。

Page 64: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

PHPの代表的なフレームワーク

•Laravel4(近年爆発的に人気急上昇) •Symfony2(大規模重厚、多機能) •CodeIgniter(軽量、高速。ライセンス問題で話題) •FuelPHP(軽量、高速) •CakePHP(RoRのPHP版、日本で大人気) •Zend Framework2(保守的で誠実) •Silex(マイクロフレームワーク) •Yii Framework(ロシア、ウクライナ、中国) •BEAR.Sunday(DI、AOP、REST) •Phalcon(最速)

Page 65: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

PHPの代表的なフレームワーク

高級品 BEAR.Sunday Symfony

CakePHP Zend

Framework 2

日用品 Laravel

CodeIgniter (FuelPHP)

Yii

小規模 大規模

http://www.slideshare.net/KenichiMukai/conferencekphpugjp2014/56

Page 66: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

早速使ってみる!

Page 67: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

# cd /var/www # wget https://github.com/cakephp/cakephp/archive/2.6.4.zip # unzip 2.6.4.zip # ln –s cakephp-2.6.4 cakephp # chmod –R 777 cakephp/app/tmp # chmod –R 777 /var/lib/php/session # vi cakephp/app/Config/core.php Configure::write('Security.salt', 'xxxxxxxxxxxxxxxxxxxx'); Configure::write('Security.cipherSeed', '1234567890123'); # vi /etc/httpd/conf/httpd.conf DocumentRoot "/var/www/cakephp/app/webroot" AllowOverride All # service nginx stop # service httpd start

Page 68: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

# mysql –uroot –p mysql> create database gtb; mysql> create database gtb_test; mysql> quit # cd cakephp/app/Config # mv database.php.default database.php # vi database.php public $default = array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'root', 'password' => '', 'database' => 'gtb', 'prefix' => '', //'encoding' => 'utf8', );

Page 69: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

# vi database.php public $test= array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'root', 'password' => '', 'database' => 'gtb_test', 'prefix' => '', //'encoding' => 'utf8', );

Page 70: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

# cd ../.. # curl -sS https://getcomposer.org/installer | php # mv composer.phar /usr/local/bin/composer # composer update # vi app/Config/bootstrap.php require ROOT . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php' ;

Page 71: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

インストール完了! http://IPアドレス/

Page 72: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

掲示板アプリを 作ってみよう!

Page 73: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

# mysql –uroot –p gtb mysql> CREATE TABLE `posts` ( `id` int(11) unsigned NOT NULL auto_increment, `name` varchar(255) NOT NULL, `post` text NOT NULL, `active` boolean NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> quit # ./Console/cake bake all Post

Page 74: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

設定より規約 CoC(convention over

configuration)

Page 75: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

完成!

Page 76: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

http://IPアドレス/posts

"New Post"で生成(C) "View"で読み取り(R) "Edit"で更新(U) "Delete"で削除(D)

Page 77: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

CRUD UIが備えるべき機能

Page 78: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

_人人人人人人人人人人人人人_ > 突然のMVCアーキテクチャ <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

Page 79: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

Model View Controller

Page 80: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

ユーザーインターフェースをもつアプリケーションを実装するためのアーキテクチャ。 CakePHPもMVCアーキテクチャ採用のフレームワーク。

Page 81: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

http://at-grandpa.hatenablog.jp/entry/2013/11/01/072636

一般的な(勘違い)MVC

Page 82: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

Controllerが 肥大化する!

Page 83: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

http://at-grandpa.hatenablog.jp/entry/2013/11/01/072636

本来のMVC

Page 84: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

ビジネスロジック とは

Modelの持つ 加工メソッド!

Page 85: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

掲示板アプリの Controller

Page 86: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

public function index() { /* /posts でやりたい処理をここに書く */ echo 'Hello!'; $this->Post->recursive = 0; $this->set('posts', $this->Paginator->paginate()); }

/var/www/cakephp/app/Controller/PostsController.php

Page 87: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

public function index() { /* /post データの中身を見てみる */ print_r($this->Post->find("all")); $this->Post->recursive = 0; $this->set('posts', $this->Paginator->paginate()); }

/var/www/cakephp/app/Controller/UsersController.php

Page 88: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

Array ( [0] => Array ( [Post] => Array ( [id] => 1 [post] => こんにちは [active] => 1 [created] => 2015-06-08 18:39:29 [modified] => 2015-06-08 18:39:29 ) ) )

Page 89: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

掲示板アプリの View

/var/www/cakephp/app/View/Posts/add.ctp /edit.ctp /index.ctp /view.ctp

Page 90: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

<?php foreach ($posts as $post): ?> <tr> <td><?php echo h($post['Post']['id']); ?>&nbsp;</td> <td><?php echo h($post['Post']['name']); ?>&nbsp;</td> <td><?php echo h($post['Post']['post']); ?>&nbsp;</td> <td><?php echo h($post['Post']['active']); ?>&nbsp;</td> <td><?php echo h($post['Post']['created']); ?>&nbsp;</td> <td><?php echo h($post['Post']['modified']); ?>&nbsp;</td> <td class="actions"> <?php echo $this->Html->link(__('View'), array('action' => 'view', $post['Post']['id'])); ?> <?php echo $this->Html->link(__('Edit'), array('action' => 'edit', $post['Post']['id'])); ?> <?php echo $this->Form->postLink(__('Delete'), array('action' => 'delete', $post['Post']['id']), array('confirm' => __('Are you sure you want to delete # %s?', $post['Post']['id']))); ?> </td> </tr> <?php endforeach; ?>

/var/www/cakephp/app/View/Post/index.ctp

Page 91: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

掲示板アプリの Model

Page 92: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

public $validate = array( 'name' => array( 'notEmpty' => array( 'rule' => array('notEmpty'), ), 'post' => array( 'notEmpty' => array( 'rule' => array('notEmpty'), ), ), 'active' => array( 'boolean' => array( 'rule' => array('boolean'), ), ), );

/var/www/cakephp/app/Model/Post.php

Page 93: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

掲示板アプリに ビジネスロジックを 追加してみよう。 アクティブな投稿一覧が 見たい!

Page 94: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

/** * アクティブな投稿一覧を取得する。 * * @return array */ public function getActive() { $option = array( 'conditions' => array('Post.active' => 1), 'order' => array('Post.created asc'), ); return $this->find('all', $option); }

/var/www/cakephp/app/Model/Post.php

Page 95: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

# cd /var/www/cakephp/app/View/Posts # cp index.ctp active.ctp # vi active.ctp ↓以下の部分を削除↓(ページャー部分でエラーが出るため) <p> <?php echo $this->Paginator->counter(array( 'format' => __('Page {:page} of {:pages}, showing {:current} records out of {:count} total, starting on record {:start}, ending on {:end}') )); ?> </p> <div class="paging"> <?php echo $this->Paginator->prev('< ' . __('previous'), array(), null, array('class' => 'prev disabled')); echo $this->Paginator->numbers(array('separator' => '')); echo $this->Paginator->next(__('next') . ' >', array(), null, array('class' => 'next disabled')); ?> </div>

/var/www/cakephp/app/View/Post/active.ctp

Page 96: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

/** * active method * * @return void */ public function active() { $this->set('posts', $this->Post->getActive()); }

/var/www/cakephp/app/Controller/PostsController.php

http://IPアドレス/posts/active

Page 97: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

避けては通れない テストの話し

(ユニットテスト)

Page 98: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

# cd /var/www/cakephp/app # ./Console/cake bake What would you like to Bake? (D/M/V/C/P/F/T/Q) > T Enter the type of object to bake a test for or (q)uit (1/2/3/4/5/q) [q] > 1 Choose a Model class 1. AppModel 2. Post > 2 Wrote `/var/www/cakephp/app/Test/Case/Model/PostTest.php`

Page 99: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

What would you like to Bake? (D/M/V/C/P/F/T/Q) > F --------------------------------------------------------------- Bake Fixture Path: /var/www/cakephp-2.6.4/app/Test/Fixture/ --------------------------------------------------------------- Use Database Config: (default/test) Possible Models based on your current database: 1. Post Enter a number from the list above, type in the name of another model, or 'q' to exit [q] > 1 Would you like to import schema for this fixture? (y/n) [n] > y Would you like to use record importing for this fixture? (y/n) [n] > y Baking test fixture for Post... Creating file /var/www/cakephp-2.6.4/app/Test/Fixture/PostFixture.php Wrote `/var/www/cakephp-2.6.4/app/Test/Fixture/PostFixture.php`

Page 100: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

public function testgetActive(){ $actives = $this->Post->getActive(); foreach($actives as $row) { $this->assertEquals('1', $row['Post']['active']); } }

/var/www/cakephp/app/Test/Case/Model/PostTest.php

http://IPアドレス/test.php

Page 101: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

さらに一歩進んだ テストの話し

(テスト駆動開発[TDD])

Page 102: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

1.モデルに空のgetActive関数を作成 2.今回と同様のテストケース作成 3.テスト実施 4.エラーになる 5.エラーにならないようにざっくりgetActive関数

を実装 6.テスト実施 7.テスト通る 8.リファクタリング(ソースコードを綺麗にする) 9.テスト実施 10.テスト通る

Page 103: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

HTML以外の出力 (JSON, XML)

Page 104: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

public function active() { $this->viewClass = 'Json'; // $this->viewClass = 'Xml'; $this->set('posts', $this->Post->getActive()); $this->set('_serialize', array('posts')); }

/var/www/cakephp/app/Controller/PostsController.php

http://IPアドレス/posts/active

Page 105: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

掲示板拡張

Page 106: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

1. やっぱり複数のスレッドを作りたい! 2. スレッド一覧ページをTOPページにしたい 3. 投稿者固有のIDを表示したい

• 2chのIDのように、同一ブラウザからの投稿は同一IDになる

Page 107: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

ヒント

Page 108: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

# mysql –uroot –p gtb mysql> CREATE TABLE `threads` ( `id` int(11) unsigned NOT NULL auto_increment, `name` varchar(255) NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> ALTER TABLE `posts` ADD COLUMN `thread_id` int(11) unsigned NOT NULL AFTER `id`; mysql> quit # ./Console/cake bake all Thread # ./Console/cake bake all Post

Page 109: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

// Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home')); Router::connect('/', array('controller' => 'threads', 'action' => 'index'));

/var/www/cakephp/app/Config/routes.php

http://IPアドレス/

Page 110: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

あとは、 ドキュメント読もう http://book.cakephp.org/2.0/ja

/index.html

Page 111: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

Keep Problem Try

Page 112: GMO TECHNOLOGY BOOT CAMP2015(PHP編)

112

おわり