Php 如何在自定义mvc框架中集成pimple?
我有一个基本的类似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,但没有实际
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);