[英]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.