1. Home
  2. PHP
  3. CakePHP
  4. CakePHP3入門編。簡単にさっとMVCでHelloWorldとデータの受け渡しを行う

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

  • 公開日
  • 更新日
  • カテゴリ:CakePHP
  • タグ:PHP,Beginner,MVC,CakePHP
CakePHP3入門編。簡単にさっとMVCでHelloWorldとデータの受け渡しを行う

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

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

Contents

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

コントローラの作成

まずはコントローラを作成します。 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 にアクセスします。

「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 は暗黙ルールで処理が行われるので、基本的な流れであればルーティングなどは記述しなくても画面表示まで一気に行えてしまいます。

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

Author

rito

  • Backend Engineer
  • Tokyo, Japan
  • PHP 5 技術者認定上級試験 認定者
  • 統計検定 3 級