管理模型实例的最佳方式


Best way to manage instance of a model

我在一个网站上工作,我使用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,答案应该是。现在真正的问题是,我可以在哪里管理模型的实例,我可以/应该在哪里创建它们。我可能会在'Router的某个地方调用控制器,但将每个模型传递给路由器的构造函数会很奇怪。有人能解释一下这个问题吗?我试着找出其他框架是如何做到这一点的,这就是我到目前为止所做的

  1. 他们使用一个ModelKeeper作为模型的工厂,我有点喜欢这个选项,但是这个类的源代码会变得混乱
  2. 模型在静态上下文中提供。要么模型的每个方法都是静态的,要么它们使用某种类型的单例模式。

分享你的经验堆栈溢出?实现这一点的好方法是什么?或者更简短地说,什么地方适合实例化模型,如何实例化?

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对象。如果您希望能够同时连接多个数据库,那么它可能是一个更好的选择。

注:代码没有经过测试,它都是编造的,可能包含语法和逻辑fuc混乱。