欢迎来到 Laravel 的神奇世界。这些依赖注入的基本思想是,根据您如何定义路由和控制器,Laravel 可以自动解析 URL、识别这些 URL 中的 ID,并从数据库中获取对象。
我的问题是我不明白 $user 是从哪里来的。
您应该阅读服务容器文档,这样可以更好地了解路由定义如何转换为带参数的 URL,使用以下命令:
php artisan route:list
在我的一个项目中,这将导致以下输出:
+--------+-----------+----------------------------+--------------------+-------------------------------------------------+--------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+-----------+----------------------------+--------------------+-------------------------------------------------+--------------+
| | GET|HEAD | / | | Closure | web |
| | GET|HEAD | api/user | | Closure | api,auth:api |
| | GET|HEAD | categories | categories.index | App\Http\Controllers\CategoryController@index | web |
| | POST | categories | categories.store | App\Http\Controllers\CategoryController@store | web |
| | GET|HEAD | categories/create | categories.create | App\Http\Controllers\CategoryController@create | web |
| | GET|HEAD | categories/{category} | categories.show | App\Http\Controllers\CategoryController@show | web |
| | PUT|PATCH | categories/{category} | categories.update | App\Http\Controllers\CategoryController@update | web |
| | DELETE | categories/{category} | categories.destroy | App\Http\Controllers\CategoryController@destroy | web |
| | GET|HEAD | categories/{category}/edit | categories.edit | App\Http\Controllers\CategoryController@edit | web |
| | GET|HEAD | products | products.index | App\Http\Controllers\ProductController@index | web |
| | POST | products | products.store | App\Http\Controllers\ProductController@store | web |
| | GET|HEAD | products/create | products.create | App\Http\Controllers\ProductController@create | web |
| | GET|HEAD | products/{product} | products.show | App\Http\Controllers\ProductController@show | web |
| | PUT|PATCH | products/{product} | products.update | App\Http\Controllers\ProductController@update | web |
| | DELETE | products/{product} | products.destroy | App\Http\Controllers\ProductController@destroy | web |
| | GET|HEAD | products/{product}/edit | products.edit | App\Http\Controllers\ProductController@edit | web |
+--------+-----------+----------------------------+--------------------+-------------------------------------------------+--------------+
所有这些路由及其URI和参数都仅从几个非常简单的路由定义生成。以下是我的路由文件:
$ cat routes/web.php
<?php
Route::get('/', function () {
return view('master');
});
Route::resource('products', 'ProductController');
Route::resource('categories', 'CategoryController');
如果你查看上面路由输出中的URI列表,你会看到在URI中命名为
{category}和
{product}的参数。这些对应于URI中的id/键,Laravel可以识别。Laravel足够聪明,它会查看我的Controller文件,看到各个函数中的类型提示,并检测出我的函数需要注入一个依赖项。例如,Category控制器的show方法如下:
public function show(Tree $category)
{
var_dump($category);
}
我的控制器可能看起来有点不寻常,因为我在类型提示中声明我想要一个Tree类型的对象,但是Laravel足够聪明,能够识别出我确实想要一个Tree类型的Model,所以它解析了url并找到其中的id,并自动从我的db表trees中获取与{category}片段匹配的id记录,并将其注入到我的函数中。
请注意,当我尝试将输入参数命名为$tree而不是$category时,我遇到了一些麻烦。那个线程可能也会在一定程度上帮助回答您的问题。
总之,Laravel做了很多"魔法",希望能使您从手动定义自己的代码和查询以检索所需对象的单调乏味中解放出来。
$user
只是变量的名称。它也可以是$biggieSmalls
或其他任何名称。该变量仅保存UserRepository
的实例。 - DevK