CakePHPでHello, world(したかった)

作成: 2019年02月25日

更新: 2021年03月29日

目標

PHPでHello, worldもできない状態からCakePHPを使ってテキストフィールドにテキストを打ち込んで打ち込まれたテキストを保存し、表示することができるWebアプリを作る。筆者はWindowsで作成したがたぶんMacでもできます。

環境構築

PHPがなかったのでまずPHPをインストールします。PHPのインストールには【超初心者向け】PHPをインストールする方法(Windows 7)を参考にしました。筆者はWindows10ですがまあ大丈夫でしょう。ここからダウンロードするバージョンを選びます。筆者はCurrent Stableと書いてあったPHP 7.2.12を選びました。筆者はWindowsなのでWindows downloadsを選びました。Macだとたぶん違うんでしょう。
php1.jpg
次のページではx86用かx64用か、それとスレッドセーフ用かどうかを選びます。筆者のWinsowsは64ビットなのでx64、あとサーバーはたぶん使わないので関係ないですが一応スレッドセーフを選びました。
php2.jpg
これをphp-7.2.12というディレクトリに解凍してC直下(好み)に置きました。そしたら環境変数を編集してPathを通します。
これでPHPを使えるはずなのでコマンドプロンプトでチェックしましょう。以下のコマンドでPHPのバージョンがチェックできます。

php -v

以下のようにでたら大丈夫です。

PHP 7.2.12 (cli) (built: Nov  8 2018 05:47:36) ( ZTS MSVC15 (Visual C++ 2017) x64 )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

これでPHPはインストールできたので次はCakePHPを導入します。
公式のクイックスタートガイドを参考に進めます。
Composerというソフトを使うことを進めてくるのでこちらDownload Composerから適切なものをインストールします。筆者はWindowsなのでWindowsインストーラーを使いました。チェックボックスはすべてデフォルトで進めました。途中proxyの設定とかありましたがたぶん関係ないのでスルーしました。インストールすると自動でComposerにPathが通っているので、プロジェクトを作りたいディレクトリで以下のコマンドを打ちます。

composer self-update && composer create-project --prefer-dist cakephp/app cms

しかし、ここで謎のエラーが

Your requirements could not be resolved to an installable set of packages.
Problem 1
    - cakephp/cakephp 3.6.9 requires ext-intl * -> the requested PHP extension intl is missing from your system.
    - cakephp/cakephp 3.6.8 requires ext-intl * -> the requested PHP extension intl is missing from your system.
    以下略

調べるとphp.initの拡張がうまくいっていないらしい。そういえばComposerインストール中になんか変えられたような。ここ【Windows】CakePHP3をインストールする方法を参考にphpのphp.initの最後に以下の1行を追加

php.initextension=php_intl.dll

これで再び以下のコマンドを打つ

composer self-update && composer create-project --prefer-dist cakephp/app cms

最後のSet Folder Permissions ? (Default to Y)という選択肢はよくわからないのでデフォルトのYで。
これで環境構築は終了。
確認のため作成されたcms/binディレクトリに移動し以下のコマンドでサーバーを起動。

cake server

この状態で表示されたURL(筆者の場合はhttp://localhost:8765/)に行くと、以下のようなページが表示される。
cake.png

プロジェクトの作成

この時点でひな形が出来上がっているのでこれをもとに作ってみる。まずはcms/config/routes.php内のRouter::scope内に以下を追加

routes.php
$routes->connect(
        '/hello',
        ['controller' => 'Hello', 'action' => 'hello']
    );

これで/helloへのアクセスがあった場合HelloControllerのhelloメソッドを動かすことを定める。
cms/src/ControllerにHelloController.phpを作る

HelloController.php<?php

namespace App\Controller;

use Cake\Controller\Controller;
use Cake\Event\Event;

class HelloController extends AppController
{
    public function hello()
    {
        $this->render('/Hello/hello');
    }
}

helloメソッドは今はシンプルにcms/src/Template/Hello/hello.ctpを表示するだけである。cms/src/Templateの部分を省略してる。
cms/src/Template/Hello/hello.ctpを以下のように作る。

hello.ctpHello!

CakePHPではhtmlの代わりにctpでページを作る。

これでcms/bin上で以下のコマンドによりサーバーを起動する。

cake server

http://localhost:8765/helloに行くと以下のようなページが表示される。
hello.png
次にモデルを作るはずだったが、ここで挫折。データベース作成時に直接sqlをたたきたくなかったのでMySQLではなくSQLiteを使いたかったがなかなかうまくいかなかった。もしうまくいったら更新したい。

まとめ

データベース周りの情報が少ないうえに違っていてうまくいかなかった。

参考にしたサイト

【超初心者向け】PHPをインストールする方法(Windows 7)
CakePHP 概要(CakePHP公式)
【Windows】CakePHP3をインストールする方法