Я новичок в Laravel. Я создал модель, контроллер ресурсов и маршрут для одной из моих таблиц. Я модифицировал класс модели для использования определенного имени таблицы, но объект модели, введенный Laravel 5.4, не имеет атрибутов, даже если соответствующая запись существует в базы данных. Вот шаги, которые я предпринял.
1) Создайте модель с мастером. Я выполнил эту команду:
php artisan make:model Tree
2) Измените класс модели дерева, как указано для указания конкретной таблицы. Я должен был сделать это, потому что моя таблица называется деревом , а не «деревьями», которые в противном случае предполагал бы Laravel на основе его внутренних правил.
/** * The table associated with the model. * * @var string */ protected $table = 'tree';
3) Создайте контроллер ресурсов, который использует мою модель с помощью этой команды
php artisan make:controller CategoryController --resource --model=Tree
4) Добавьте маршруты маршрута ресурсов / web.php, чтобы сопоставить путь веб-сервера к контроллеру:
Route::resource('categories', 'CategoryController');
5) Измените метод show () CategoryController на var_dump введенный объект $ tree. Это выглядит так:
/** * Display the specified resource. * * @param \App\Tree $tree * @return \Illuminate\Http\Response */ public function show(Tree $tree) { // we need to display the children of $tree var_dump($tree); }
6) Моя структура таблицы соответствует всем соглашениям, указанным в документах Laravel. Существует целочисленный столбец id, который не имеет знака и автоинкремент. У меня есть метки времени created_at и updated_at. Единственное отличие в том, что имя таблицы – это «дерево», а не «деревья», но это должно быть покрыто изменением, которое я сделал выше:
CREATE TABLE IF NOT EXISTS `tree` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `parent_id` int(10) unsigned DEFAULT NULL, `label` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', `display_order` int(11) unsigned NOT NULL DEFAULT '0', `forum_id` int(5) NOT NULL DEFAULT '0', `url` varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', `flavor` tinyint(4) NOT NULL DEFAULT '0', `created_at` timestamp NULL DEFAULT NULL, `updated_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`id`), KEY `parent_pkey` (`parent_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Эта таблица содержит данные. У него определенно есть запись с id = 1.
7) Я посещаю URL-адрес, который должен активировать метод show () моего контроллера ресурсов. Выход я получаю verfies, что это на самом деле метод CategoryController :: show (). http://example.com/categories/1
Вот проблема.
Результат var_dump ($ tree) не имеет атрибутов. Нет ошибки, но что-то не так с инжектированным объектом .
object(App\Tree)#217 (24) { ["table":protected]=> string(4) "tree" ["connection":protected]=> NULL ["primaryKey":protected]=> string(2) "id" ["keyType":protected]=> string(3) "int" ["incrementing"]=> bool(true) ["with":protected]=> array(0) { } ["perPage":protected]=> int(15) ["exists"]=> bool(false) ["wasRecentlyCreated"]=> bool(false) ["attributes":protected]=> array(0) { } ["original":protected]=> array(0) { } ["casts":protected]=> array(0) { } ["dates":protected]=> array(0) { } ["dateFormat":protected]=> NULL ["appends":protected]=> array(0) { } ["events":protected]=> array(0) { } ["observables":protected]=> array(0) { } ["relations":protected]=> array(0) { } ["touches":protected]=> array(0) { } ["timestamps"]=> bool(true) ["hidden":protected]=> array(0) { } ["visible":protected]=> array(0) { } ["fillable":protected]=> array(0) { } ["guarded":protected]=> array(1) { [0]=> string(1) "*" } }
Я сделал что-то не так? Как заставить Laravel вводить правильный объект?
EDIT: Кто-то спросил, почему я вводил неправильный объект в свой маршрут. Ниже приведена сокращенная версия класса, которая была автоматически сгенерирована на шаге 3. Он ясно указывает на класс Tree и подсказки кода, который ожидает объект дерева. Я не создал какой-либо из этого кода, кроме инструкции var_dump. Все это было автоматически создано командами ремесленников, как указано в документах.
namespace App\Http\Controllers; use App\Tree; use Illuminate\Http\Request; class CategoryController extends Controller { /** * Display the specified resource. * * @param \App\Tree $tree * @return \Illuminate\Http\Response */ public function show(Tree $tree) { // we need to display the children of $tree var_dump($tree); } }
Существует соглашение об именах при привязке модели маршрута.
Попробуйте изменить вызов для этого:
public function show(Tree $category) { var_dump($category); }
Обновление: я посмотрел в источнике, и вы также можете изменить имя параметра в объявлении Route ресурса:
Route::resource('categories', 'CategoryController', ['parameters'=>['categories'=>'tree']]);
И используйте переменную $ tree в вызове действия
public function show(Tree $tree)