在PHP Trait Laravel 5.5中使用从父类导入的类
我目前正在开发一个PHP特性,它将帮助我在一些使用Laravel框架的类控制器中重用代码 我想让trait方法尽可能动态,但是当尝试访问父类导入的类时,我得到了一个在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
类未找到异常
我的班主任如下:
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
名称空间中,因为这就是您对类的调用所在。我明白了,所以我根本不需要在类控制器中包含模型类,因为我给出了完整的名称空间。非常感谢你。