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

GMO TECHNOLOGY BOOT CAMP2015(PHP編)

Jul 28, 2015

Download

Engineering

Arata Fujimura
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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

おわり