Laravel鼓勵依賴注入。由於我在我的項目中使用laravel,我想我會嘗試使用這種方法。構造函數注入vs方法注入
我正在利用Laravel的服務容器type hinting my dependencies and letting it resolve them。我有四個控制器。所有這些擴展名爲GlobalController的基類。我也有兩個模型。所有這些擴展名爲GlobalModel的基類。
我的第一次嘗試是(有點)使用方法注入。 GlobalController如下所示:
namespace App\Http\Controllers;
use Illuminate\Http\Request;;
use App\Models\GlobalModel;
class GlobalController extends Controller
{
public function __construct()
{
$this->middleware(['authenticate', 'token']);
}
// functions that handle normal http requests and ajax requests
}
從GlobalController擴展的控制器之一稱爲UserController。它的一些功能是:
- 指標 - 顯示所有數據
- 編輯 - 顯示編輯表單
- 更新 - 更新數據庫
編輯和更新使用route-model-binding。
namespace App\Http\Controllers;
use Illuminate\Http\Request;;
use App\Models\User;
class UserController extends GlobalController
{
public function index(User $user)
{
$users = $user->all();
return view('pages/view_users')->with('users', $users);
}
public function edit(User $user)
{
return view('pages/edit_user')->with('user', $user);
}
public function update(Request $request, User $user)
{
$data = $request->all();
if ($user->validate($data))
{
$user->update($data);
return $this->successResponse($request, 'users', 'Successfully edited user');
}
return $this->failedResponse($request, $user);
}
// other functions
}
雖然這工作正常,請求和用戶注入很多次。如果必須更改Request實現(例如),我將不得不手動更改許多函數來鍵入提示該特定的Request對象。一點都不好。由於它們通常在大多數函數中調用,所以我嘗試了構造函數注入。
下面是GlobalController使用構造器注入:
namespace App\Http\Controllers;
use Illuminate\Http\Request;;;
use App\Models\GlobalModel;
class GlobalController extends Controller
{
protected $request;
protected $model; // use polymorphism
public function __construct(Request $request, GlobalModel $model)
{
$this->request = $request;
$this->model = $model;
$this->middleware(['authenticate', 'token']);
}
// functions that handle normal http requests and ajax requests
}
,這裏是UserController中使用含有相同功能的構造器注入:
namespace App\Http\Controllers;
use Illuminate\Http\Request;;
use App\Models\User;
class UserController extends GlobalController
{
public function __construct(Request $request, User $user) // use polymorphism
{
parent::__construct($request, $user);
}
public function index()
{
$users = $this->model->all();
return view('pages/view_users')->with('users', $users);
}
public function edit(int $id)
{
$this->model = $this->model->find($id);
return view('pages/edit_user')->with('user', $this->model);
}
public function update(int $id)
{
$this->model = $this->model->find($id);
$data = $this->request->all();
if ($this->model->validate($data))
{
$this->model->update($data);
return $this->successResponse('users', 'Successfully edited user');
}
return $this->failedResponse();
}
// other functions
}
現在,我不能把我的手指上,但我認爲這個實現看起來不正確。它變得不太可讀。 $ model和$ this的使用使代碼更加噁心。
我很困惑。我明白我可以從依賴注入中獲得好處,但我確定我的方法注入和構造函數注入的實現是非常錯誤的。我應該選擇什麼樣的實施?或者我應該從這兩個中選擇一個呢?
「爲什麼要在索引函數中注入用戶模型?」)。「 - 索引函數獲取所有數據到視圖。我需要$ user來做$ user-> all()。這不好嗎? – morbidCode
或只需調用User :: all()。如果您想要獲取所有用戶,則不需要特定的用戶實例。或者如果您覺得這對您更好,請使用UserRepository。 –
啊,你是對的。我可以使用外牆!但是,門面不做同樣的事情?你的意思是說,在全部調用時,Facade不會創建新的User實例嗎?我想我只是想盡量避免立面。 – morbidCode