2017-05-07 5 views
1

私はlaravel 5.4を使用しています。私はモデルクラスの新しいインスタンスを取得するクラス内のメソッドを持っています。クラスのフルネームは実行時に計算されるため、計算されたクラス名が存在しない可能性があります。クラスが存在しない場合、例外を無視したいので、代わりにnullを返したいと思います。Laravelは試してみると例外イベントを投げています

しかし、例外が発生した場合でも、私はそれがない

[symfonyの\コンポーネント\デバッグ\例外\ FatalThrowableError] クラス「のApp \モデル\ CREATEDBY」すべきでないと考えていると思ったの下に、Laravelはまだ例外をスロー見つかった

実行時に文字列App\Models\CreatedByが計算されたことに注意してください。ここで

は私のコード

スローされたエラーを無視して nullを返すことで決済することができますどのように
private function getForeignModelInstance() 
{ 
    try { 
     if (!$this->foreignModel) { 
      $model = $this->getFullForeignModel(); 

      if ($model) { 
       $this->foreignModel = new $model(); 
      } 
     } 

     return $this->foreignModel; 
    } catch (\Exception $e) { 
     return null; 
    } 
} 

のですか?

+0

例外の代わりに 'Throwable'を受け取ります – MoeinPorkamel

+0

' FatalThrowableError'は 'Exception'を拡張していますので、違いはありません。私はそれを試みたが、同じエラーが発生しました。 –

+0

私は同じ問題を抱えていますが、私にとってはデータベース移行の中にあるので、本当にクリーンアップコードを確実に実行できる必要があります。私は "例外が発生しないようにする"タイプの解決策が有効であるとは思わない。私は基本的なPHPのキャッチがここで働いていない理由を理解したい、私たちは何か間違っているのですか? – madz

答えて

1

私は最良の方法は、それを隠す代わりに例外が発生するのを防ぐことだと思います。だから前に、新しいクラスのインスタンスを作成し、そのが存在するかどうかを確認:

private function getForeignModelInstance() 
{ 
    try { 
     if (!$this->foreignModel) { 
      $model = $this->getFullForeignModel(); 

      if ($model && class_exists($model)) { 
       $this->foreignModel = new $model(); 
      } 

      return null; 
     } 

     return $this->foreignModel; 
    } catch (\Exception $e) { 
     return null; 
    } 
} 

注:class_existsは短く、エイリアスクラス名を使用して動作しません。

+0

これは回避策です。これは、LaravelがPHPが持っているtry..catchロジックを尊重しないことを意味しますか? –

関連する問題