Php 管理模型实例的最佳方法

Php 管理模型实例的最佳方法,php,model-view-controller,oop,Php,Model View Controller,Oop,我在一个网站上工作,我使用CodeIgniter作为我的框架,但我对他们滥用OOP的方式越来越失望。我不喜欢OOP,但当我使用它时,我更喜欢一个像样的实现。所以我决定快速构建一个PHP框架。不管怎样,我一直坚持我的应用程序通常采用的MVC架构,但我想知道什么是将模型传递给控制器和库的好方法。我更愿意向控制器的构造函数提供模型的实例。类似这样的东西 class MyController implements IController //whatever { public MyControl

我在一个网站上工作,我使用CodeIgniter作为我的框架,但我对他们滥用OOP的方式越来越失望。我不喜欢OOP,但当我使用它时,我更喜欢一个像样的实现。所以我决定快速构建一个PHP框架。不管怎样,我一直坚持我的应用程序通常采用的MVC架构,但我想知道什么是将模型传递给控制器和库的好方法。我更愿意向控制器的构造函数提供模型的实例。类似这样的东西

class MyController implements IController //whatever
{
    public MyController(IUrlRouteModel url_route_model, IUserModel user_model)
    {
        //usual assignment
    }

    public some_action()
    {
         UserEntity users = user_model->find_all();
    }
}
我使用的是PHP,但这个示例/问题并不仅仅与PHP直接相关,答案应该是tho。现在真正的问题是,我可以在哪里管理模型的实例,我可以/应该在哪里创建它们。我可能会调用\Router中的某个控制器,但将每个模型传递给路由器的构造函数会很奇怪。有没有人能对这个问题有所帮助。我试图找出其他框架是如何做到这一点的,这就是我到目前为止所做的

  • 他们使用一个ModelKeeper作为模型的某种类型的工厂,我有点喜欢这个选项,但是这个类的源代码会变得混乱
  • 这些模型是在静态上下文中提供的。要么模型的每个方法都是静态的,要么它们使用某种类型的单例模式
  • 分享你的经验堆栈溢出?实现这一点的好方法是什么?或者更简短地说,什么是实例化模型的合适位置,以及如何实例化

    PS 我想模型应该是这样的

    class UserModel implements IUserModel
    {
         public UserModel(DatabaseConnection dbc)
         { /*store for later use*/ }
    }
    

    您应该将
    ModelFactory
    的实例传递给控制器,该实例在控制器内部使用。构造函数中的
    ModelFactory
    类应该需要一个DB连接(很可能是一个
    PDO
    实例)。您可以在引导阶段创建它的实例(可能也是调用
    \Router
    的地方),如果您需要类似的东西,您也可以向工厂提供负责缓存的对象

    API应该是这样的:

    namespace Application;
    
    class FooController
    {
        protected $factory = null;
    
        public function __construct( \Framework\ModelFactory $factory )
        {
            $this->factory = $factory;
        }
    
        public function bar_action( \Framework\Request $request )
        {
            $model = $this->factory->create( 'User' );
            // then pass this model to your view object 
        }
    }
    
    工厂本身看起来有点像这样:

    namespace Framework;
    
    class ModelFactory
    {
        protected $connection = null;    
    
        public function __construct( \PDO $connection )
        {
           $this->connection = $connection;
        }
    
        public function create( $name )
        {
            $name = '\\Persistence\\' . $name; 
            // you probably will want configure this in some way
    
            $model = new $name( $this->connection );
            $model->preconfig(); // .. hell .. maybe you need
            return $model;
        }
    }
    
    您的工厂也可以只接收DB连接的配置,并仅在第一次需要时初始化PDO对象。如果您希望能够处理到多个数据库的连接,那么它也可能是一个更好的选择


    p.S.代码未经测试,它是由所有组件组成的,可能包含语法和逻辑混乱。

    那么您的前端控制器是否实例化了所有模型和其他依赖项?你有前端控制器吗?这取决于上下文。我有前端控制器是的,但我不知道从哪里启动模型。@Pinunegra我害怕这个回答,如果我问了一个无法回答的问题,对不起^静态?单身汉?回到CodeIgniter,而不是重新发明轮子。