Laravel 8: не передаётся модель из контроллера в blade-шаблон
Из контроллера, в ф-ии edit не передаётся объект в blade-шаблон генерации формы.
routes\web.php:
Route::middleware(['role:admin'])->prefix('admin-panel')->group(function () {
Route::get('/', [App\Http\Controllers\Admin\HomeController::class, 'index'])->name('adm-home');
Route::resource('news', App\Http\Controllers\Admin\AdmNewsController::class);
});
resources\views\admin\news\edit.blade.php:
<form action="{{ route('news.update', $news['id']) }}" method="POST">
@csrf
@method('PUT')
...
app\Http\Controllers\Admin\AdmNewsController.php:
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\NewsModel;
use Illuminate\Http\Request;
class AdmNewsController extends Controller {
public function index() {
$news_items = NewsModel::orderBy('created_at','desc')->get();
return view('admin.news.index',[
'news_items' => $news_items
]);
}
public function create() {
return view('admin.news.create');
}
public function store(Request $request) {
$news_item = new NewsModel();
$news_item->title = $request->title;
$news_item->img = $request->img;
$news_item->text = $request->text1;
$news_item->tag_id = 0;
if($request->published == 'on') {
$news_item->published = 1;
} else {
$news_item->published = 0;
}
$news_item->save();
return redirect()->back()->withSuccess('Новость добавлена');
}
public function show(NewsModel $newsModel) {
//
}
public function edit(NewsModel $newsModel) {
return view('admin.news.edit', [
'news' => $newsModel
]);
}
public function update(Request $request, NewsModel $newsModel) {
$newsModel->title = $request->title;
$newsModel->save();
return redirect()->back()->withSuccess('Новость обновлена');
}
public function destroy(NewsModel $newsModel) {
//
}
}
php artisan route:list показывает маршруты:
GET|HEAD | admin-panel | adm-home | App\Http\Controllers\Admin\HomeController@index
GET|HEAD | admin-panel/news | news.index | App\Http\Controllers\Admin\AdmNewsController@index
POST | admin-panel/news | news.store | App\Http\Controllers\Admin\AdmNewsController@store
GET|HEAD | admin-panel/news/create | news.create | App\Http\Controllers\Admin\AdmNewsController@create
GET|HEAD | admin-panel/news/{news} | news.show | App\Http\Controllers\Admin\AdmNewsController@show
PUT|PATCH | admin-panel/news/{news} | news.update | App\Http\Controllers\Admin\AdmNewsController@update
DELETE | admin-panel/news/{news} | news.destroy | App\Http\Controllers\Admin\AdmNewsController@destroy
GET|HEAD | admin-panel/news/{news}/edit | news.edit | App\Http\Controllers\Admin\AdmNewsController@edit
Получаю ошибку: (На странице: site.ru/admin-panel/news/10/edit)
Illuminate\Routing\Exceptions\UrlGenerationException
Missing required parameter for [Route: news.update] [URI: admin-panel/news/{news}] [Missing parameter: news]. (View: E:\WebServers\OpenServer\domains\site.ru\core\resources\views\admin\news\edit.blade.php)
Не приходит объект и параметр ID.
Если в шаблоне, для проверки, сделать замену:
<form action="{{ route('news.update', 10) }}" method="POST">
Ошибка пропадёт, страница редактирования отображается, но соотвецтвенно без заполненных полей формы.
При вызове dd в контроллере:
public function edit(NewsModel $newsModel) {
dd($newsModel);
}
Показывает пустой объект:
App\Models\NewsModel {#1363 ▼
#connection: null
#table: null
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
+preventsLazyLoading: false
#perPage: 15
+exists: false
+wasRecentlyCreated: false
#attributes: []
#original: []
#changes: []
#casts: []
#classCastCache: []
#dates: []
#dateFormat: null
#appends: []
#dispatchesEvents: []
#observables: []
#relations: []
#touches: []
+timestamps: true
#hidden: []
#visible: []
#fillable: []
#guarded: array:1 [▶]
}
Массивы #attributes и #original пустые, в поле #table стоит null
Кэши чистил:
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear
Подскажите, какие проверки можно сделать, чтобы разобраться в ситуации или может увидите ошибку или дадите решение.
Ответы (2 шт):
$news['id'] почти что правильно, надо так:
<form action="{{ route('news.update', [ 'news'=>$news['id'] ]) }}" method="POST">
@csrf
@method('PUT')
...
т.е. второй аргумент для фукнции route() это ассоциативный массив соотв-но с именованными параметрами. и имя параметра метода edit тоже надо поменять на $news
У вас сгенерирован роут admin-panel/news/{news}/edit. Обратите внимание на имя переменной {news}. Вы должны указать точно такое же имя в контроллере в методе edit.
public function edit(NewsModel $news) {
return view('admin.news.edit', compact('news');
}
Во вью вы можете обращаться к модели $news как к объекту:
<form action="{{ route('news.update', $news->id) }}" method="POST">