получить модель, используя строку - PullRequest
2 голосов
/ 20 февраля 2020

Я пытаюсь получить доступ к модели в приложении Laravel через имя класса, но получаю следующую ошибку:

Class 'Asset' not found

Хотя я уже импортировал эту модель. Вот мой код:

<?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;
    }
}

Если я передам

App\Models\Asset

вместо

Asset

, тогда ошибка будет устранена, но я не хочу передавать данные в этом формате, потому что это увеличит объем работы, если мы когда-нибудь сможем изменить (в будущем) расположение модели в проекте.

Это неполный проект, и мы определенно изменим расположение моделей.

Я ищу более чистое решение.

1 Ответ

5 голосов
/ 20 февраля 2020

Используйте константу ::class, чтобы получить правильное имя класса в пространстве имен. Это также облегчит процесс перемещения файлов. Smart IDE сможет обнаружить ссылку.

$models=[
    Asset::class, 
    Employee::class,
    ...
];

Это предполагает, что все классы были импортированы вверху файла PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...