Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 11.08.2017 13:08:37

Динамическое подставление модели

Здравствуйте.
У каждого ресурса, есть bulk actions, где я отмечаю все элементы ресурса (пример: ресурс — product) в этом ресурсе отмечаем все товары, и жмем удалить. Массив айдишников товаров посылается на этот роут
Route::post('post/mass-delete/{model}', 'BackendBaseApiController@massDelete')->name('backend.api.mass-delete');
Сам контроллер

PHP
    /**
     * Mass delete models
     *
     * @param Request $request
     * @param Model $model
     * @return \Illuminate\Http\JsonResponse
     */
    
public function massDelete(Request $requestModel $model)
    {
        try
        {
            
$model->whereIn('id'$request->ids)->delete();

            return 
response()->json('Successfully deleted');
        }
        
// ....
    
}

Мой вопрос в том, как динамически подставить нужную модель? И как это сделать в route('backend.api.mass-delete', ['model' => ????])
Спасибо!

Не в сети

#2 12.08.2017 11:51:53

Re: Динамическое подставление модели

Нашел решение. Может комунибудь понадобится.

PHP
    /**
     * @var array
     */
    
public $models = [
        
'Manufacturer' => \App\Manufacturer::class,
        
'Attribute' => \App\Attribute::class,
        
'Feature' => \App\Feature::class,
        
// ...
    
];

    
/**
     * Mass delete models
     *
     * @param Request $request
     * @param $modelName
     * @return \Illuminate\Http\JsonResponse
     */
    
public function massDelete(Request $request$modelName)
    {
        try
        {
            
$class $this->getModel($modelName);

            
$model = new $class;

            
$model->whereIn('id'$request->ids)->delete();

            return 
response()->json('Successfully deleted'200);
        }
        catch (\
Throwable $t)
        {
            return 
response()->json(['Error: '$t->getMessage()], 422);
        }
    }

    
/**
     * Get model by key
     *
     * @param $model
     * @return mixed
     */
    
public function getModel($model)
    {
        return 
$this->models[$model];
    }

Может есть более элегантное решение. Но я пока смог сделать только так. Спасибо челу с SO
https://stackoverflow.com/questions/45648042/how-to-inject-multiple-models-in-one-controller-method/45648145#45648145

Не в сети

Подвал раздела