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
コマンドを使用して、記事モデルを自動的に生成します。
前提条件
このチュートリアルを開始する前に、次のものが必要です。
- ルートアクセスとsudo、非ルートアカウントでUbuntu 18.04を実行しているサーバー。これは、この初期サーバーセットアップガイドに従ってセットアップできます。
- Linux、Apache、MySQL、PHP(LAMP)スタックをUbuntu18.04にインストールする方法に従ってインストールされたLAMPスタック。 この記事の執筆時点では、PHP7.2が最新バージョンです。
- サーバーにインストールされているComposer(PHPパッケージマネージャー)。 その方法のガイドについては、 Ubuntu18.04にComposerをインストールして使用する方法をご覧ください。 そのチュートリアルの最初の2つのステップを完了するだけで済みます。
- Let’sEncryptで保護されたApache。 この前提条件を完了するには、最初に Ubuntu18.04にApacheをインストールする方法のステップ5に従って仮想ホストを設定する必要があります。 次に、 Ubuntu 18.04でLet’sEncryptを使用してApacheを保護する方法に従って、Let’sEncryptを使用してApacheを保護します。 求められたら、必須のHTTPSリダイレクトを有効にします。
- 完全に登録されたドメイン名。 このチュートリアルでは、全体を通して
example.com
を使用します。 Namecheap でドメイン名を購入するか、 Freenom で無料でドメイン名を取得するか、選択したドメイン登録事業者を使用できます。 - 次の両方のDNSレコードがサーバー用に設定されています。 それらを追加する方法の詳細については、この紹介に従ってDigitalOceanDNSを参照できます。
サーバーのパブリックIPアドレスを指すexample.comのAレコード。 サーバーのパブリックIPアドレスを指すwww.example.comのAレコード。
ステップ1—依存関係のインストール
アプリケーションの準備をするには、CakePHPが必要とするPHP拡張機能をインストールすることから始めます。
パッケージマネージャーのキャッシュを更新することから始めます。
- sudo apt update
CakePHPには、mbstring
、intl
、およびsimplexml
PHP拡張機能が必要です。これらの拡張機能により、マルチバイト文字列、国際化、およびXML処理のサポートが追加されます。 Composerの前提条件チュートリアルの一部としてmbstring
をインストールしました。 残りのライブラリは、次の1つのコマンドでインストールできます。
- sudo apt install php7.2-intl php7.2-xml -y
上記のバージョン番号(7.2)は、新しいバージョンのPHPで変更されることに注意してください。
CakePHPに必要な依存関係をインストールしました。 これで、本番環境で使用するためにMySQLデータベースを構成する準備が整いました。
ステップ2—MySQLデータベースを設定する
次に、ブログの記事に関する情報を格納するためのMySQLデータベースを作成します。 また、アプリケーションがデータベースへのアクセスに使用するデータベースユーザーを作成します。 この制御の分離を実現するために、データベース権限を変更します。 その結果、悪意のある攻撃者は、データベースのクレデンシャルを使用してもシステムに問題を引き起こすことはできません。これは、実稼働環境での重要なセキュリティ対策です。
MySQLシェルを起動します。
- sudo mysql -u root -p
求められたら、LAMPの初期インストール時に設定したパスワードを入力します。
次に、データベースを作成します。
- CREATE DATABASE cakephp_blog;
次のような出力が表示されます。
OutputQuery OK, 1 row affected (0.00 sec)
CakePHPアプリは、この新しいデータベースを使用して本番データを読み取り、保存します。
次に、MySQLに新しいcakephp_blog
データベースを操作するように指示します。
- USE cakephp_blog;
次のような出力が表示されます。
OutputDatabase changed
次に、cakephp_blog
データベースにブログ記事のテーブルスキーマを作成します。 次のコマンドを実行して、これを設定します。
- CREATE TABLE articles (
- id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
- title VARCHAR(50),
- body TEXT,
- created DATETIME DEFAULT NULL,
- modified DATETIME DEFAULT NULL
- );
ブログ記事を説明するための5つのフィールドを持つスキーマを作成しました。
id
:記事の一意の識別子であり、主キーとして設定されます。title
:記事のタイトルであり、最大50文字を含むテキストフィールドとして宣言されます。body
:記事のテキストであり、TEXT
フィールドとして宣言されています。created
:レコードが作成された日時です。modified
:レコードが変更された日時です。
出力は次のようになります。
OutputQuery OK, 0 rows affected (0.01 sec)
cakephp_blog
データベースに記事を保存するためのテーブルを作成しました。 次に、次のコマンドを実行して、サンプル記事を入力します。
- INSERT INTO articles (title, body, created)
- VALUES ('Sample title', 'This is the article body.', NOW());
タイトルと本文のサンプルデータを含むサンプル記事を追加しました。
次の出力が表示されます。
OutputQuery OK, 0 rows affected (0.01 sec)
CakePHPアプリをデータベースに接続するには、新しいデータベースユーザーを作成し、その権限を制限する必要があります。
- GRANT ALL PRIVILEGES ON cakephp_blog.* TO 'cake_user'@'localhost' IDENTIFIED BY 'password';
このコマンドは、データベース内のすべてのテーブルにすべての特権を付与します。
password
を選択した強力なパスワードに置き換えることを忘れないでください。
行った変更でデータベースを更新するには、次のコマンドを実行してリロードします。
- FLUSH PRIVILEGES;
新しいデータベースユーザーcake_user
を作成し、cakephp_blog
データベースに対してのみユーザー権限を付与したため、セキュリティが強化されました。
exit
と入力して、MySQLターミナルを終了します。
スキーマを使用して新しいデータベースを作成し、サンプルデータを入力して、適切なデータベースユーザーを作成しました。 次のステップでは、CakePHPアプリ自体をセットアップします。
ステップ3—ブログアプリケーションを作成する
このセクションでは、Composerを使用してサンプルのCakePHPアプリをインストールします。 コマンドラインからCakePHPをインストールでき、特定のファイル権限と構成ファイルを自動的に設定できるComposerを使用すると便利です。
まず、ApacheWebサーバーフォルダーに移動します。
- cd /var/www/example.com/html
Apacheはこのディレクトリを使用して、外部から見えるファイルを保存します。 root
ユーザーがこのディレクトリを所有しているため、root以外のユーザーsammy
はこのディレクトリに何も書き込むことができません。 これを修正するには、次のコマンドを実行してファイルシステムのアクセス許可を変更します。
- sudo chown -R sammy .
次に、Composerを介して新しいCakePHPアプリを作成します。
- 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
)を開くことから始めます。
- sudo nano /etc/apache2/apache2.conf
次のコードブロックを見つけます。
...
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
...
次のように、AllowOverride
をNone
からAll
に変更します。
...
<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
構成ファイルを開きます。
- sudo nano /etc/apache2/sites-available/example.com-le-ssl.conf
DocumentRoot
を設定し、ブラウザにコンテンツを提供する場所をApacheに指示する1行だけを変更する必要があります。 ファイル内で次の行を見つけます。
DocumentRoot /var/www/example.com/html
次の強調表示されたコンテンツを追加して、CakePHPのインストールを指すようにこの行を編集します。
DocumentRoot /var/www/example.com/html/cake-blog/webroot
ファイルを保存して、エディターを終了します。
その後、Apacheを再起動して、新しい構成を反映します。
- sudo systemctl restart apache2
これで、ブラウザでhttps://your_domain/
にアクセスできます。
デフォルトのCakePHP成功ページが表示されます。 アプリケーションがデータベースに接続できないことを示すブロックがあることに気付くでしょう。 次のステップでは、アプリをデータベースに接続することでこれを解決します。
これで、.htaccess
のオーバーライドが有効になり、Apacheが正しいwebroot
ディレクトリを指すようになりました。
ステップ5—アプリをデータベースに接続する
このセクションでは、ブログが記事にアクセスできるように、データベースをアプリケーションに接続します。 CakePHPのデフォルトのconfig/app.php
ファイルを編集して、データベースへの接続を設定します。
アプリフォルダーに移動します。
- cd /var/www/example.com/html/cake-blog
次のコマンドを実行して、config/app.php
ファイルを開きます。
- sudo nano config/app.php
Datasources
ブロックを見つけます(次のようになります)。
...
'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
コマンドはデータベースをチェックし、見つかったテーブル定義に基づいてモデルを生成します。 次のコマンドを実行して開始します。
- ./bin/cake bake all
all
コマンドを渡すことにより、モデル、コントローラー、およびビューを一度に生成するようにCakePHPに指示します。
出力は次のようになります。
OutputBake All
---------------------------------------------------------------
Possible model names based on your database:
- articles
Run `cake bake all [name]` to generate skeleton files.
データベースからarticles
定義を適切に検出し、そのモデルのファイルを生成することを提案しています。
実行して焼きます:
- ./bin/cake bake all articles
出力は次のようになります。
OutputBake 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
ファイルを開きます。
- sudo nano config/app.php
ファイルの先頭近くに、'debug'
モードの行があります。 ファイルを開くと、'debug'
モードがtrue
に設定されます。 次のように、これをfalse
に変更します。
...
'debug' => filter_var(env('DEBUG', false), FILTER_VALIDATE_BOOLEAN),
...
デバッグモードをオフにすると、src/Templates/Pages/home.ctp
の下にあるホームページにエラーが表示されます。
注:デフォルトルートを変更していないか、home.ctp
の内容を置き換えていない場合、アプリのホームページにエラーが表示されるようになりました。 これは、デフォルトのホームページが開発中にステータスダッシュボードとして機能するが、デバッグモードが無効になっていると機能しないためです。
デバッグモードを無効にしました。 今後発生するエラーや例外は、それらのスタックトレースとともにエンドユーザーに表示されないため、アプリケーションのセキュリティが強化されます。
ただし、デバッグモードを無効にすると、home.ctp
にエラーが表示されます。 このチュートリアルの目的でのみこの手順を完了した場合は、デバッグモードを無効にしたまま、ホームページを記事リストインターフェイスにリダイレクトできるようになりました。 これは、home.ctp
の内容を編集することで実現できます。
home.ctp
を開いて編集します。
- sudo nano 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のあらゆる側面に関する詳細なドキュメントを提供します。 アプリケーションの次のステップには、すべてのユーザーが独自の記事を作成できるように、ユーザー認証を実装することが含まれる場合があります。