PHP+phalconでWEBアプリケーションを作成する

業務で、PHPの新規案件がありそうなので、簡単に実装できるWEB Frameworkを探していたら、phalconを見つけました。phalconを使ってcrudを実装するまでを投稿します。

【環境】

| カテゴリ       | 値       |
|:-----------------|:------------------|
| os               |windows 10 home 64bit | 
| php|            PHP 7.3.5( ZTS MSVC15 (Visual C++ 2017) x64 ) |


## 1. phalcon

PHPのWEBフレームワーク[「phalcon」](https://phalconphp.com/ja/)をつかってみます。

### 1-(1). ダウンロード

https://phalconphp.com/ja/download/windows


### 1-(2). インストール

ダウンロードしたファイルを解凍し、「php_phalcon.dll」を「c:\php\ext」にコピーする。

### 1-(3). php.iniを編集

php.iniを開いて、extensionに以下を追加する。

```ini
extension=php_phalcon.dll
```

## 2. phalcon-devtools

Phalconの開発ツールです。Phalconで開発する場合は、この開発ツールを使用します。

### 2-(1). ダウンロード

[phalcon-devtools](https://github.com/phalcon/phalcon-devtools)

### 2-(2). パスを通す

ダウンロードしたphalcon-devtoolsのディレクトリを、環境変数のPathに追加します。

```
C:\data\php\phalcon\phalcon-devtools
```

### 2-(3). プロジェクトを作成する。

phalconコマンドを使ってプロジェクトを作成します。

```cmd
phalcon project --name testprj1 --enable-webtools
cd testprj1
```

### 2-(4). 動かしてみる。

ビルトインウェブサーバーでプロジェクトを起動して[ブラウザ](http://localhost:8000/)で確認する。

```cmd
php -S localhost:8000 -t public .htrouter.php
```

または、以下のコマンドでも起動できます。

```
phalcon serve
```

### 2-(5). 停止

「Ctrl-C」

## 3. INVO

PHPのWebFramework「Phalcon」のプロジェクトのテンプレートです。dev-toolsのprojectコマンドでプロジェクトを作成してもいいのですが、これは認証などの機能があらかじめ装備されているので、このテンプレートを使うほうがより効率的です。こちらもインストールします。

## 3-(1). インストール

### 3-(1)-1.ダウンロード
https://github.com/phalcon/invo

### 3-(1)-2. インストール

ダウンロードしたファイルを適当なフォルダに解凍するだけです。

### 3-(1)-3. DBセットアップ


#### 3-(1)-3-1. データベースを作成する 

プロジェクトが使用するデーターベースを作成します。以下は、MySQLを使う場合。
MySQLに接続し、データベースを作成します。データベース名は「invodb」とします。

```sql
create database invodb
```

#### 3-(1)-3-2. プロジェクトをデータベースに接続できるようにする。

app\config\config.iniを開いて、databaseの接続情報を編集します。

```conf
[database]
adapter  = Mysql
host     = localhost
username = testuser
password = ************************
dbname   = invodb
charset  = utf8
```

#### 3-(1)-3-3. INVOのテーブルやデータを登録する。

コマンドプロンプトから、以下のコマンドを実行してテーブルとデータを登録します。

```command
mysql -u testuser -p ***************** -D invodb < C:\data\php\phalcon\invo-master\schemas\invo.sql
```

#### 3-(1)-3-4. 動作確認

- PHPのビルトインサーバを起動し、[INVO](http://localhost:8000)を動かしてみます。

```
php -S localhost:8000 -t public .htrouter.php
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246741/66fff64e-f85b-e63d-f210-9eee704f7dd2.png)


## 4.INVOにCRUDを追加する。

phalcon devtoolsには、Ruby on RailsやelixirのPhoenixと同じように、crudを自動的に生成するコマンドが装備されています。INVOにCRUDを追加してみます。

### 4-1.データベースにテーブルを追加します。

```sql
CREATE TABLE `department` (
  `deptcode` varchar(6) NOT NULL,
  `deptname` varchar(255) NOT NULL,
  PRIMARY KEY (`deptcode`)
)
```

### 4-2.「scaffold」を実行する。

INVOのルートフォルダに移動して、以下のコマンドを実行します。

```cmd
phalcon scaffold department --template-engine=volt
```

### 4-3.プロジェクトのフォルダ／ファイル構成

以下のようなフォルダ／ファイルが追加されます。

```
└─app
・・・・・
    ├─controllers
    │      DepartmentController.php
・・・・・
    ├─models
    │      Department.php
・・・・・
    └─views
        ├─department
        │      edit.volt
        │      index.volt
        │      new.volt
        │      search.volt
・・・・・
        └─layouts
                department.volt
・・・・・
```

## 5.追加したCRUDをINVOから呼び出す。

修正するファイルですが、以下のファイルになります。

### 5-(1). app\library\Elements.php

navibarに「department」のcrudを追加します。

```php
class Elements extends Component
{
    private $_headerMenu = [
        'navbar-left' => [
// <-- 追加
            'department' => [
                'caption' => 'Department',
                'action' => 'index'
            ],
// --> ここまで
```

### 5-(2). app\plugins\SecurityPlugin.php

セキュリティレベルを設定します。

```php
・・・
class SecurityPlugin extends Plugin
{
//・・・
public function getAcl()
{
// このif文はコメントしないと動かない。対応する}もコメントしてください。
// if (!isset($this->persistent->acl)) {

//・・・
$privateResources = [
// <-- 追加
	'department'    => ['index', 'search', 'new', 'edit', 'save', 'create', 'delete'],
// --> ここまで
//・・・
```

### 5-(3). 確認

WEBサーバを起動して[ブラウザ](http://localhost:8000/)で確認してみましょう。

```
phalcon serve
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246741/ecd8addc-07f0-1808-80c3-87590435321d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246741/dbfaf9ec-db4c-3633-832c-c878e8d11667.png)


HTMLは日本語化などの微調整が必要ですが、テーブルさえ登録すればCRUDが簡単に実装できます。

PHPでの開発なら、Phalconはなかなかいい感じです。

参考サイト

[Webアプリ開発に最適！2019年おすすめPHPフレームワーク10選](https://www.seleqt.net/programming/best-php-framework-2019/)
[Phalcon Devtoolsを使ったMVCプロジェクト作成からHelloWorldまで](https://thinkit.co.jp/story/2014/07/09/5084)