RitoLabo

CakePHP3入門編。簡単にさっとMVCでHelloWorldとデータの受け渡しを行う

  • 公開:
  • カテゴリ: PHP CakePHP
  • タグ: PHP,Beginner,MVC,CakePHP,3.5

CakePHP3をインストールし初期設定を行って次にやる事といえば、ひとまずMVC流して一連の流れで画面出力をしてみようという事になるかと思います。

今回は入門編という事で、簡単にコントローラとビューを通して画面出力を行う事と、コントローラからビューへのデータの受け渡し&表示を行います。

アジェンダ
  1. コントローラの作成
  2. ビューの作成
    1. 「.ctp」について
    2. 動作確認
  3. コントローラからデータを渡す
    1. コントローラの実装
    2. 「compact()」について
    3. ビューテンプレートの実装
    4. 「h()」について
    5. 動作確認

コントローラの作成

まずはコントローラを作成します。cakephpのルートディレクトリへ移動し、以下のbakeコマンドを叩き、Sampleコントローラを生成します。

# CakePHPのルートディレクトリへ移動する
cd /path/to/cakephp

# bakeコマンドでコントローラを生成する
bin/cake bake controller Sample

# 実行結果
[demo@localhost cakephp]# bin/cake bake controller Sample

Baking controller class for Sample...

Creating file /var/www/html/cakephp/src/Controller/SampleController.php
Wrote `/var/www/html/cakephp/src/Controller/SampleController.php`
Bake is detecting possible fixtures...

Baking test case for App\Controller\SampleController ...

Creating file /var/www/html/cakephp/tests/TestCase/Controller/SampleControllerTest.php
Wrote `/var/www/html/cakephp/tests/TestCase/Controller/SampleControllerTest.php`

cakephp/src/Controller 配下に SampleController.php が生成されます

cakephp
├─ src
│   ├─ Controller
│   │   ├─ AppController.php
│   │   ├─ ErrorController.php
│   │   ├─ PagesController.php
│   │   └─
SampleController.php
cakephp/src/Controller/SampleController.php
<?php
namespace App\Controller;

use App\Controller\AppController;

/**
* Sample Controller
*
*
* @method \App\Model\Entity\Sample[]|\Cake\Datasource\ResultSetInterface paginate($object = null, array $settings = [])
*/
class SampleController extends AppController
{

/**
* Index method
*
* @return \Cake\Http\Response|void
*/
public function index()
{
$sample = $this->paginate($this->Sample);

$this->set(compact('sample'));
}

/**
* View method
*
* @param string|null $id Sample id.
* @return \Cake\Http\Response|void
* @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
*/
public function view($id = null)
{
$sample = $this->Sample->get($id, [
'contain' => []
]);

$this->set('sample', $sample);
}

/**
* Add method
*
* @return \Cake\Http\Response|null Redirects on successful add, renders view otherwise.
*/
public function add()
{
$sample = $this->Sample->newEntity();
if ($this->request->is('post')) {
$sample = $this->Sample->patchEntity($sample, $this->request->getData());
if ($this->Sample->save($sample)) {
$this->Flash->success(__('The sample has been saved.'));

return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__('The sample could not be saved. Please, try again.'));
}
$this->set(compact('sample'));
}

/**
* Edit method
*
* @param string|null $id Sample id.
* @return \Cake\Http\Response|null Redirects on successful edit, renders view otherwise.
* @throws \Cake\Network\Exception\NotFoundException When record not found.
*/
public function edit($id = null)
{
$sample = $this->Sample->get($id, [
'contain' => []
]);
if ($this->request->is(['patch', 'post', 'put'])) {
$sample = $this->Sample->patchEntity($sample, $this->request->getData());
if ($this->Sample->save($sample)) {
$this->Flash->success(__('The sample has been saved.'));

return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__('The sample could not be saved. Please, try again.'));
}
$this->set(compact('sample'));
}

/**
* Delete method
*
* @param string|null $id Sample id.
* @return \Cake\Http\Response|null Redirects to index.
* @throws \Cake\Datasource\Exception\RecordNotFoundException When record not found.
*/
public function delete($id = null)
{
$this->request->allowMethod(['post', 'delete']);
$sample = $this->Sample->get($id);
if ($this->Sample->delete($sample)) {
$this->Flash->success(__('The sample has been deleted.'));
} else {
$this->Flash->error(__('The sample could not be deleted. Please, try again.'));
}

return $this->redirect(['action' => 'index']);
}
}

bakeコマンドでコントローラを生成すると、CRUDが一式実装された形で出力されますが、、今回必要なのはここだけです。

<?php
namespace App\Controller;

use App\Controller\AppController;

/**
* Sample Controller
*/
class SampleController extends AppController
{
public function index()
{
$this->viewBuilder()->layout(false);
$this->set(compact('sample'));
}

}

ビューの作成

cakephp/src/Template 配下に Sample ディレクトリを作成し、その中に index.ctp を作成します。

cakephp
├─ src
│   ├─ Template
│   │   ├─
Sample
│   │   └─
index.ctp

尚、こういう構造でディレクトリとCTPファイルを作成するのにも意味があり、
Sampleディレクトリ = Sampleコントローラ
index.ctp = indexアクション
という具合に、コントローラやアクションに連動してCakePHP側が自動でビューのレンダリングを行ってくれます。

今回はSampleコントローラでindexアクションを実装したので、これでビューとの関連付けまで行えた。という事になります。

index.ctp を以下のように記述します。

cakephp/src/Template/Sample/index.ctp
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Sample page index</title>
</head>
<body>
<p>Hello CakePHP3!!</p>
</body>
</html>

「.ctp」について

CakePHPのテンプレートファイルに使われる拡張子「.ctp」とは、「CakePHP Template」の略です。

HTMLをベースとしながらも、ビュー変数の展開や、PHP構文も織り交ぜる事が出来るテンプレートファイル形式になっています。

動作確認

それでは実際にブラウザからアクセスして画面出力を行ってみます。

http://YOUR-DOMAIN/sampleにアクセスします。

HelloWorld画面表示

「Hello CakePHP3!!」と表示されていたら成功です。

コントローラからデータを渡す

一連の流れは掴めたと思うので、今度はコントローラからビューへデータを渡し、ビューで受け取ったデータを表示してみます。

コントローラの実装

Sampleコントローラを以下のように記述します。今回は、偉人リンカーンの格言を渡してみたいと思います。

cakephp/src/Controller/SampleController.php
<?php
namespace App\Controller;

use App\Controller\AppController;

/**
* Sample Controller
*/
class SampleController extends AppController
{
public function index()
{
$this->viewBuilder()->layout(false);

$maxim_en = 'I will prepare and some day my chance will come.';
$maxim_jp = '準備しておこう。チャンスはいつか訪れるものだ。';
$maxim_person = 'Abraham Lincoln (エイブラハム・リンカーン)';

$this->set(compact('maxim_en', 'maxim_jp', 'maxim_person'));
}
}

「compact()」について

compactメソッドでsetすると、変数名から配列を作成してくれます。
例)

$book_name = '本の名前';
$book_author = '本の著者';
$book_release = '本の発売日';

compactメソッドを使わない場合は、3回setする必要がありました。

$this->set('book_name', $book_name);
$this->set('book_author', $book_author);
$this->set('book_release', $book_release);

しかし、compactメソッドを使えば一度で複数の変数をセット出来るようになりました。

$this->set(compact('book_name', 'book_author', 'book_release'));

上記のようにすると、viewに「$book_name」「$book_author」「$book_release」が送られます。

ビューテンプレートの実装

最後はビューです。テンプレートファイルを以下のように記述します。

cakephp/src/Template/Sample/index.ctp
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Sample page index</title>
</head>
<body>
<p>Hello CakePHP3!!</p>
<dl>
<dt><?= h($maxim_en) ?></dt>
<dd><?= h($maxim_jp) ?></dd>
<dd><?= h($maxim_person) ?></dd>
</dl>
</body>
</html>

コントローラーの中で set() で設定した変数はそのまま「$変数名」としてビュー変数を展開することができます。

「h()」について

h()関数は、htmlspecialchars関数の事です。変数データ(特殊文字)をエスケープ(HTML エンティティに変換)します。自動では出力をエスケープしないので、変数展開時には基本的に常用する事が奨励されています。

動作確認

それでは再度、ブラウザからアクセスして表示を確認してみます。
http://YOUR-DOMAIN/sample

データを受け渡した画面表示

無事にコントローラからビューへデータが渡りました。

まとめ

作業は以上になります。
CakePHPは暗黙ルールで処理が行われるので、基本的な流れであればルーティングなどは記述しなくても画面表示まで一気に行えてしまいます。

逆に言えば、この辺に慣れないとなかなか戸惑う部分もあるので、一度覚えてしまえばスラスラ書けるようになるので是非試してみてください。