在 SlimPHP 中访问其他 类 的函数
Access functions of other classes in SlimPHP
我必须在我的 Slim PHP 框架中使用不同的 类,命名为 OrderController
和 AddressController
。我想在 OrderController
中访问 AddressController
的某些功能以减少代码冗余。
但找不到方法,我知道如何在纯 PHP 设置中进行操作,但如何在 Slim PHP[= 中进行操作34=] 框架?
PHP方法如下:
class A {
private $xxx;
public function __construct() {
$this->xxx = 'Hello';
}
public function getXXX() {
return $this->xxx;
}
}
class B {
private $a;
public function __construct(A $a) {
$this->a = $a;
}
function getXXXOfA() {
return $this->a->getXXX();
}
}
$a = new A();
$b = new B($a);
$b->getXXXOfA();
如何在Slim中实现这种依赖注入?
注意:我正在使用 Slim PHP v3
如果您的 AddressController
和 OrderController
具有相同的父级 class,则将这些方法移至父级:
class AddressContoller extends Controller {
public function test() {
$this->methodFromParent();
}
}
如果不是,则创建那个 class 的新对象并调用方法。方法必须是public
class AddressContoller extends Controller {
public function test() {
$order = new OrderController();
$order->publicMethodInOrderClass();
}
}
如果您的 OrderController
想从 AccessController
调用方法 foo
,您应该考虑将 foo
移到其他地方。这是错误 SRP
的一个很好的指标
有两种可能
foo
属于 to/is 与 每个 控制器相关并且与控制有关:只需将其移动到父级 class.
foo
只与几个 classes 相关:将其移至 class,它属于。这可能是一个助手 class、某个域模型 class 或其他东西。也许你必须引入一个新的 class 才能做到这一点。
经过大量研究,我终于找到了解决方案!将它张贴在这里,以便将来有人可以从中获得帮助:
class FirstController
{
protected $container;
protected $db;
protected $view;
protected $second;
// constructor receives container instance
public function __construct(\Interop\Container\ContainerInterface $container) {
$this->second = new SecondController($container);
$this->container = $container;
$this->db = $this->container->db;
$this->view = $this->container->view;
}
public function LocalFunction(){
$this->second->otherFunction();
//call the functions in other classes as above
}
}
想到了 2 个解决方案:
-1-
您也可以尝试在单独的特征中拥有共同的功能。
-2-
我不会做
新的第二控制器($容器)
在 FirstController 的构造函数中,除非您在每次点击控制器时都需要它。
我喜欢延迟加载,所以它只在需要的时候加载。
我必须在我的 Slim PHP 框架中使用不同的 类,命名为 OrderController
和 AddressController
。我想在 OrderController
中访问 AddressController
的某些功能以减少代码冗余。
但找不到方法,我知道如何在纯 PHP 设置中进行操作,但如何在 Slim PHP[= 中进行操作34=] 框架?
PHP方法如下:
class A {
private $xxx;
public function __construct() {
$this->xxx = 'Hello';
}
public function getXXX() {
return $this->xxx;
}
}
class B {
private $a;
public function __construct(A $a) {
$this->a = $a;
}
function getXXXOfA() {
return $this->a->getXXX();
}
}
$a = new A();
$b = new B($a);
$b->getXXXOfA();
如何在Slim中实现这种依赖注入?
注意:我正在使用 Slim PHP v3
如果您的 AddressController
和 OrderController
具有相同的父级 class,则将这些方法移至父级:
class AddressContoller extends Controller {
public function test() {
$this->methodFromParent();
}
}
如果不是,则创建那个 class 的新对象并调用方法。方法必须是public
class AddressContoller extends Controller {
public function test() {
$order = new OrderController();
$order->publicMethodInOrderClass();
}
}
如果您的 OrderController
想从 AccessController
调用方法 foo
,您应该考虑将 foo
移到其他地方。这是错误 SRP
有两种可能
foo
属于 to/is 与 每个 控制器相关并且与控制有关:只需将其移动到父级 class.foo
只与几个 classes 相关:将其移至 class,它属于。这可能是一个助手 class、某个域模型 class 或其他东西。也许你必须引入一个新的 class 才能做到这一点。
经过大量研究,我终于找到了解决方案!将它张贴在这里,以便将来有人可以从中获得帮助:
class FirstController
{
protected $container;
protected $db;
protected $view;
protected $second;
// constructor receives container instance
public function __construct(\Interop\Container\ContainerInterface $container) {
$this->second = new SecondController($container);
$this->container = $container;
$this->db = $this->container->db;
$this->view = $this->container->view;
}
public function LocalFunction(){
$this->second->otherFunction();
//call the functions in other classes as above
}
}
想到了 2 个解决方案:
-1-
您也可以尝试在单独的特征中拥有共同的功能。
-2-
我不会做 新的第二控制器($容器) 在 FirstController 的构造函数中,除非您在每次点击控制器时都需要它。 我喜欢延迟加载,所以它只在需要的时候加载。