2017-08-15 9 views
0

返された文字列からクラスのオブジェクトを作成したいが、エラーClass **test_report** not foundが発生する。私のコード:クラスのオブジェクトをLaravelの変数値から作成する

public function display_report_builder($report_name = null) 
{ 
    $column_listing = new $report_name;// gets the test_report 
    return view('column_list')->with(['column_list_names' => $column_listing->columns]);  
} 
+0

本当にこのクラスはありますか?オートローダーはこのクラスについて知っていますか? 以下 'クラスtest_reportがレポート{ \tパブリック関数__construct(){ \t \t \t \tの$ this - >列=の$ this - >のgetColumns()が延びるにつれて –

+0

@JeffLambertのtest_report子モデルクラスです。 \t} } モデルにアクセスするために 'use App \ reports \ test_report;'を追加しました。 'display_report_builder($ report_name = null)'関数がコントローラにあります。 – doppywoppy

答えて

0

これは、ここでのより良いアプローチではありません。何をすべきことはFactory design patternを使用することです:

class ReportFactory 
{ 
    public static function create($report_name) 
    { 
     switch($report_name) { 
      case 'test_report': return new TestReport(); 
      default: throw new Exception('report not found'); 
     } 
    } 
} 

次に、あなたは$column_listing = ReportFactory::create($report_name);

なぜと呼んで?あなたは未知のデータで "魔法の変数"を避けるので、エラーを適切にトレースできます。名前空間を使用できます。機能を簡単に拡張したり、オブジェクト(この場合はレポート)を簡単に有効または無効にすることができます。あなたはクリーンなコードを持っている、というように...クラス名(文字列)が本当に有効なクラスであれば

+0

ありがとう@FellippeDuarte。それは私の問題を解決しました。 – doppywoppy

0

テスト:指定されたオブジェクトは、このクラスであるかどうかをチェック:

public function display_report_builder($report_name = null) 
{ 
    $column_list_names = null; 

    if (class_exists($report_name) && is_a($report_name, App\reports\test_report::class, true)) { 
     $column_listing = new $report_name; 
     $column_list_names = $column_listing->columns; 
    } 

    return view('column_list', compact('column_list_names'));  
} 

is_a()このクラスはその親の1つとして です。

+0

まだクラスが見つかりません。 – doppywoppy

+0

あなたは 'composer dump-autoload'を試しました – yoeunes

+0

それは働いていました。ありがとう@yoeunes – doppywoppy

関連する問題