【发布时间】:2016-06-22 10:46:38
【问题描述】:
在查看 Laravel 源码时,我注意到很多这样的东西:
控制器类:
class Controller extends BaseController
{
use AuthorizesRequests, AuthorizesResources, DispatchesJobs, ValidatesRequests;
}
它的组成特征之一:
trait AuthorizesRequests {
/**
* Authorize a given action against a set of arguments.
*
* @param mixed $ability
* @param mixed|array $arguments
*
* @return \Illuminate\Auth\Access\Response
*
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function authorize($ability, $arguments = []) {
list($ability, $arguments) = $this->parseAbilityAndArguments($ability, $arguments);
return app(Gate::class)->authorize($ability, $arguments);
}
// ...
}
我对此有几个问题:
- 这种模式(将可重用功能抽象为特征)有名称吗?
- 这种模式在其他项目中使用效果很好吗?
- 如果特征需要依赖关系,是否有最佳实践方法来注入它们,而不是使用服务定位器(如
app(),在这种情况下)?
我正在考虑在我的代码中使用这种方法在我的几个类之间共享一些通用功能 - 我正在考虑创建一个 ChecksBarcodes 特征,它将与股票信息存储库一起使用,并共享该特征在几个类似但不相关的产品管理流程类之间,都需要检查条形码。
【问题讨论】:
标签: laravel design-patterns dependency-injection laravel-5