在Laravel中从变量值创建Class对象

时间:2017-08-15 20:22:49

标签: php laravel-5.4

我想从返回的字符串创建一个类的对象但是我收到错误Class **test_report** not found。我的代码:

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

2 个答案:

答案 0 :(得分: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);

打电话

为什么呢?因为你避免使用未知数据的“魔术变量”;你可以正确追踪错误;你可以使用命名空间;您可以轻松扩展功能,轻松激活或停用对象(或本例中的报告);你有一个更干净的代码,等等......

答案 1 :(得分: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():检查给定对象是否属于此类或具有此类   作为其父母之一。