Laravel 5.6 передает красноречивую модель в качестве параметра функции

У меня есть элемент управления выбором в форме лезвия, который должен быть обновлен через ajax с помощью этой функции:

function getOpciones(tbName) {
    $.get('/ajax/read-data/' + tbName, function(data){
    return (data);
});
}

Функция принимает строковую переменную tbName с именем таблицы, с которой связан элемент управления, и передает ее в качестве параметра маршруту:

Route::get('/ajax/read-data/{modelo}', 'AjaxController@readData');

Затем контроллер должен получить параметр {modelo} и получить записи в этой таблице:

use App\RegFiscal;

public function readData($modelo) {
    $arreglo = $modelo::all();
    return response($arreglo);
}

Но даже несмотря на то, что я ссылаюсь на модель с помощью «use App\RegFiscal», все, что я получаю, это эта ошибка в журнале laravel:

2018-03-23 ​​18:52:08] local.ERROR: исключение «Symfony\Component\Debug\Exception\FatalErrorException» с сообщением «Класс RegFiscal» не найден» в C:\wamp64\www\laravel\cte\app \Http\Контроллеры\AjaxController.php:32

Я новичок в Laravel, поэтому само собой разумеется, что я потерян, и любая помощь будет очень признательна. Спасибо!


person E. Barney    schedule 23.03.2018    source источник


Ответы (3)


То, что вы use App\RegFiscal, не означает, что $modelo связано с этим.

Однако вы можете использовать app("App\\$modelo") для загрузки вашей модели на основе параметра, полученного от маршрутизатора. Вам больше не потребуется use App\RegFiscal.

$arreglo = app("App\\$modelo");
return response($arreglo::all());

Предполагается, что ваша модель хранится в каталоге app по умолчанию в вашем проекте Laravel. Если нет, вы можете изменить "App\" на то, где он хранится. Если, например, ваша модель находится в app\models\modelname.php, это будет "App\Models\\$modelo".

person Wild Beard    schedule 23.03.2018

Вы можете сделать это следующим образом:

public function readData($modelo) {
$modelName = '\App' . '\\' . $modelo;
$class = new $modelName();
arreglo = $class::all();
return response($arreglo);

}

person ali    schedule 23.03.2018
comment
Большое спасибо али. Я попробовал это, и это работает отлично. Я голосую за ответ Дикой Бороды просто потому, что он пришел первым и его короче печатать. Однако ваше решение обеспечивает большую ясность, когда параметры запроса в $class длиннее, чем просто $class::all(); - person E. Barney; 24.03.2018

Для таких, как я, которые хотели внедрить его в конструктор, вот как это сделать:

~$ php artisan make:provider MyProvider

Затем переопределите функцию регистрации следующим образом:

class MyProvider implements ServiceProvider {

    /** @override */
    public function register() {
        $this->app->bind(ShapeInterface::class, function ($app) {
            return new Square($app->make(MyModel::class));
        });
    }
}

ShapeInterface — это простой интерфейс, а Square — это простой класс, который реализует интерфейс формы с параметром конструктора красноречивой модели.

class Square implements ShapeInterface {
    private MyModel $model;

    function __construct(MyModel $model) {
        $this->model = $model;
    }

    ...
}
person Miko Chu    schedule 01.01.2021