phalcon3から5にバージョンアップした際のMVC、Loaderの対応

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を削除してみると解消されるかもです。

そのほかのアップグレードで発生したエラー対応