【问题标题】:Target [Illuminate\Contracts\Debug\ExceptionHandler] is not instantiable目标 [Illuminate\Contracts\Debug\ExceptionHandler] 不可实例化
【发布时间】:2017-05-09 08:23:09
【问题描述】:

我正在结合使用 Eloquent 和 Slim 框架来构建一个小型 API。出于某种原因,我收到了这个错误,我找不到问题所在:

Target [Illuminate\Contracts\Debug\ExceptionHandler] is not instantiable.

数据库设置正确。在服务器上的暂存环境中引发了此错误。在本地,使用 MySQL 5.6.29,它可以完美运行。虽然我认为它与 MySQL 5.7 无关,因为我在同一台服务器上使用相同版本的 Eloquent 运行了另一个应用程序。

谁能指出我正确的方向?

我正在使用:

  • 雄辩版:5.3.23
  • PHP 版本:5.6.28
  • 数据库驱动和版本:MySQL 5.7.16

回溯

/path/to/app/shared/vendor/illuminate/container/Container.php:644 
Illuminate\Container\Container -> make
/path/to/app/shared/vendor/illuminate/database/Connectors/ConnectionFactory.php:130 
call_user_func 
/path/to/app/shared/vendor/illuminate/database/Connection.php:964 
Illuminate\Database\Connection -> getPdo 
/path/to/app/shared/vendor/illuminate/database/Connection.php:832 
Illuminate\Database\Connection -> reconnectIfMissingConnection 
/path/to/app/shared/vendor/illuminate/database/Connection.php:717 
Illuminate\Database\Connection -> run 
/path/to/app/shared/vendor/illuminate/database/Connection.php:350 
Illuminate\Database\Connection -> select 
/path/to/app/shared/vendor/illuminate/database/Query/Builder.php:1648 
Illuminate\Database\Query\Builder -> runSelect 
/path/to/app/shared/vendor/illuminate/database/Query/Builder.php:1634 
Illuminate\Database\Query\Builder -> get 
/path/to/app/shared/vendor/illuminate/database/Eloquent/Builder.php:632 
Illuminate\Database\Eloquent\Builder -> getModels 
/path/to/app/shared/vendor/illuminate/database/Eloquent/Builder.php:327 
Illuminate\Database\Eloquent\Builder -> get 
/path/to/app/shared/vendor/illuminate/database/Eloquent/Builder.php:297 
Illuminate\Database\Eloquent\Builder -> first 
...

我怀疑它与未注册的错误处理程序有关:

github link

但是不使用 Laravel 时如何注册自定义错误处理程序?

@patricus 的解决方案可以如下实现:

// bootstrap Eloquent ORM
$container = new Container();
$container->singleton(
  'Illuminate\Contracts\Debug\ExceptionHandler'
, 'My\Custom\DatabaseExceptionHandler'
);

$factory    = new ConnectionFactory( $container );
$connection = $factory->make([
  'driver'    => 'mysql'
, 'host'      => App::config( 'database_host' )
, 'database'  => App::config( 'database_name' )
, 'username'  => App::config( 'database_user' )
, 'password'  => App::config( 'database_password' )
, 'charset'   => App::config( 'database_charset' )
, 'collation' => App::config( 'database_collate' )
, 'prefix'    => ''
]);

$resolver = new ConnectionResolver();
$resolver->addConnection( 'default', $connection );
$resolver->setDefaultConnection( 'default' );

// initialize connection
Model::setConnectionResolver( $resolver );

【问题讨论】:

    标签: php laravel laravel-5 eloquent slim


    【解决方案1】:

    在我的情况下,这是执行 php 命令的系统用户的权限问题。

    【讨论】:

      【解决方案2】:

      请确保您的 xampp 服务器和数据库服务器正常运行。

      【讨论】:

        【解决方案3】:

        您应该能够访问容器以通过胶囊注册自己的异常处理程序。

        $capsule = new \Illuminate\Database\Capsule\Manager();
        
        $capsule->getContainer()->singleton(
            \Illuminate\Contracts\Debug\ExceptionHandler::class,
            \Your\ExceptionHandler\Implementation::class
        );
        

        如果你想要一个真正快速、非常愚蠢的异常处理程序,你可以使用这个:

        class DumbExceptionHandler implements \Illuminate\Contracts\Debug\ExceptionHandler
        {
            public function report(Exception $e)
            {
                //
            }
        
            public function render($request, Exception $e)
            {
                throw $e;
            }
        
            public function renderForConsole($output, Exception $e)
            {
                throw $e;
            }
        }
        

        注意:未经测试。我相信这应该可以查看代码。

        【讨论】:

        • 谢谢!我为我的问题添加了最终解决方案。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-08
        • 1970-01-01
        • 1970-01-01
        • 2016-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多