問題描述
我是 Laravel 的新手.我已經為我的一個表創建了一個模型、一個資源控制器和一個路由,我修改了模型類以使用特定的表名,但是 Laravel 5.4 注入的模型對象沒有屬性,即使相應的記錄存在于數據庫.這是我采取的步驟.
I'm new to Laravel. I have created a model, a resource controller, and a route for one of my tables, I have modified the model class to use a particular table name, but the model object injected by Laravel 5.4 has no attributes even though a corresponding record exists in the database. Here are the steps I took.
1) 使用工匠創建模型.我運行了這個命令:
1) Create the model with artisan. I ran this command:
php artisan make:model Tree
2) 將 Tree 模型類修改為 instructed 以指定特定表.我必須這樣做,因為我的表被命名為 tree,而不是 Laravel 根據其內部規則假設的樹".
2) Modify the Tree model class as instructed to specify a specific table. I had to do this because my table is named tree, not the "trees" as Laravel would otherwise assume based on its internal rules.
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'tree';
3) 創建一個資源控制器,通過這個命令使用我的模型
3) Create a resource controller that makes use of my model with this command
php artisan make:controller CategoryController --resource --model=Tree
4) 添加資源路由 routes/web.php 以將 Web 服務器路徑映射到控制器:
4) Add a resource route routes/web.php in order to map a web server path onto the controller:
Route::resource('categories', 'CategoryController');
5) 修改 CategoryController 的 show() 方法,以 var_dump 注入的 $tree 對象.它看起來像這樣:
5) Modify the show() method of the CategoryController to var_dump the injected $tree object. It looks like this:
/**
* Display the specified resource.
*
* @param AppTree $tree
* @return IlluminateHttpResponse
*/
public function show(Tree $tree)
{
// we need to display the children of $tree
var_dump($tree);
}
6) 我的表結構遵循 Laravel 文檔指定的所有約定.有一個整數 id 列是無符號的 &自動遞增.我有 created_at 和 updated_at 時間戳.唯一不同的是表名是樹"而不是樹",但這應該包含在我上面所做的更改中:
6) My table structure follows all the conventions specified by Laravel docs. There is an integer id column that is unsigned & auto-incrementing. I have the created_at and updated_at timestamps. The only thing different is that the table name is "tree" and not "trees", but that should be covered with the change I made above:
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 的記錄.
This table contains data. It most definitely has a record with id=1.
7) 我訪問了應該激活我的資源控制器的 show() 方法的 url.我得到的輸出證實這實際上是 CategoryController::show() 方法.http://example.com/categories/1
7) I visit the url which should activate the show() method of my resource controller. The output I get verfies that this is in fact the method CategoryController::show(). http://example.com/categories/1
問題來了.
var_dump($tree) 的輸出沒有屬性.沒有錯誤,但注入的對象有問題.
object(AppTree)#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 注入正??確的對象?
有人問我為什么在我的路線中注入了錯誤的對象.這是在步驟 #3 中自動生成的類的縮寫版本.它清楚地引用了 Tree 類和它期望一個樹對象的代碼提示.除了 var_dump 語句之外,我沒有創建任何這些代碼.它都是按照文檔的指示由工匠命令自動生成的.
Someone asked why I was injecting the wrong object in my route. Here is an abbreviated version of the class that was auto-generated in step #3. It clear references the Tree class and code-hints it is expecting a tree object. I did not create any of this code except the var_dump statement. It was all auto-generated by artisan commands expressly as instructed by the docs.
namespace AppHttpControllers;
use AppTree;
use IlluminateHttpRequest;
class CategoryController extends Controller
{
/**
* Display the specified resource.
*
* @param AppTree $tree
* @return IlluminateHttpResponse
*/
public function show(Tree $tree)
{
// we need to display the children of $tree
var_dump($tree);
}
}
推薦答案
Route Model 綁定有一個命名約定.
There is a naming convention on Route Model binding.
嘗試將操作調用更改為:
Try to change the action call to this:
public function show(Tree $category)
{
var_dump($category);
}
更新:我查看了源代碼,您也可以更改資源路由聲明中的參數名稱:
Update: I looked in the source and you can also change the parameters name in resource Route declaration:
Route::resource('categories', 'CategoryController', ['parameters'=>['categories'=>'tree']]);
并在動作調用中使用 $tree 變量
And use the $tree variable in action call
public function show(Tree $tree)
這篇關于自動注入的 Laravel 模型沒有屬性的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!