簡體   English   中英

Laravel構造函數和方法注入

[英]Laravel constructor and method injection

我在構造器和控制器中的方法上設置注入時遇到問題。

我需要實現的是能夠設置全局控制器變量,而無需在控制器方法上注入該變量。

從下面的路線;

Route::group(['prefix' => 'test/{five}'], function(){
    Route::get('/index/{admin}', 'TestController@index');
});

我希望構造函數可以接收到五個,而該方法可以使用admin。 下面是我的控制器;

class TestController extends Controller
{
    private $five;

    public function __construct(PrimaryFive $five, Request $request)
    {
        $this->five = $five;
    }

    public function index(Admin $admin, Request $request)
    {
        dd($request->segments(), $admin);
        return 'We are here: ';
    }
...

運行上面要使用的上述命令時,在index方法上出現錯誤:

出現消息“傳遞給App \\ Http \\ Controllers \\ TestController :: index()的參數1必須是App \\ Models \\ Admin的實例,給出了字符串”引發的Symfony \\ Component \\ Debug \\ Exception \\ FatalThrowableError

下面的作品,但我不需要在該方法的PrimaryFive注入。

class TestController extends Controller
{
    private $five;

    public function __construct(PrimaryFive $five, Request $request)
    {
        $this->five = $five;
    }

    public function index(PrimaryFive $five, Admin $admin, Request $request)
    {
        dd($request->segments(), $five, $admin);
        return 'We are here: ';
    }
...

有沒有一種方法可以設置模型的構造函數注入(有效)並設置方法注入,而不必注入構造函數中的模型集?

您可以執行此操作的一種方法是使用控制器中間件

public function __construct()
{
    $this->middleware(function (Request $request, $next) {

        $this->five = PrimaryFive::findOrFail($request->route('five'));

        $request->route()->forgetParameter('five');

        return $next($request);
    });
}

上面假設PrimaryFive是Eloquent模型。

這將意味着為控制器設置了$this->five ,但是,由於我們使用的是forgetParameter() ,它將不再傳遞給您的控制器方法。


如果您專門使用Route :: model()或Route :: bind()來解析您的five分段,則可以直接從$request->route('five')檢索實例,即:

$this->five = $request->route('five');

該錯誤是因為您無法通過路徑傳遞模型。 它應該像/index/abc/index/123

您可以如下使用索引函數

public function index($admin,Request $request){}

這一定會對您有所幫助。

Route::group(['prefix' => 'test/{five}'], function () {
    Route::get('/index/{admin}', function ($five, $admin) {
        $app = app();
        $ctr = $app->make('\App\Http\Controllers\TestController');
        return $ctr->callAction("index", [$admin]);
    });
});

從路由調用控制器的另一種方法。 您可以控制要從路由傳遞到控制器的內容

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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