Php 我们可以用类作为依赖注入而不是接口吗
我使用了另一个类作为依赖项注入,这是解决问题的好方法还是我搞乱了OOP方法 Helper.phpPhp 我们可以用类作为依赖注入而不是接口吗,php,oop,dependency-injection,Php,Oop,Dependency Injection,我使用了另一个类作为依赖项注入,这是解决问题的好方法还是我搞乱了OOP方法 Helper.php class Helper { public function getModulePermission($role_id, $module, $type) { // my work code } } use App\Helpers\Helper; class DesignationController extends Controller { prot
class Helper {
public function getModulePermission($role_id, $module, $type) {
// my work code
}
}
use App\Helpers\Helper;
class DesignationController extends Controller {
protected $designation;
protected $helper;
/**
* @param DesignationContract $designation
* @param Helper $helper
*/
public function __construct(DesignationContract $designation, Helper $helper) {
$this->designation = $designation;
$this->helper = $helper;
}
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index(Request $request) {
$permission = $this->helper->getModulePermission($request->id, 'Designation', 'view');
if ($permission) {
return true;
} else {
return view('errors.forbidden');
}
}
DesignationController.php
class Helper {
public function getModulePermission($role_id, $module, $type) {
// my work code
}
}
use App\Helpers\Helper;
class DesignationController extends Controller {
protected $designation;
protected $helper;
/**
* @param DesignationContract $designation
* @param Helper $helper
*/
public function __construct(DesignationContract $designation, Helper $helper) {
$this->designation = $designation;
$this->helper = $helper;
}
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index(Request $request) {
$permission = $this->helper->getModulePermission($request->id, 'Designation', 'view');
if ($permission) {
return true;
} else {
return view('errors.forbidden');
}
}
因此,我有一个名为Helper
的类,可以在每个控制器中访问该类以检查权限,但我认为我把这里的OOP功能搞砸了。像这样工作好吗,或者我需要创建一个接口而不是类
- 这是两个不同的OOP概念。接口强制实现它的类实现接口中声明的函数(称为函数签名)。因此,对于实现同一接口的多个类,您最终将看到多个类实现同一组函数(不管它是否是同一个函数体)
- 第二个概念称为依赖注入,在某些情况下称为控制反转。您可以通过类构造函数或setters注入类,并调用注入类提供的特定函数。在这里,您将拥有由多个类调用的相同函数,这有利于通过使用公共(注入)类减少修改,更容易进行单元测试(您可以轻松地模拟对象),更模块化的代码(如果您想要不同的功能,您可以注入不同的类)
因此,目前的情况已经足够好了,但这完全取决于你想做的事情。
- 这是两个不同的OOP概念。接口强制实现它的类实现接口中声明的函数(称为函数签名)。因此,对于实现同一接口的多个类,您最终将看到多个类实现同一组函数(不管它是否是同一个函数体)
- 第二个概念称为依赖注入,在某些情况下称为控制反转。您可以通过类构造函数或setters注入类,并调用注入类提供的特定函数。在这里,您将拥有由多个类调用的相同函数,这有利于通过使用公共(注入)类减少修改,更容易进行单元测试(您可以轻松地模拟对象),更模块化的代码(如果您想要不同的功能,您可以注入不同的类)
因此,目前的情况已经足够好了,但这完全取决于您想做什么,如上所述。我不喜欢这个名称,它对我来说毫无意义,或者让我知道这个类可以帮助我获得模块的权限。此外,有了这样一个名称,你可以简单地使用另一种方法,比如说Helper::login($id)
,或者你命名它,这将立即打破单一责任原则(laravel控制器无论如何都会这样做)
注入相对来说还可以,也许中间件类更适合这样做。我不喜欢这个名称,它对我来说毫无意义,或者让我觉得这个类可以帮助我获得模块的权限。此外,有了这样一个名称,你可以简单地使用另一种方法,比如说Helper::login($id)
,或者你命名它,这将立即打破单一责任原则(laravel控制器无论如何都会这样做)
注入相对来说还可以,也许中间件类更适合这样做。错了<代码>DI!==国际奥委会
。DI是实现国际奥委会的一种方式。不,这没有错!“在软件工程中,依赖项注入是一种软件设计模式,用于实现控制反转以解决依赖项。”有关更多信息,请参阅:)确切地说,学习阅读您的wiki文章:)IoC是一项原则,是一项坚实的原则。DI是一种技术或模式,可以帮助您实现它。IoC和DI都是模式。DI是IoC的一种专门化,这意味着DI继承了IoC,但有一些细微的变化,使其有所不同。您可能知道,在继承中,子类与父类是同一类型的。@AngelIliikov IoC不是一个原则,而是一个实现,它与SOLID无关。wiki中的术语是相关的,但与依赖项倒置原则不同<代码>DI!==国际奥委会。DI是实现国际奥委会的一种方式。不,这没有错!“在软件工程中,依赖项注入是一种软件设计模式,用于实现控制反转以解决依赖项。”有关更多信息,请参阅:)确切地说,学习阅读您的wiki文章:)IoC是一项原则,是一项坚实的原则。DI是一种技术或模式,可以帮助您实现它。IoC和DI都是模式。DI是IoC的一种专门化,这意味着DI继承了IoC,但有一些细微的变化,使其有所不同。您可能知道,在继承中,子类与父类是同一类型的。@AngelIliikov IoC不是一个原则,而是一个实现,它与SOLID无关。wiki中的术语是相关的,但与依赖项倒置原则不同。是的,我将把这个名称改为PermissionHelper
,但是你能提供一个中间件的例子吗这里是laravel文档:,我认为这是非常不言自明的。是的,我将把这个名称改为PermissionHelper
,但是你能提供一个中间件的例子吗?这里是laravel文档:,我认为这是非常不言自明的。DI对我来说很好。但是,您可能希望了解php编码标准:。你很好,他看起来很好。但是,您可能希望了解php编码标准:。不客气