1

我有一个类似 mvc 的基本框架,我想使用 pimple 进行依赖注入,但我不知道如何在框架内使用它。这是我的应用程序结构。

x-framework
  - config
  - app
      controller
         homeController.php
  - core
  - vendor
     pimple
       lib
         pimple.php
  - public

现在,homeController.php我想使用 Pimple,但实际上并没有new Pimple像这个例子中看到的那样做。

use vendor\pimple; 

class homeController
{
 function index(){
  $app = new Pimple();
  $app['orm'] = $app->share({ return new vendor\orm; });

  $orm = $app['orm'];


  $orm->table('foo'); 
  $orm->findFirst(['name'=>'john']);
}
}

从这个例子中可以看出,在每个控制器上初始化 pimple 类将是一项非常繁琐的任务。这是如何正确完成的?

4

2 回答 2

4

尽管抽象类的原理仍然很有趣,但我的回答并不相关。现在:

我想使用 Pimple,但实际上并没有像这个例子中看到的那样做新的 Pimple。

在某些时候,如果你想使用它,你必须实例化一个对象。

Pimple使用容器来存储和检索服务和参数

$container = new \Pimple\Container();
// define some services
$container['session_storage'] = function ($c) {
    return new SessionStorage('SESSION_ID');
};

文档中的这个例子定义了一个匿名函数,它返回一个会话存储对象

整合一个容器

可以使用依赖注入模式使 Pimple 或任何容器可用。

要么将其作为参数传递给索引

function index(\Pimple $app){

或将其传递给homeController的构造函数

function __construct(\Pimple $app){
  $this->app = $app;

然后将其用作属性或变量

$orm = $app['orm']; // through index() parameters
$orm = $this->app['orm']; // through constructor

抽象类允许您为每个扩展类定义一个方法,或强制每个扩展类定义一个方法。

在这里,我们为每个扩展类定义一个构造函数,对 Pimple 类进行类型提示,以便 php 确保您的控制器接收到一个真正的 pimple 对象

abstract class Pimpleized {
  function __construct(\Pimple $pimple) {
    $this->app = $pimple;
  }
}

然后你的控制器

class homeController extends Pimpleized {
  function foo() {
    $this->app->accessSomePimpleMethod();
  }
}

这样,您只需创建Pimple一次对象,然后将其传递给您的控制器:

$pimp = new Pimple();
$controller = new homeController($pimp);
于 2014-11-19T21:19:30.137 回答
-2

只需用 pimple 扩展 HomeController 类

class HomeController extends Pimple {
  public function __construct() {
    $this['orm.class']= 'vendor\orm'; 
    $this['orm'] = $this->share(function($c){ return new $c['orm.class']; });
  }
}

//and use it directly just after instanciation
$controller = new HomeController();
// you can modify parameters if you need
$controller['orm.class'] = 'myothervendor\orm';
//And get class
$orm = $controller['orm'];
$orm->table('foo'); 
$orm->findFirst(['name'=>'john']);

我希望这是你想要的:) 干杯

于 2014-11-16T23:50:51.583 回答