Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在自定义mvc框架中集成pimple?_Php_Oop_Model View Controller_Inversion Of Control_Pimple - Fatal编程技术网

Php 如何在自定义mvc框架中集成pimple?

Php 如何在自定义mvc框架中集成pimple?,php,oop,model-view-controller,inversion-of-control,pimple,Php,Oop,Model View Controller,Inversion Of Control,Pimple,我有一个基本的类似mvc的框架,我想使用pimple进行依赖注入,但我不知道如何在框架内使用它。这是我的应用程序结构 x-framework - config - app controller homeController.php - core - vendor pimple lib pimple.php - public 现在,在homeController.php中,我想使用Pimple,但没有实际

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

x-framework
  - config
  - app
      controller
         homeController.php
  - core
  - vendor
     pimple
       lib
         pimple.php
  - public
现在,在
homeController.php
中,我想使用Pimple,但没有实际使用
newpimple
,如本例所示

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类将是一项非常繁琐的任务。如何正确地做到这一点

只需使用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']);

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

尽管抽象类的原理仍然很有趣,但我的答案与此无关。现在:

我想使用粉刺,但实际上没有做新的粉刺,如本例所示

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

粉刺使用容器:

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

集成容器 丘疹或任何容器都可以使用

或者将其作为参数传递给索引

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);

对不起,这并没有给我所需要的答案。首先扩展HomeController,所有业务逻辑都在控制器外部完成。所以,我想要的实际上是相反的。在开始假装你有一个“mvc框架”之前,先学习如何创建一个简单的类,怎么样。这个问题与MVC架构模式无关。这个答案中的第一个链接是一个很好的教程,可以让你更深入地理解我所知道的关于Pimple的知识。但你没有回答我的问题。因为,您正在扩展homeController类,正如您在我的示例中看到的,它没有被扩展。我只想拥有与symphone/laravel相同的功能。。。例如将http类声明为
use symfony\components\…\request
,然后在不使用新关键字的情况下使用该类。Hello@Contax!为了增加您获得高质量答案的机会,请在问题中添加任何内容,如不扩展homeController的要求。仅仅因为您的示例没有扩展任何内容并不意味着它是一个要求:)另外,请阅读此答案中的链接,大多数人在使用此库时使用命名空间pimple中的
容器
$pimp = new Pimple();
$controller = new homeController($pimp);