phalcon php 開発備忘録

phpのフレームワークでPhalconを今回始めて使うに当たって、引っかかる部分をまとめておきます。追記していくかもです。

phalcon 3.0.3
php 7.0.9
apache 2.4 + FCGI
maria-db
(開発環境は、WindowsでXAMPPです）
ちなみに、FCGIにしたものajaxなどでリクエストが頻発するとエラーになるのでFCGI化することで対応できました。
それらの論議が以下にあるのですがいつか詳しく解説します。
https://github.com/phalcon/cphalcon/issues/12056



1. 他のモデルを扱うときのbelongsTo,hasManyについて
2. FCGIについて


# 他のモデルを扱うときのbelongsTo,hasManyについて

まずは、phalconのドキュメントを見てみる。
https://docs.phalconphp.com/ja/latest/reference/model-relationships.html
特別なことをしていなければ、そのまま書いてある通りモデルにinitializeを用意して

```php:models
public function initialize()
    {
        $this->hasMany(
            "id",
            "RobotsParts",
            "parts_id"
        );
    }
```
こんな感じにすれば良い。
hasManyやbelongsToで指定する先、上記の場合はRobotsPartsのモデルに
namespaceを設定している場合。

```php:models
public function initialize()
    {
        $this->hasMany(
            "id",
            "\namespacename\RobotsParts",
            "parts_id"
        );
    }
```

となります。
ただし、これだとfind()したときに

```php:find
X $models->\namespacename\RobotsParts 
```

というような指定はもちろんできないxため、alias を付けてあげます。

```php:Robots
public function initialize()
    {
        $this->hasMany(
            "id",
            "\namespacename\RobotsParts",
            "parts_id",
            array( 'alias' => 'aliasname'    );
    }
```

```php:controller_find
$mod = Robots::findfirst();
$mod->aliasname
```

また、alias付けない場合は、

```php:alias_as
use namespacename\RobotsParts as aliasname
```

これでも上記同様に扱えます。

もう一つおまけ。
これはありえないケースかとおもうけど、テストデータでbelongsTo先となにかしらのidで結合させているわけですけど結合先に存在しなかった場合、そんなプロパティが無いですってエラーになります。
たとえば、

```php:sample
var_dump($robpts);// これはOK
var_dump($robots->parts); //これはNG
```

NGとなった場合、あれ？belongsToをちゃんと書いてるのにおかしいな？って思うかもしれません。
原因はモデルのbelongsToではなくて、robotsにリレーションするpartsが存在しないということです。
存在しないならNullでええやん、ってことではなくて、プロパティが無いってエラーになるのでちゃんとチェックしましょう。（他に方法があるよって方は教えてください）


#FCGI(FastCGI)
（ここから2018/12/04に更新）
## FastCGIの設定です。phalconではほぼ必須と思ってください。
開発環境をXAMPPで行っているので、XAMPPの場合は、extra/httpd-xampp.confにphpの設定があるのでそこを変更します。
主に、phpの実行をfastCGI経由で行う設定となります。
phpの設定をコメントアウトしてFastCGIの設定を書きます。設定値はサンプルです。まあ、このくらいあればローカルテストでは問題ないでしょう。

以下よりダウンロードを行います。ちなみにXAMPPのapacheはwin32です。
[apache download](https://www.apachelounge.com/download/)



nginxでは、nginx + php-fpmという別プロセスですが、apacheの場合は、apacheにロードするので起動、再起動はapacheのみでOK

```apache:httpd-xampp.conf

#
# PHP-Module setup
#
# LoadFile "C:/xampp/php/php7ts.dll"
# LoadFile "C:/xampp/php/libpq.dll"
# LoadModule php7_module "C:/xampp/php/php7apache2_4.dll"
# <FilesMatch "\.php$">
#     SetHandler application/x-httpd-php
# </FilesMatch>
# <FilesMatch "\.phps$">
#     SetHandler application/x-httpd-php-source
# </FilesMatch>
#
# PHP-FastCGI setup
#
LoadModule fcgid_module modules/mod_fcgid.so
<IfModule fcgid_module>
    FcgidInitialEnv PATH "C:/xampp/php"
    FcgidInitialEnv SystemRoot "C:/Windows"
    FcgidInitialEnv SystemDrive "C:"
    FcgidInitialEnv TEMP "C:/xampp/tmp"
    FcgidInitialEnv TMP "C:/xampp/tmp"
    FcgidInitialEnv windir "C:/windows"
    FcgidIOTimeout 64
    FcgidConnectTimeout 16
    FcgidMaxRequestsPerProcess 1000 
    FcgidMaxProcesses 3
    FcgidMaxRequestLen 8131072
    # Location php.ini:
    FcgidInitialEnv PHPRC "C:/xampp/php"
    FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
    <Files ~ "\.php$">
        Options Indexes FollowSymLinks ExecCGI 
        AddHandler fcgid-script .php
        FcgidWrapper "C:/xampp/php/php-cgi.exe" .php
    </Files>
</IfModule>