在PHP Trait Laravel 5.5中使用从父类导入的类

在PHP Trait Laravel 5.5中使用从父类导入的类,php,laravel,laravel-5.5,Php,Laravel,Laravel 5.5,我目前正在开发一个PHP特性,它将帮助我在一些使用Laravel框架的类控制器中重用代码 我想让trait方法尽可能动态,但是当尝试访问父类导入的类时,我得到了一个类未找到异常 我的班主任如下: namespace App\Http\Controllers\Admin; use App\Models\ { Curso, Leccion, Diapositiva, ImagenDiapositiva }; use App\Traits\TestTrait; c

我目前正在开发一个PHP特性,它将帮助我在一些使用Laravel框架的类控制器中重用代码

我想让trait方法尽可能动态,但是当尝试访问父类导入的类时,我得到了一个
类未找到异常

我的班主任如下:

namespace App\Http\Controllers\Admin;

use App\Models\ {
    Curso,
    Leccion,
    Diapositiva,
    ImagenDiapositiva
};

use App\Traits\TestTrait;

class DiapositivasController extends Controller{
   use TestTrait;

   public function addRecord(Request $request){
      $request->class_name = 'ImagenDiapositiva';
      $this->addImage($request);
   }
}
我的特点:

namespace App\Traits;

trait TestTrait{
   public function addImage($request){
      $class_name = $request->class_name;
      $diapositiva = new $class_name;

     //extra code
   }
}

所以我的疑问是,我必须在我的Trait中再次包含我想要使用的模型类,还是我做了其他错误的事情

如果对变量类名使用
new
,则必须使用完全限定类名。我猜,
new$class\u name
是问题的根本原因,因为
$class\u name
必须类似于:“App\Models\ImagenDiapositiva”或任何完整名称空间。只需更改调用
$request->class_name='ImagenDiapositiva'
以反映类的全名。

如果将
new
与变量类名一起使用,则必须使用完全限定类名。我猜,
new$class\u name
是问题的根本原因,因为
$class\u name
必须类似于:“App\Models\ImagenDiapositiva”或任何完整名称空间。只需更改调用
$request->class_name='ImagenDiapositiva'以反映类的全名。

好的,这似乎解决了问题,但为什么我需要完整的命名空间?,我在父类中包含完整的名称空间,这样Trait就可以将其与类名一起使用,这难道还不够吗?我认为它强制执行显式命名约定,以避免大型项目中出现问题。就像对
$class\u name
的调用是在
App\Traits
名称空间中,因为这就是您对类的调用所在。我明白了,所以我根本不需要在类控制器中包含模型类,因为我给出了完整的名称空间。非常感谢。好的,这似乎解决了问题,但是为什么我需要完整的名称空间呢?我在父类中包含完整的名称空间,这样Trait就可以只使用类名了,这还不够吗?我认为它强制执行显式命名约定,以避免大型项目中出现问题。就像对
$class\u name
的调用是在
App\Traits
名称空间中,因为这就是您对类的调用所在。我明白了,所以我根本不需要在类控制器中包含模型类,因为我给出了完整的名称空间。非常感谢你。