2016-12-23 9 views
1

私はSlim Frameworkと組み合わせてEloquentを使用して、小さなAPIを構築しています。何らかの理由で、私はこのエラーを取得しています、と私は問題を見つけることができません。ターゲット[Illuminate Contracts Debug ExceptionHandler]がインスタンス化できません

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

バックトレース

github link

しかしがどのように私はLaravelを使用していないカスタムエラーハンドラを登録することができます

/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 
... 

私はそれが未登録のエラーハンドラとは何かを持っている疑っていますか?

UPDATE 次のように@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); 

答えて

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; 
    } 
} 

NB:テストされていないが。私はこれがコードを見て動作するはずだと思います。

+0

ありがとうございます!私は私の質問に最終的な解決策を加えました。 – wout

関連する問題