[英]Laravel Controller Dependency Injection
我正在嘗試在 Laravel 中進行依賴注入,以使我的控制器和模型盡可能地纖薄。 目標是擁有存儲庫來處理歸因於某些模型的數據的獲取。
但我不明白$user
來自哪里。
所以看看樣板文件,我們有兩個文件:
ProfileController
在這里
摘錄如下:
use App\Repositories\Frontend\Access\User\UserRepository;
/**
* Class ProfileController.
*/
class ProfileController extends Controller
{
/**
* @var UserRepository
*/
protected $user;
/**
* ProfileController constructor.
*
* @param UserRepository $user
*/
public function __construct(UserRepository $user)
{
$this->user = $user;
}
這看起來很像文檔中提到的依賴注入,它是這樣的:
class UserController extends Controller {
/**
* The user repository instance.
*/
protected $users;
/**
* Create a new controller instance.
*
* @param UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
$this->users = $users;
}
我的問題是我不明白$user
來自哪里。
在UserRepository 中,沒有將 $user 定義為類本身的參數。 代碼中沒有任何Auth::user()
所以我對用戶實例來自哪里感到困惑。
在 Laravel 中,依賴注入由Container處理。 我正在簡化,但您可以將容器視為對象的來源。 如果有單例,則將其存儲在容器中。 否則容器知道如何為您實例化對象。 每當 Laravel 調用一個方法(例如在控制器中)或為您實例化一個對象時,它都會檢查構造函數並查找類型提示的依賴項。 如果它看到一個依賴項,它知道如何檢索或創建它會這樣做並為您傳遞它。
所以當 Laravel 實例化控制器時,它會查看構造函數
public function __construct(UserRepository $user)
{
$this->user = $user;
}
容器使用類型提示來查看它需要一個UserRepository
以便為您實例化一個新的。 它也遞歸地執行此操作。 因此,當它創建一個新的UserRepository
時,它會查看該構造函數並發現它需要一個RoleRepository
因此它也會實例化它。
TLDR:服務容器會檢查您的依賴項並為您實例化它們。
歡迎來到 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} 。 這些對應於 Laravel 識別的 URI 中的 ids/keys。 Laravel 足夠“聰明”,可以查看我的控制器文件,查看各種函數中的類型提示,並檢測到我的函數期望注入依賴項。
例如,類別控制器的show方法如下所示:
public function show(Tree $category)
{
var_dump($category);
}
我的控制器可能看起來有點不尋常,因為我的類型暗示我想要一個 Tree 類型的對象,但 Laravel 足夠聰明,可以識別出我實際上想要一個 Tree 類型的模型,所以它解析出 url 並找到id 並自動獲取我的數據庫表樹中的記錄,id 與我的 url 的 {category} 片段匹配,並將其注入我的函數中。
請注意,當我嘗試將輸入參數命名為 $tree 而不是 $category 時遇到了一些麻煩。 其他線程也可能有助於回答您的問題。
最重要的是,Laravel 做了很多“魔法”,希望讓您免於手動定義自己的代碼和查詢以檢索所需對象的繁瑣。
我正在嘗試在Laravel中進行依賴注入,以使我的控制器和模型盡可能的苗條。 目標是擁有存儲庫來處理歸因於某些模型的數據。
但是我不知道$user
的來源。
因此,查看樣板文件,我們有兩個文件:
這里的ProfileController
摘錄如下:
use App\Repositories\Frontend\Access\User\UserRepository;
/**
* Class ProfileController.
*/
class ProfileController extends Controller
{
/**
* @var UserRepository
*/
protected $user;
/**
* ProfileController constructor.
*
* @param UserRepository $user
*/
public function __construct(UserRepository $user)
{
$this->user = $user;
}
這看起來很像文檔中提到的依賴項注入,即:
class UserController extends Controller {
/**
* The user repository instance.
*/
protected $users;
/**
* Create a new controller instance.
*
* @param UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
$this->users = $users;
}
我的問題是我不知道$user
的來源。
在UserRepository中,沒有$ user定義為類本身的參數。 代碼中沒有任何Auth::user()
所以我對於用戶實例的來源感到困惑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.