開発者ドキュメント

Ubuntu18.04でLAMPを使用してCakePHPアプリケーションをセットアップする方法

著者は、 Write for DOnations プログラムの一環として、 Free and Open SourceFundを選択して寄付を受け取りました。

序章

CakePHP は、人気があり機能が豊富なPHPWebフレームワークです。 これは、データベースとの対話、SQLインジェクションに対するシールド、ビューコードの生成など、Web開発で一般的な問題の多くを解決します。 これは、 model-view-controller (MVC)パターンに準拠しており、アプリケーションのさまざまな部分を切り離し、開発者がアプリのさまざまな部分で並行して作業できるようにします。 また、組み込みのセキュリティと認証も提供します。 基本的なデータベースアプリを作成することはシームレスなプロセスであり、CakePHPをプロトタイピングに役立ちます。 ただし、CakePHPを使用して、展開用に完全に開発されたWebアプリケーションを作成することもできます。

このチュートリアルでは、サンプルのCakePHPWebアプリケーションを実稼働環境にデプロイします。 これを実現するには、サンプルのデータベースとユーザーをセットアップし、Apacheを構成し、アプリをデータベースに接続して、デバッグモードをオフにします。 また、CakePHPのbakeコマンドを使用して、記事モデルを自動的に生成します。

前提条件

このチュートリアルを開始する前に、次のものが必要です。

ステップ1—依存関係のインストール

アプリケーションの準備をするには、CakePHPが必要とするPHP拡張機能をインストールすることから始めます。

パッケージマネージャーのキャッシュを更新することから始めます。

  1. sudo apt update

CakePHPには、mbstringintl、およびsimplexml PHP拡張機能が必要です。これらの拡張機能により、マルチバイト文字列、国際化、およびXML処理のサポートが追加されます。 Composerの前提条件チュートリアルの一部としてmbstringをインストールしました。 残りのライブラリは、次の1つのコマンドでインストールできます。

  1. sudo apt install php7.2-intl php7.2-xml -y

上記のバージョン番号(7.2)は、新しいバージョンのPHPで変更されることに注意してください。

CakePHPに必要な依存関係をインストールしました。 これで、本番環境で使用するためにMySQLデータベースを構成する準備が整いました。

ステップ2—MySQLデータベースを設定する

次に、ブログの記事に関する情報を格納するためのMySQLデータベースを作成します。 また、アプリケーションがデータベースへのアクセスに使用するデータベースユーザーを作成します。 この制御の分離を実現するために、データベース権限を変更します。 その結果、悪意のある攻撃者は、データベースのクレデンシャルを使用してもシステムに問題を引き起こすことはできません。これは、実稼働環境での重要なセキュリティ対策です。

MySQLシェルを起動します。

  1. sudo mysql -u root -p

求められたら、LAMPの初期インストール時に設定したパスワードを入力します。

次に、データベースを作成します。

  1. CREATE DATABASE cakephp_blog;

次のような出力が表示されます。

Output
Query OK, 1 row affected (0.00 sec)

CakePHPアプリは、この新しいデータベースを使用して本番データを読み取り、保存します。

次に、MySQLに新しいcakephp_blogデータベースを操作するように指示します。

  1. USE cakephp_blog;

次のような出力が表示されます。

Output
Database changed

次に、cakephp_blogデータベースにブログ記事のテーブルスキーマを作成します。 次のコマンドを実行して、これを設定します。

  1. CREATE TABLE articles (
  2. id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  3. title VARCHAR(50),
  4. body TEXT,
  5. created DATETIME DEFAULT NULL,
  6. modified DATETIME DEFAULT NULL
  7. );

ブログ記事を説明するための5つのフィールドを持つスキーマを作成しました。

出力は次のようになります。

Output
Query OK, 0 rows affected (0.01 sec)

cakephp_blogデータベースに記事を保存するためのテーブルを作成しました。 次に、次のコマンドを実行して、サンプル記事を入力します。

  1. INSERT INTO articles (title, body, created)
  2. VALUES ('Sample title', 'This is the article body.', NOW());

タイトルと本文のサンプルデータを含むサンプル記事を追加しました。

次の出力が表示されます。

Output
Query OK, 0 rows affected (0.01 sec)

CakePHPアプリをデータベースに接続するには、新しいデータベースユーザーを作成し、その権限を制限する必要があります。

  1. GRANT ALL PRIVILEGES ON cakephp_blog.* TO 'cake_user'@'localhost' IDENTIFIED BY 'password';

このコマンドは、データベース内のすべてのテーブルにすべての特権を付与します。

passwordを選択した強力なパスワードに置き換えることを忘れないでください。

行った変更でデータベースを更新するには、次のコマンドを実行してリロードします。

  1. FLUSH PRIVILEGES;

新しいデータベースユーザーcake_userを作成し、cakephp_blogデータベースに対してのみユーザー権限を付与したため、セキュリティが強化されました。

exitと入力して、MySQLターミナルを終了します。

スキーマを使用して新しいデータベースを作成し、サンプルデータを入力して、適切なデータベースユーザーを作成しました。 次のステップでは、CakePHPアプリ自体をセットアップします。

ステップ3—ブログアプリケーションを作成する

このセクションでは、Composerを使用してサンプルのCakePHPアプリをインストールします。 コマンドラインからCakePHPをインストールでき、特定のファイル権限と構成ファイルを自動的に設定できるComposerを使用すると便利です。

まず、ApacheWebサーバーフォルダーに移動します。

  1. cd /var/www/example.com/html

Apacheはこのディレクトリを使用して、外部から見えるファイルを保存します。 rootユーザーがこのディレクトリを所有しているため、root以外のユーザーsammyはこのディレクトリに何も書き込むことができません。 これを修正するには、次のコマンドを実行してファイルシステムのアクセス許可を変更します。

  1. sudo chown -R sammy .

次に、Composerを介して新しいCakePHPアプリを作成します。

  1. composer create-project --prefer-dist cakephp/app cake-blog

ここでは、composerを呼び出し、create-projectを使用して新しいプロジェクトを作成するように指示しました。 --prefer-dist cakephp/appは、composerに、新しいアプリケーションの名前としてcake-blogを使用してCakePHPをテンプレートとして使用するように指示します。

このコマンドが完了するまでに時間がかかる場合があることに注意してください。

Composerからフォルダのアクセス許可を設定するように求められたら、yで応答します。

このセクションでは、Composerを使用して新しいCakePHPプロジェクトを作成しました。 次のステップでは、新しいアプリを指すようにApacheを構成します。これにより、ブラウザーでアプリを表示できるようになります。

ステップ4—アプリを指すようにApacheを構成する

次に、新しいCakePHPアプリケーション用にApacheを構成し、CakePHPの要件である.htaccessのオーバーライドを有効にします。 これには、Apache構成ファイルの編集が伴います。

実際のルーティングを行うには、.htaccessファイルを使用するようにApacheに指示する必要があります。 これらはアプリケーションのサブディレクトリにある構成ファイルであり(必要な場合)、Apacheはファイルを使用して、アプリの要求された部分のグローバル構成を変更します。 他のタスクの中でも、URL書き換えルールが含まれ、これを調整します。

テキストエディタを使用してApacheグローバル設定ファイル(apache2.conf)を開くことから始めます。

  1. sudo nano /etc/apache2/apache2.conf

次のコードブロックを見つけます。

/etc/apache2/apache2.conf
...
<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>
...

次のように、AllowOverrideNoneからAllに変更します。

/etc/apache2/apache2.conf
...
<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>
...

ファイルを保存して閉じます。

次に、CakePHPインストールのwebrootディレクトリを指すようにApacheに指示します。 Apacheは、構成ファイルをUbuntu18.04の/etc/apache2/sites-availableに保存します。 これらのファイルは、ApacheがWebリクエストを処理する方法を管理します。

Let’s Encryptの前提条件のチュートリアルで、HTTPSリダイレクトを有効にしました。 したがって、HTTPSトラフィックのみを許可します。 その結果、HTTPSトラフィックを構成するexample.com-le-ssl.confファイルのみを編集します。

まず、example.com-le-ssl.conf構成ファイルを開きます。

  1. sudo nano /etc/apache2/sites-available/example.com-le-ssl.conf

DocumentRootを設定し、ブラウザにコンテンツを提供する場所をApacheに指示する1行だけを変更する必要があります。 ファイル内で次の行を見つけます。

/etc/apache2/sites-available/example.com-le-ssl.conf
DocumentRoot /var/www/example.com/html

次の強調表示されたコンテンツを追加して、CakePHPのインストールを指すようにこの行を編集します。

/etc/apache2/sites-available/example.com-le-ssl.conf
DocumentRoot /var/www/example.com/html/cake-blog/webroot

ファイルを保存して、エディターを終了します。

その後、Apacheを再起動して、新しい構成を反映します。

  1. sudo systemctl restart apache2

これで、ブラウザでhttps://your_domain/にアクセスできます。

デフォルトのCakePHP成功ページが表示されます。 アプリケーションがデータベースに接続できないことを示すブロックがあることに気付くでしょう。 次のステップでは、アプリをデータベースに接続することでこれを解決します。

これで、.htaccessのオーバーライドが有効になり、Apacheが正しいwebrootディレクトリを指すようになりました。

ステップ5—アプリをデータベースに接続する

このセクションでは、ブログが記事にアクセスできるように、データベースをアプリケーションに接続します。 CakePHPのデフォルトのconfig/app.phpファイルを編集して、データベースへの接続を設定します。

アプリフォルダーに移動します。

  1. cd /var/www/example.com/html/cake-blog

次のコマンドを実行して、config/app.phpファイルを開きます。

  1. sudo nano config/app.php

Datasourcesブロックを見つけます(次のようになります)。

/var/www/example.com/html/cake-blog/config/app.php
...
    'Datasources' => [
        'default' => [
            'className' => 'Cake\Database\Connection',
            'driver' => 'Cake\Database\Driver\Mysql',
            'persistent' => false,
            'host' => 'localhost',
            ...
            //'port' => 'non_standard_port_number',
            'username' => 'cake_user',
            'password' => 'password',
            'database' => 'cakephp_blog',
...

'username'の場合、my_appをデータベースユーザーのユーザー名に置き換え(このチュートリアルではcake_userを使用)、secretをデータベースユーザーのパスワードに置き換え、2番目のmy_appとデータベース名(このチュートリアルではcakephp_blog)。

ファイルを保存して閉じます。

ブラウザでアプリを更新し、データベースセクションの下にある成功メッセージを確認します。 エラーが表示された場合は、構成ファイルを前の手順と照らし合わせて再確認してください。

このステップでは、CakePHPアプリをMySQLデータベースに接続しました。 次のステップでは、記事を操作するためのユーザーインターフェイスを構成するモデル、ビュー、およびコントローラーファイルを生成します。

ステップ6—Articleユーザーインターフェイスの作成

このセクションでは、CakePHP bakeコマンドを実行して、すぐに使用できる記事インターフェイスを作成します。これにより、記事モデルが生成されます。 CakePHPでは、ベイク処理により、必要なすべてのモデル、ビュー、およびコントローラーが基本的な状態で生成され、さらに開発できるようになります。 すべてのデータベースアプリは、作成、読み取り、更新、削除(CRUD)操作を許可する必要があります。これにより、CakePHPのbake機能は、これらの操作のコードを自動的に生成するのに役立ちます。 数分以内に、アプリの完全なプロトタイプを取得し、データを入力、保存、編集する準備が整います。

モデル、ビュー、およびコントローラーは、MVCパターンに関連しています。 彼らの役割は次のとおりです。

CakePHPは、CLI実行可能ファイルをbin/cakeに保存します。 これは主にベイク処理に使用されますが、さまざまなキャッシュをクリアするコマンドなど、他の多くのコマンドを提供します。

bakeコマンドはデータベースをチェックし、見つかったテーブル定義に基づいてモデルを生成します。 次のコマンドを実行して開始します。

  1. ./bin/cake bake all

allコマンドを渡すことにより、モデル、コントローラー、およびビューを一度に生成するようにCakePHPに指示します。

出力は次のようになります。

Output
Bake All --------------------------------------------------------------- Possible model names based on your database: - articles Run `cake bake all [name]` to generate skeleton files.

データベースからarticles定義を適切に検出し、そのモデルのファイルを生成することを提案しています。

実行して焼きます:

  1. ./bin/cake bake all articles

出力は次のようになります。

Output
Bake All --------------------------------------------------------------- One moment while associations are detected. Baking table class for Articles... Creating file /var/www/example.com/html/cake-blog/src/Model/Table/ArticlesTable.php Wrote `/var/www/example.com/html/cake-blog/src/Model/Table/ArticlesTable.php` Deleted `/var/www/example.com/html/cake-blog/src/Model/Table/empty` Baking entity class for Article... Creating file /var/www/example.com/html/cake-blog/src/Model/Entity/Article.php Wrote `/var/www/example.com/html/cake-blog/src/Model/Entity/Article.php` Deleted `/var/www/example.com/html/cake-blog/src/Model/Entity/empty` Baking test fixture for Articles... Creating file /var/www/example.com/html/cake-blog/tests/Fixture/ArticlesFixture.php Wrote `/var/www/example.com/html/cake-blog/tests/Fixture/ArticlesFixture.php` Deleted `/var/www/example.com/html/cake-blog/tests/Fixture/empty` Bake is detecting possible fixtures... Baking test case for App\Model\Table\ArticlesTable ... Creating file /var/www/example.com/html/cake-blog/tests/TestCase/Model/Table/ArticlesTableTest.php Wrote `/var/www/example.com/html/cake-blog/tests/TestCase/Model/Table/ArticlesTableTest.php` Baking controller class for Articles... Creating file /var/www/example.com/html/cake-blog/src/Controller/ArticlesController.php Wrote `/var/www/example.com/html/cake-blog/src/Controller/ArticlesController.php` Bake is detecting possible fixtures... ... Baking `add` view template file... Creating file /var/www/example.com/html/cake-blog/src/Template/Articles/add.ctp Wrote `/var/www/example.com/html/cake-blog/src/Template/Articles/add.ctp` Baking `edit` view template file... Creating file /var/www/example.com/html/cake-blog/src/Template/Articles/edit.ctp Wrote `/var/www/example.com/html/cake-blog/src/Template/Articles/edit.ctp` Bake All complete.

出力では、CakePHPがarticlesデータベースの機能的なボイラープレートを作成するために行ったすべての手順をログに記録していることがわかります。

次に、ブラウザで次の場所に移動します。

https://your_domain/articles

Sample Title というタイトルの1行を含む、現在データベースにある記事のリストが表示されます。 bakeコマンドは、記事の作成、削除、編集を可能にするこのインターフェースを作成しました。 このように、それはさらなる開発のための確かな出発点を提供します。 サイドバーの新しい記事リンクをクリックして、新しい記事を追加してみてください。

このセクションでは、CakePHPのbakeコマンドを使用して、モデル、ビュー、およびコントローラーファイルを生成しました。 これで、記事を作成、削除、表示、および編集でき、すべての変更がすぐにデータベースに保存されます。

次の手順では、デバッグモードを無効にします。

ステップ7—CakePHPでデバッグモードを無効にする

このセクションでは、CakePHPのデバッグモードを無効にします。 デバッグモードでは、アプリが詳細なデバッグ情報を表示するため、これは非常に重要です。これはセキュリティ上のリスクです。 アプリケーションの開発が完了したら、この手順を完了します。

お気に入りのエディタを使用してconfig/app.phpファイルを開きます。

  1. sudo nano config/app.php

ファイルの先頭近くに、'debug'モードの行があります。 ファイルを開くと、'debug'モードがtrueに設定されます。 次のように、これをfalseに変更します。

config / app.php
...
'debug' => filter_var(env('DEBUG', false), FILTER_VALIDATE_BOOLEAN),
...

デバッグモードをオフにすると、src/Templates/Pages/home.ctpの下にあるホームページにエラーが表示されます。

注:デフォルトルートを変更していないか、home.ctpの内容を置き換えていない場合、アプリのホームページにエラーが表示されるようになりました。 これは、デフォルトのホームページが開発中にステータスダッシュボードとして機能するが、デバッグモードが無効になっていると機能しないためです。

デバッグモードを無効にしました。 今後発生するエラーや例外は、それらのスタックトレースとともにエンドユーザーに表示されないため、アプリケーションのセキュリティが強化されます。

ただし、デバッグモードを無効にすると、home.ctpにエラーが表示されます。 このチュートリアルの目的でのみこの手順を完了した場合は、デバッグモードを無効にしたまま、ホームページを記事リストインターフェイスにリダイレクトできるようになりました。 これは、home.ctpの内容を編集することで実現できます。

home.ctpを開いて編集します。

  1. sudo nano src/Template/Pages/home.ctp

その内容を次のように置き換えます。

src / Template / Pages / home.ctp
<meta http-equiv="refresh" content="0; url=./Articles" />
<p><a href="./Articles">Click here if you are not redirected</a></p>

このHTMLは、Articlesコントローラーにリダイレクトされます。 自動リダイレクトが失敗した場合は、ユーザーがたどるリンクもあります。

この手順では、セキュリティ上の理由からデバッグモードを無効にし、Articlesコントローラーが提供するブログ投稿リストインターフェイスにユーザーをリダイレクトすることでホームページのエラーを修正しました。

結論

これで、Ubuntu18.04のLAMPスタックにCakePHPアプリケーションが正常にセットアップされました。 CakePHPを使用すると、必要な数のテーブルを含むデータベースを作成でき、データ用のライブWebエディターが作成されます。

CakePHPクックブックは、CakePHPのあらゆる側面に関する詳細なドキュメントを提供します。 アプリケーションの次のステップには、すべてのユーザーが独自の記事を作成できるように、ユーザー認証を実装することが含まれる場合があります。

モバイルバージョンを終了