phalcon3から5にバージョンアップした際にMVC・Module周り、Loaderで発生したHTTP ERROR 500やDeprecated対応
Phalcon\Loader not found
FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught Error: Class "Phalcon\Loader" not found in {path}
Phalcon\LoaderがPhalcon\Autoload\Loaderに変わったので修正。
https://docs.phalcon.io/5.0/ja-jp/upgrade > 一般的なメモ
Call to undefined method Loader::registerNamespaces()
FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught Error: Call to undefined method Phalcon\Autoload\Loader::registerNamespaces() in {path}
registerNamespaces()がsetNamespaces()にリネームされたので修正。
https://docs.phalcon.io/5.0/ja-jp/upgrade#autoload
Call to undefined method Loader::registerClasses()
FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught Error: Call to undefined method Phalcon\Autoload\Loader::registerClasses() in {path}
registerClasses()がsetClasses()にリネームされたので修正。
https://docs.phalcon.io/5.0/ja-jp/upgrade#autoload
Mvc\Application::handle() expects exactly 1 argument, 0 given
FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught ArgumentCountError: Phalcon\Mvc\Application::handle() expects exactly 1 argument, 0 given in {path}
handle()に$_SERVER["REQUEST_URI"]を渡す必要があるので、handle()の引数に$_SERVER["REQUEST_URI"]を追加。
-handle() +handle($_SERVER["REQUEST_URI"])
https://docs.phalcon.io/5.0/ja-jp/application > 概要
ついでにhandle()周りの返却方法も変わっていたので修正。
-echo $application->handle($_SERVER["REQUEST_URI"])->getContent(); +$application->handle($_SERVER["REQUEST_URI"])->send();
class Phalcon\DiInterface is not available
FastCGI sent in stderr: "PHP message: PHP Fatal error: Could not check compatibility between Module::registerAutoloaders(?Phalcon\DiInterface $di = null) and Phalcon\Mvc\ModuleDefinitionInterface::registerAutoloaders(?Phalcon\Di\DiInterface $container = <default>), because class Phalcon\DiInterface is not available in {pathto}/app/modules/frontend/Module.php on line 17" while reading response header from upstream, client: xxx.xx.xx.x, server: xxxx.com, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "xxxx.com"
Phalcon\DiInterfaceからPhalcon\Di\DiInterfaceに変更になっていたので修正。
https://docs.phalcon.io/5.0/ja-jp/application#multi-module
Class "Phalcon\Mvc\User\Component" not found
FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught Error: Class "Phalcon\Mvc\User\Component" not found in {path}
Phalcon\Mvc\User\ComponentがPhalcon\Di\Injectableに変更になったので修正。
クラス名がComponentからInjectableに変わっているのでuse文だけでなく、クラス名の部分も修正。
https://docs.phalcon.io/4.0/ja-jp/upgrade#mvcuser
Class "Phalcon\Mvc\User\Plugin" not found
FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught Error: Class "Phalcon\Mvc\User\Plugin" not found in {path}
Phalcon\Mvc\User\Pluginからuse Phalcon\Di\Injectableに変更になったので修正。
クラス名がPluginからInjectableに変わっているのでuse文だけでなく、クラス名の部分も修正。
https://docs.phalcon.io/4.0/ja-jp/upgrade#mvcuser
Class "Phalcon\Db\Adapter\Pdo\Factory" not found
FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught Error: Class "Phalcon\Db\Adapter\Pdo\Factory" not found in {path}
Phalcon\Db\Adapter\Pdo\FactoryがPhalcon\Db\Adapter\PdoFactoryに変更になったので修正。
クラス名が変更になっているので、クラス名の部分も変更忘れず。
https://docs.phalcon.io/4.0/ja-jp/upgrade#db-1
Non-static method Phalcon\Db\Adapter\PdoFactory::load() cannot be called statically
FastCGI sent in stderr: "PHP message: PHP Fatal error: Uncaught Error: Non-static method Phalcon\Db\Adapter\PdoFactory::load() cannot be called statically in {path}
load()がstatic methodじゃなくなったので修正
-PdoFactory::load($config->database) +(new PdoFactory())->load($config->database)
https://docs.phalcon.io/5.0/ja-jp/db-layer#load
Uncaught ArgumentCountError: Too few arguments to function Closure::{closure}()
PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function Closure::{closure}(), 1 passed and exactly 2 expected in {pathto}/app/settings/services.php:41
引数の渡し方でエラーになっているようです。
今回の場合は、voltのserviceをsetするところでエラーになっていました。
引数の受け渡しを以下のように修正。
-$di->setShared('voltShared', function ($view, $di) { +$di->setShared('voltShared', function ($view) use ($di) {
The 'compileAlways' option is deprecated, The 'compiledPath' option is deprecated
PHP Deprecated: The 'compileAlways' option is deprecated. Use 'always' instead. in {path} PHP Deprecated: The 'compiledPath' option is deprecated. Use 'path' instead. in {path}
Voltサービスを設定するときのオプションのキー名が変更になりました。
以下のように変更。
変更前 | 変更後 |
---|---|
compileAlways | always |
compiledPath | path |
https://docs.phalcon.io/4.0/ja-jp/upgrade#mvcviewenginevolt
Uncaught TypeError: Phalcon\Flash\AbstractFlash::__construct():
PHP Fatal error: Uncaught TypeError: Phalcon\Flash\AbstractFlash::__construct(): Argument #1 ($escaper) must be of type ?Phalcon\Html\Escaper\EscaperInterface, array given in {path}
Flashのcssのclass設定をconstructに渡すのではなく、setCssClasses()で渡すように修正。
- return new FlashSession([ - 'error' => 'alert alert-danger', - 'success' => 'alert alert-success', - 'notice' => 'alert alert-info', - 'warning' => 'alert alert-warning' - ]); + $flash = new FlashSession(); + $flash->setCssClasses([ + 'error' => 'alert alert-danger', + 'success' => 'alert alert-success', + 'notice' => 'alert alert-info', + 'warning' => 'alert alert-warning' + ]); + return $flash;
https://docs.phalcon.io/5.0/ja-jp/flash
Class "Phalcon\Session\Adapter\Files" not found
PHP Fatal error: Uncaught Error: Class "Phalcon\Session\Adapter\Files" not found in {path}
Phalcon\Session\Adapter\FilesからPhalcon\Session\Adapter\Streamに変更になったので修正。
https://docs.phalcon.io/4.0/ja-jp/upgrade#session
Call to undefined method Phalcon\Session\Adapter\Stream::start()
PHP Fatal error: Uncaught Error: Call to undefined method Phalcon\Session\Adapter\Stream::start() in {path}
Sessionのスタート方法が変わったので修正。
+use Phalcon\Session\Manager as SessionManager; ・・・ $di->setShared('session', function () { - $session = new SessionAdapter(); - $session->start(); - return $session; + $session = new SessionManager(); + $session->setAdapter(new SessionStream()); + $session->start(); + return $session; });
https://docs.phalcon.io/5.0/ja-jp/session#start
Dispatcher has detected a cyclic routing causing stability problems
PHP message: Dispatcher has detected a cyclic routing causing stability problems #0 [internal function]: Phalcon\Mvc\Dispatcher->throwDispatchException() #1 [internal function]: Phalcon\Dispatcher\AbstractDispatcher->dispatch() #2 /web/dev/ttonosaki/iot/public/index.php(30): Phalcon\Mvc\Application->handle() #3 {main}PHP message: PHP Deprecated: Phalcon\Http\Response::setContent(): Passing null to parameter #1 ($content) of type string is deprecated in {path}
Routingが無限ループしているためエラーとなっているようです。
action → エラー → NotFoundPlugin → エラー → NotFoundPlugin → …
今回の原因は古いacl.dataが残っているためエラーになっていました。
voltのcache、securityのacl.dataを削除してみると解消されるかもです。