使用字符串获取模型

Afi*_*ifa 2 php reflection laravel

我正在尝试通过其类名访问 Laravel 应用程序中的模型,但出现以下错误:

Class 'Asset' not found
Run Code Online (Sandbox Code Playgroud)

不过,我已经导入了这个模型。这是我的代码:

<?php
namespace App\Services;
use App\Models\Asset as Asset;
use App\Models\Benefit\BenefitGroup as BenefitGroup;
use App\Models\Benefit\EmployeeDependent as EmployeeDependent;
use App\Models\Country as Country;
use App\Models\Employee\Education as Education;
use App\Models\Employee\EducationType as EducationType;
use App\Models\Employee\Employee as Employee;
use App\Models\Employee\EmployeeVisa as EmployeeVisa;
use App\Models\Employee\VisaType as VisaType;
use App\Models\Note as Note;
use App\Models\PaidTimeOff\Policy as Policy;
use App\Models\PaidTimeOff\TimeOffType as TimeOffType;
use Illuminate\Database\Eloquent\Model;
class ACLService
{
    public function getDefaultPermissions($roleType)
    {
        //Array to append all default permissions in single array without extra indexing
        $permissions=[];
        $models=['Asset', 'Employee', 'Education', 'EducationType', 'VisaType', 'EmployeeVisa', 'BenefitGroup', 'EmployeeDependent',
            'Policy', 'TimeOffType','Country', 'Note'];
        foreach ($models as $model) {
            $permissions=$this->getModelPermissions($model, $roleType, $permissions);
        }
    }
    public function getModelPermissions($model, $roleType, $currentPermissions)
    {
        $data=$model::getDefaultPermissionsForThisModel($roleType, $currentPermissions);
        return $data;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我通过

App\Models\Asset
Run Code Online (Sandbox Code Playgroud)

代替

Asset
Run Code Online (Sandbox Code Playgroud)

然后错误得到解决,但我不想以这种格式传递数据,因为如果我们(将来)更改模型在项目中的位置,它会增加工作量。

这是一个不完整的项目,我们肯定会改变模型的位置。

我正在寻找更清洁的解决方案。

Jer*_*dev 5

使用::class常量来获取正确命名空间的类名。如果您移动文件,这也将使其更容易。智能 IDE 将能够检测到引用。

$models=[
    Asset::class, 
    Employee::class,
    ...
];
Run Code Online (Sandbox Code Playgroud)

这假定所有类都已导入到 PHP 文件的顶部。