CakePHP4.xをComposerでインストールしてNginxを設定する

システムCakePHP,composer,Nginx,PHP,php-fpm

CakePHP4.xをComposerでインストールしてNginxを設定する
CakePHP4.xをComposerでインストールしてNginxを設定する

どうも、UT(@ut_1029)です。今回はCakePHP4.xをComposerでインストールする解説をします。

composerとPECLやPEARについて詳しく紹介した記事も「Composerって何?!PHPのライブラリをインストールするのにPEARやPECLは古い?」を是非ご覧ください。

CakePHP(PHPフレームワーク)の環境を構築

Composerを使ってCakePHP 4.xの公式サイト「CakePHP Installation – 4.x」を参考に環境構築を進めていきます。

Composerがインストールされている前提で進めます。またCakePHP4.xで推奨されているPHPのバージョン7.2以上などについては詳しく触れていません。
→composerについては「Composerって何?!PHPのライブラリをインストールするのにPEARやPECLは古い?」を参照ください。

intlをインストール

CakePHPでは、intlが入っていないと以下の様なエラーが出力され動作しません。なのでintlをインストールします。

Fatal error: You must enable the intl extention to use CakePHP. in ~config/requirements.php on line 31
intlとは

PHPのプログラミングで、ロケール関連のさまざまな操作を行うための国際化用拡張モジュール。

intlがインストールされているか確認します。

$ php -i | grep intl

intlがインストールされていない場合は、インストールする必要があります。なので、まずyumで管理されているintlのパッケージを確認します。

$ yum list | grep intl
intltool.noarch                        0.50.2-7.amzn2                amzn2-core
perl-libintl.x86_64                    1.20-12.amzn2.0.2             amzn2-core
php-intl.x86_64                        7.3.19-1.amzn2                amzn2extra-php7.3

intlをyumでインストールします。

$ sudo yum install php-intl.x86_64

phpとnginxを再起動します。

$ sudo systemctl restart php-fpm.service
$ sudo systemctl restart nginx.service

CakePHPプロジェクトを作成

CakePHPプロジェクトを用意するディレクトリを作成します。
(自分は/var/www/cakephpへ作成するようにしました。)

$ cd /var/www
$ sudo mkdir cakephp
# パーミッションを環境に合わせて設定
$ sudo chown nginx:user cakephp
$ sudo chmod -R 775 cakephp
$ ls -la /var/www
合計 4
drwxr-xr-x  5 nginx user   46  7月 24 17:25 .
drwxr-xr-x 20 root  root  280  9月 29  2019 ..
drwxrwxr-x  2 nginx user    6  7月 24 17:25 cakephp

Composerのcreate-projectコマンドを使ってCakePHPプロジェクトを作成します。
(ここではmy_app_nameという名前のCakePHPプロジェクトとします。)

$ composer create-project --prefer-dist cakephp/app:~4.0 my_app_name
Creating a "cakephp/app:~4.0" project at "./my_app_name"
Installing cakephp/app (4.1.1)
  - Installing cakephp/app (4.1.1): Loading from cache
Created project in /var/www/cakephp/my_app_name
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 85 installs, 0 updates, 0 removals
  - Installing cakephp/plugin-installer (1.2.0): Downloading (100%)
  - Installing psr/simple-cache (1.0.1): Downloading (100%)
(省略)
Generating autoload files
> Cake\Composer\Installer\PluginInstaller::postAutoloadDump
30 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> App\Console\Installer::postInstall
Created `config/app_local.php` file
Created `/var/www/cakephp/my_app_name/logs` directory
Created `/var/www/cakephp/my_app_name/tmp/cache/views` directory
Set Folder Permissions ? (Default to Y) [Y,n]? Y
Permissions set on /var/www/cakephp/my_app_name/tmp/cache
Permissions set on /var/www/cakephp/my_app_name/tmp/cache/models
(省略)
Updated Security.salt value in config/app_local.php

一応CakePHPプロジェクトが出来たか確認します。

$ ls -la /var/www/cakephp
合計 0
drwxrwxr-x  3 nginx user  25  7月 24 17:29 .
drwxr-xr-x  5 nginx user  46  7月 24 17:25 ..
drwxrwxr-x 12 user  user 318  7月 24 17:29 my_app_name

Nginxを設定

先ほど作成したCakePHPプロジェクトをドキュメントルートとなるようNginxへ設定します。
(ここではserver_nameをlocalhostとしておきます)

Nginxの設定変更するためのファイルは環境によりますが、/etc/nginx/conf.d/***.confです。

server {
        listen 80;
        server_name localhost;

        root /var/www/cakephp/my_app_name/webroot;
        index index.php;

        access_log /var/log/nginx/cake.access.log;
        error_log /var/log/nginx/cake.error.log;

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                try_files $uri =404;
                include fastcgi_params;
                fastcgi_pass unix:/run/php-fpm/www.sock;
                fastcgi_index index.php;
                fastcgi_intercept_errors on;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
}

初期動作確認

CakePHPプロジェクトの作成とNginxの設定が済んだので、動作確認を行います。

動作確認の方法は、ブラウザで表示確認を行います。以下の様な画面が表示されればOKです!
(今回はNginxのserver_nameをlocalhostとしているので、表示確認は"http://localhost"となります)

CakePHP4の初期画面
CakePHP4の初期画面

もし真っ白画面や動かない場合は、以下のログファイルなどを確認して状況を把握しましょう!

  • Nginx
    • /var/log/nginx/cake.access.log
      • ブラウザで表示確認した時に、アクセスログに書き込まれているか確認。
      • エラー内容(HTTP Statusが4XXなど)の記述がされていないか確認。
    • /var/log/nginx/cake.error.log
      • 何かエラーとなっている内容が書き込まれていないか確認。

そしてエラーメッセージが書き込まれていたらググって調べて対応していきましょう!

データベース設定

Webサービスを作るとなるとデータベースは必要不可欠です。今回はデータベースの設定を行わないので以下の様なメッセージが表示されます。

CakePHP4の初期画面
CakePHP4の初期画面
CakePHP is NOT able to connect to the database.
Connection to Mysql could not be established: SQLSTATE[HY000] [2002] No such file or directory

データベースの設定は、"/var/www/cakephp/my_app_name/config/app_local.php"で行います。詳しくは「CakePHP4でブログサイト作るチュートリアル」にサンプルがありました。

CakePHPを触ってみよう

ここまで来たらCakePHPの動作を確認出来たと思います。次にCakePHPを軽く触ってみましょう!

Controllerを触ってみよう

まず新しく自分でコントローラを用意してみます。今回はIndexController.phpを作成してみます。
(今回の環境だと/var/www/cakephp/my_app_name/src/Controller/IndexController.phpです)

<?php
namespace App\Controller;

use App\Controller\AppController;
use Cake\Core\Configure;
use Cake\Network\Exception\NotFoundException;
use Cake\ORM\TableRegistry;
use Cake\Filesystem\Folder;
use Cake\Filesystem\File;
use Cake\Event\EventInterface;
use Cake\Core\Exception\Exception;
use Cake\Log\Log;

class IndexController extends AppController {

    public function beforeFilter(EventInterface $event) {
        parent::beforeFilter($event);

    }

    public function index() {
    }
}

Templateを触ってみよう

次に画面表示する為にテンプレートを自分で用意します。今回はIndexControllerに対応させるために/templates/Index/index.phpで作成します。
(今回の環境だと/var/www/cakephp/my_app_name/templates/Index/index.phpです)

<p>Indexページ</p>

ルーティング設定を触ってみよう

最後にブラウザでhttp://localhostにアクセスするとIndexController.phpが表示されるようにroutes.phpを変更してルーティング設定を行います。
(今回だとroutes.phpは、/var/www/cakephp/my_app_name/config/routes.phpです)

$builder->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);

を以下の様にIndexController.phpへアクセスするように変更します。

$builder->connect('/', ['controller' => 'Index', 'action' => 'index']);

表示確認しよう

ブラウザでhttp://localhostにアクセスします。すると以下の様な画面が表示されます。

Layoutを触ってみよう

Layoutファイルを編集します。
(今回だと/var/www/cakephp/my_app_name/templates/layout/default.phpです)

<a href="<?php echo $this->Url->build('/') ?>"><span>Cake</span>PHP</a>

をちょこっと変更します。

<a href="<?php echo $this->Url->build('/') ?>">My<span>Cake</span>PHP</a>

もう一度表示確認しよう

ブラウザでhttp://localhostにアクセスします。するとLayoutが少し変更された画面が表示されます。

CakePHPの予備知識

CakePHP4からテンプレートファイルがtemplateへ移動された理由

CakePHP2までは、「/app/Views」にテンプレートがありました。が、CakePHP3からは「/app/src/View」へ変わりました。

CakePHP4ではさらに「/app/templates」へ移動されました。

移動された理由は、CakePHPの公式サイトの「4.0 移行ガイド」で説明されています。

テンプレートは、 app や plugin ルート上の src/Template/ から templates/ フォルダーへ移動されました。 この変更により、 src フォルダーには、 composer のオートローダーを介して オートロードされるクラスを持つファイルのみが含まれるようになりました。

https://book.cakephp.org/4/ja/appendices/4-0-migration-guide.html#id8

これは、PSRの仕様に準拠しているための変更です。

PSRとは

PSRは、PHPでのファイルの読み込み・クラスのオートロードを行う仕様。詳しくは「PSR-4 の理解」にて解説されていました。

CakePHPのインストール時に起こるエラー

Fatal error: You must enable the intl extention to use CakePHP. in ~config/requirements.php on line 31

intlがインストールされていない。

プログラミング解説講座

UT
UTの日常

当ブログ(UTの日常)を運営しているUTは「プログラミング関係の仕事をしている30代1児の父親」です。詳しくは「UTのプロフィール」をご覧ください。

UTの日常では、システム開発における LinuxPHPJavaScriptJQueryMySQLなどの知識やプログラミング技術、サーバ構築や運用などAWSをメインに知識を紹介しています。

内容としては、Webシステムの開発中や運用中に発生したトラブルやエラーの対応や解決方法をまとめた備忘録やWebシステム開発の方法を未経験者の人を対象に説明したプログラム教科書を記事にしています。
Webシステム開発の知識やプログラム技術の備忘録

システムCakePHP,composer,Nginx,PHP,php-fpm

Posted by UT