簡體   English   中英

Laravel 控制器依賴注入

[英]Laravel Controller Dependency Injection

我正在嘗試在 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()所以我對用戶實例來自哪里感到困惑。

在 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中進行依賴注入,以使我的控制器和模型盡可能的苗條。 目標是擁有存儲庫來處理歸因於某些模型的數據。

為此我試圖從文檔效仿這里和受歡迎的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM