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
- 他のモデルを扱うときのbelongsTo,hasManyについて
- FCGIについて
他のモデルを扱うときのbelongsTo,hasManyについて
まずは、phalconのドキュメントを見てみる。
https://docs.phalconphp.com/ja/latest/reference/model-relationships.html
特別なことをしていなければ、そのまま書いてある通りモデルにinitializeを用意して
public function initialize()
{
$this->hasMany(
"id",
"RobotsParts",
"parts_id"
);
}
こんな感じにすれば良い。
hasManyやbelongsToで指定する先、上記の場合はRobotsPartsのモデルに
namespaceを設定している場合。
public function initialize()
{
$this->hasMany(
"id",
"\namespacename\RobotsParts",
"parts_id"
);
}
となります。
ただし、これだとfind()したときに
X $models->\namespacename\RobotsParts
というような指定はもちろんできないxため、alias を付けてあげます。
public function initialize()
{
$this->hasMany(
"id",
"\namespacename\RobotsParts",
"parts_id",
array( 'alias' => 'aliasname' );
}
$mod = Robots::findfirst();
$mod->aliasname
また、alias付けない場合は、
use namespacename\RobotsParts as aliasname
これでも上記同様に扱えます。
もう一つおまけ。
これはありえないケースかとおもうけど、テストデータでbelongsTo先となにかしらのidで結合させているわけですけど結合先に存在しなかった場合、そんなプロパティが無いですってエラーになります。
たとえば、
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
nginxでは、nginx + php-fpmという別プロセスですが、apacheの場合は、apacheにロードするので起動、再起動はapacheのみでOK
#
# 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>