Ethna（Ethnam）に入門してみた

PHPのフレームワークEthna（Ethnam）に入門してみたので、覚え書き。
PHPのサポートバージョンの関係で、後継のEthnamを使いました。
どちらかというと、環境構築的なところに重きを置いています。

## 環境

* OS: Amazon Linux 2

## 前提条件

* AWSで、Amazon Linux 2環境を起動し、セキュリティグループのインバウンドルールのSSH、HTTPがクライアントPCから接続できるようになっていること

## 手順

### 1. セキュリティグループのルール確認

前提条件に記載の内容ですが、文章だとわかりにくいので、キャプチャを載せておきます。
以下は、HTTPがIPv4, IPv6からの全ての接続、SSHがIPv4からのすべての接続を許可することを意味しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/6b28b62c-7645-cdb8-4308-2440659fda03.png)

実環境でのこの運用はセキュリティ上まずいのですが、今回は軽く動作させるだけなので、気にしないこととします。
どうしても気になる方は、「ソース」下のセレクトボックスから（「カスタム」となっているところ）「マイIP」を選択し、自身のクライアントPCの使用しているIP以外からの接続は許可しない状態にしておくとよいでしょう。


### 2. PHPのインストールと各種設定

#### (1) PHPのインストール

[Remi's RPM repository - Configuration wizard | rpms.remirepo.net](https://rpms.remirepo.net/wizard/)
にアクセスして、以下の通り設定。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/adaf530c-4a58-2a56-7cd6-2d439b75821d.png)

PHPのバージョンは5.4.45にしました（Ethnamの最低要件が5.4）
基本的には、上記の通り選択すると出現するコマンドを上から順に実行していくだけですが、こちらも記載しておきます（必要に応じて、sudoやyオプションを付けています）。

```sh:
# EPELリポジトリのコンフィギュレーションパッケージをインストール
$ sudo yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

# Remiリポジトリのコンフィギュレーションパッケージをインストール
$ sudo yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm

# yum-utilパッケージをインストール
$ sudo yum -y install yum-utils

# PHP5.4のリポジトリのみ有効にする
$ sudo yum-config-manager --disable 'remi-php*'
$ sudo yum-config-manager --enable   remi-php54

# 有効なリポジトリの一覧を確認
$ yum repolist

$ sudo yum -y update

# PHPのインストール
$ sudo yum install -y php
```
PHPのバージョンを確認し、以下の通り出ていればOK

```sh:実行コマンドと想定結果
$ php --version
PHP 5.4.16 (cli) (built: Oct 31 2019 18:34:05)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
```

#### (2) php-mbstringのインストール

後述のethna-generatorコマンド実行時のエラー回避のため、インストールしておきます

```sh:
$ sudo yum install -y php-mbstring
```

#### (3) php.iniでタイムゾーンの設定

php.iniでタイムゾーンの設定をしておきます（この設定が漏れていて、エラーが出るパターンがあるらしい）

```sh:
$ sudo vi /etc/php.ini
```
ファイルを開いたら、「timezone」で検索すると一発。
「"Asia/Tokyo"」に設定しました。

```ini:変更前
（省略）・・・
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
;date.timezone =
・・・（省略）
```

```ini:変更後
（省略）・・・
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Asia/Tokyo"
・・・（省略）
```

#### (4) [オマケ]サーバのタイムゾーンの設定変更

サーバのタイムゾーンもphp.iniの設定に合わせて、変更しておきます。

```sh:
$ sudo timedatectl set-timezone "Asia/Tokyo"
# 確認
$ timedatectl
```

### 3. Apacheのインストールと各種設定

続いてApacheのインストールです。
Ethnam内包の簡易サーバを使う手もあるようですが、せっかくなので

#### (1) Apacheのインストール

以下のコマンドを実行して、Apacheをインストールします。

```sh:
$ sudo yum install -y httpd
```

#### (2) 設定ファイルの設定

ブラウザ経由でPHPを動かせるよう、設定ファイルに追記します。

```sh:
$ sudo vi /etc/httpd/conf/httpd.conf
```
以下の内容を、ファイルの末尾に追記する形でよいでしょう。

```conf:追記内容
# php.iniの格納先
PHPINIDir /etc
# PHP 共有モジュール
LoadModule php5_module /usr/lib64/httpd/modules/libphp5.so
#  拡張子が、「php」のファイルをPHPファイルと認識するための設定
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>
```

#### (3) 設定の反映とサーバ起動時にApacheが起動する設定

```sh:
# 起動（設定の反映: 起動済の場合は、startをrestartにすること）
$ sudo systemctl start httpd
# サーバ起動時にApacheが起動する設定
$ sudo systemctl enable httpd.service
```

#### (4) ブラウザ経由でPHPのお試し実行

Apacheのデフォルトのドキュメントルートに移動し、お試し実行用のPHPファイルを作成、ブラウザ経由で実行してみます。

```sh:
$ cd /var/www/html
$ sudo vi index.php
```
お試し実行なので、以下のような簡単な内容でよいです

```php:index.php
<?php phpinfo();
```
ブラウザにて、
http://[パブリックIPv4アドレス]/index.php
を実行し、以下のようにPHPの設定情報が出力されればOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/394fa20d-bf43-b70b-ccaa-b451993ac695.png)


### 4. Composerのインストール

Ethnamのインストールに必要なため、インストールしておきます。

```sh:
# ユーザーのホームディレクトリへ移動
$ cd ~
# Composerのセットアップ
$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === '906a84df04cea2aa72f40b5f787e49f22d4c2f19492ac310e8cba5b96ac8b64115ac402c8cd292b8a03482574915d1a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"
# 移動とリネーム
$ sudo mv composer.phar /usr/local/bin/composer
# バージョン確認
composer -V
```

### 5. Ethnamでプロジェクト作成

#### (1) ドキュメントルートの変更

これから作成するEthnamプロジェクトに向き先を変えます。
作成するプロジェクト名は、「ethnamtest」とすることにしました。

「/var/www/html」となっている箇所（2ヶ所）を「/var/www/ethnamtest/www」に変更します。


```sh:
$ sudo vi /etc/httpd/conf/httpd.conf
```

```conf:変更前
DocumentRoot "/var/www/html"

#
# Relax access to content within /var/www.
#
<Directory "/var/www">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

# Further relax access to the default document root:
<Directory "/var/www/html">

```

```conf:変更後
DocumentRoot "/var/www/ethnamtest/www"

#
# Relax access to content within /var/www.
#
<Directory "/var/www">
    AllowOverride None
    # Allow open access:
    Require all granted
</Directory>

# Further relax access to the default document root:
<Directory "/var/www/ethnamtest/www">
```

変更内容を保存したら、Apacheを再起動しましょう。

```sh:
$ sudo systemctl restart httpd
```

#### (2) Ethnamプロジェクトの作成

続いて、Ethnamプロジェクトの作成です。
プロジェクト用のディレクトリを作成し、その配下で、composer.jsonを作成します。

```sh:
$ cd /var/www
$ sudo mkdir ethnamtest
$ sudo chmod 777 ethnamtest
$ cd ethnamtest
$ sudo vi composer.json
```

以下の内容を記載して保存した後、インストールコマンドを実行

```json:composer.json
{
  "require": {
    "ethnam/ethnam": "dev-master",
    "ethnam/generator": "dev-master",
    "smarty/smarty": "2.6.*"
  }
}
```

インストールコマンドを実行して、Ethnamをインストール。

```sh:
$ composer install
```

URLを叩いて、以下のような画面が表示されればOK!

|実行URL  |備考 |
|---|---|
|http://[パブリック IPv4 アドレス]/  |AWSコンソールで、EC2の対象インスタンスの詳細タブにて表示されている内容（※）  |

<b>表示画面</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/5f8caa14-a93c-2e8f-2e89-a877aa4f60cd.png)


<b>※パブリック IPv4 アドレスの確認方法</b>

AWSコンソールでEC2を開き、左側ペインにて「インスタンス」を選択（①）。
対象のEC2インスタンスにチェックを入れ（②）、「詳細」タブにて、「パブリック IPv4 アドレス」を確認。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/c49fc5a2-9532-c52b-8e57-47d884d6ee05.png)
→ 実行URLは、「http://13.231.149.134/」となります
※上記IPアドレスは既に変わっています


なお、ethnamtestディレクトリ内は、以下のようになっています。

```:ethnamtest配下
app
bin
composer.json
composer.lock
etc
lib
locale
log
schema
skel
template
tmp
vendor
www
```


#### (3) チュートリアル - action, view, template -

Ethnaで最低限押さえておきたいのが、action, view, templateです。
超ざっくり説明すると以下の通り

<b>(1) action</b>
①アクションフォームクラス: フォームの POST 値や、クエリーストリングの値の定義ややり取りをする
②アクションクラス: アクションの実装と、遷移先（ビュークラス）の決定をする
の2つからなる

<b>(2) view</b>
表示項目やHTTPヘッダ、テンプレートの設定などを行う

<b>(3) template</b>
ブラウザに表示される内容

なお、処理フローは以下の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/ef7992ec-f3d1-6f8f-f7ac-6fe03494ff06.png)

※出典:[2. アクション、ビュー、テンプレートの作成と処理の流れ | Ethna2.6](http://ethna.jp/doc/tutorial/02-action-view-tpl.html)
→ より詳細な説明も上記ページに記載されています。

ethnamtestディレクトリ（プロジェクト）直下にて、action, view, templateを作成してみましょう。

```sh:
$ cd /var/www/ethnamtest
# アクションクラスファイルの作成
$ vendor/bin/ethnam-generator add-action hello
# ビュークラスファイルの作成
$ vendor/bin/ethnam-generator add-view hello
# テンプレートファイルの作成
$ vendor/bin/ethnam-generator add-template hello
```

→ Ethnaを使用する場合は、「ethnam-generator」の部分が「ethna」になります。

URLを叩き、表示画面の通り表示されればOK

|実行URL  |備考 |
|---|---|
|http://[パブリック IPv4 アドレス]/?action_hello=true  |「パブリック IPv4 アドレス」の確認方法は、(2)に同じ  |

<b>表示画面</b>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/403bc4c3-c9b8-071d-a08b-966d404c69ec.png)
→ (2) と同じパブリック IPv4 アドレスの場合、実行URLは、「http://13.231.149.134/?action_hello=true」となります

これで、基本的な動作までできました。

## 終わりに

後継のEthnamですら、最終コミットが6年前という、いわば古（いにしえ）のフレームワークですが、プロジェクトで使っているんだから仕方ない(笑)
サポート切れてると、ドキュメントやサンプルコード探すのすら難しい・・
現場の生きたコードを見つつ、実装するのがイチバン手っ取り早そうですね

## 参考

* [PHP: Apache 2.x (Unixシステム用) | php.net](https://www.php.net/manual/ja/install.unix.apache2.php)

* [Download Composer | getcomposer.org](https://getcomposer.org/download/)

* [ethnamphp/ethnam | GitHub](https://github.com/ethnamphp/ethnam)

* [Ethna | Ethna 2.6 documentation](http://ethna.jp/doc/)