【发布时间】:2017-10-29 04:37:10
【问题描述】:
Laravel 鼓励依赖注入。由于我在我的项目中使用 laravel,我想我会尝试使用这种方法。
我正在通过type hinting my dependencies and letting it resolve them 使用 Laravel 的服务容器。我有四个控制器。它们都扩展了一个名为 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 和 User 被多次注入。如果我必须更改 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 的使用让代码更加恶心。
我很困惑。我了解我可以从依赖注入中获得的好处,但我确信我的方法注入和构造函数注入的实现是非常错误的。我应该选择什么实现?或者我应该从这两个中选择任何一个?
【问题讨论】:
标签: php laravel design-patterns laravel-5 dependency-injection