Connectionmanager 连接返回致命错误而不是 CakePHP 3 中的重定向

Connectionmanager connect returning fatal error instead of redirect in CakePHP 3

我正在使用 CakePHP 3.4

在我的组件中,我正在检查是否可以安装数据库连接。如果无法建立数据库连接,请将用户重定向到 Installation 插件以设置数据库配置。

这就是我签入组件的方式。

<?php
 namespace Installer\Controller\Component;

 use Cake\Controller\Component;
 use Cake\Controller\ComponentRegistry;
 use Cake\Datasource\ConnectionManager;
 use Cake\Core\Configure;
 use Cake\Filesystem\File;

 /**
  * Install component
  */
 class InstallComponent extends Component
 {
     public function installationCheck()
     {
         // connection to the database
         try {
             $db = ConnectionManager::get('default');

             if(!$db->connect()) {      // line 23
                return $this->redirect(['plugin' => 'Installer', 'controller' => 'Install', 'action' => 'index']);
             }
         } catch (Exception $e) {

         }


        return true;
     }
 }

但是当数据库连接失败时,它不会重定向用户,而是给出致命错误

Connection to database could not be established: SQLSTATE[HY000] [1045] Access denied for user 'user'@'host' (using password: YES)

堆栈跟踪

⟩ Cake\Database\Connection->connect ROOT/plugins/Installer/src/Controller/Component/InstallComponent.php, line 23
⟩ Installer\Controller\Component\InstallComponent->installationCheck APP/Controller/AppController.php, line 65
⟩ App\Controller\AppController->beforeRender CORE/src/Event/EventManager.php, line 414
⟩ Cake\Event\EventManager->_callListener CORE/src/Event/EventManager.php, line 391
⟩ Cake\Event\EventManager->dispatch CORE/src/Event/EventDispatcherTrait.php, line 78
⟩ Cake\Controller\Controller->dispatchEvent CORE/src/Controller/Controller.php, line 610
⟩ Cake\Controller\Controller->render APP/Controller/PagesController.php, line 61
⟩ App\Controller\PagesController->display CORE/src/Controller/Controller.php, line 440
⟩ Cake\Controller\Controller->invokeAction CORE/src/Http/ActionDispatcher.php, line 119
⟩ Cake\Http\ActionDispatcher->_invoke CORE/src/Http/ActionDispatcher.php, line 93
⟩ Cake\Http\ActionDispatcher->dispatch CORE/src/Http/BaseApplication.php, line 78
⟩ Cake\Http\BaseApplication->__invoke CORE/src/Http/Runner.php, line 65
⟩ Cake\Http\Runner->__invoke CORE/src/Routing/Middleware/RoutingMiddleware.php, line 59
⟩ Cake\Routing\Middleware\RoutingMiddleware->__invoke CORE/src/Http/Runner.php, line 65
⟩ Cake\Http\Runner->__invoke CORE/src/Routing/Middleware/AssetMiddleware.php, line 88
⟩ Cake\Routing\Middleware\AssetMiddleware->__invoke CORE/src/Http/Runner.php, line 65
⟩ Cake\Http\Runner->__invoke CORE/src/Error/Middleware/ErrorHandlerMiddleware.php, line 92
⟩ Cake\Error\Middleware\ErrorHandlerMiddleware->__invoke CORE/src/Http/Runner.php, line 65
⟩ Cake\Http\Runner->__invoke ROOT/vendor/cakephp/debug_kit/src/Middleware/DebugKitMiddleware.php, line 52
⟩ DebugKit\Middleware\DebugKitMiddleware->__invoke CORE/src/Http/Runner.php, line 65
⟩ Cake\Http\Runner->__invoke CORE/src/Http/Runner.php, line 51
⟩ Cake\Http\Runner->run CORE/src/Http/Server.php, line 80
⟩ Cake\Http\Server->run ROOT/webroot/index.php, line 37

如果您检查 ConnectionManager::get() 方法的定义,您会发现它要么 returns 一个连接对象,要么抛出一个 MissingDatasourceConfigException。因此,您可能需要将代码包装在 try catch 块中:-

public function installationCheck()
{
    try {
        $db = ConnectionManager::get('default');

        // connection to the database
        if (!$db->connect()) {
           return $this->redirect(['plugin' => 'Installer', 'controller' => 'Install', 'action' => 'index']);
        }
    } catch (\Exception $e) {
    }

    return true;
}