【问题标题】:How to integrate pimple in a custom mvc framework?如何在自定义 mvc 框架中集成 pimple?
【发布时间】:2014-11-11 19:14:16
【问题描述】:

我有一个基本的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 类将是一项非常繁琐的任务。这是如何正确完成的?

【问题讨论】:

  • 你先学习如何制作一个简单的类,然后开始假装你有一个“mvc 框架”。这个问题NOTHING与MVC架构模式有关。
  • 这个答案的第一个链接是一个很好的教程,可以更深入地了解 Pimple stackoverflow.com/a/10685436/576767

标签: php oop model-view-controller inversion-of-control pimple


【解决方案1】:

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

我想使用 Pimple,但没有实际使用新 Pimple,如本例所示。

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

疙瘩使用容器store and retrieve services and parameters

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

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

集成容器

可以使用dependency injection pattern 提供疙瘩或任何容器。

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

function index(\Pimple $app){

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

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

然后将其用作属性或变量

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

abstract classes 允许你为每个扩展类定义一个方法,或者强制每个扩展类定义一个方法。

在这里,我们为每个扩展类定义一个构造函数,对 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);

【讨论】:

  • 我知道疙瘩。但是你没有回答我的问题。因为,您正在扩展 homeController 类,正如您在我的示例中看到的那样,它没有被扩展。我只想拥有与 symphone/laravel 相同的功能……例如。将 http 类声明为 use symfony\components\...\request 然后使用该类而不使用 new 关键字。
  • 你好@Contax!为了增加您获得高质量答案的机会,请在您的问题中添加任何内容,例如不扩展 homeController 的要求。仅仅因为你的例子没有扩展任何东西并不意味着它是一个要求:)另外,请阅读这个答案中的链接,大多数人在使用这个库时使用 namespace 疙瘩中的container
【解决方案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']);

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

【讨论】:

  • 对不起,但这并没有给我所需的答案。首先,您正在扩展 HomeController,所有业务逻辑都在控制器之外完成。所以,我正在寻找的实际上是相反的。
猜你喜欢
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
相关资源
最近更新 更多