管理模型实例的最佳方法

时间:2011-12-01 16:39:31

标签: php model-view-controller oop

我正在网站上工作,我使用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. 模型以静态上下文提供。模型的每个方法都是静态的,或者它们使用某种类型的单例模式。
  3. 分享你的经验堆栈溢出?实现这个的好方法是什么?或者更短,什么是实例化模型的适当位置以及如何?

    PS 我猜模型看起来像这样

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

1 个答案:

答案 0 :(得分:1)

您应该将ModelFactory的实例传递给控制器​​,控制器内部使用该实例。构造函数中的ModelFactory类应该需要数据库连接(最有可能是PDO实例)。你可以在bootstrap阶段创建它的实例(可能也是你的\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;
    }
}

您的工厂也可以只接收数据库连接的配置,并仅在首次需要时初始化PDO对象。如果您希望能够连接到多个数据库,那么它也可能是更好的选择。

P.S。代码没有经过测试,它全部编写完成,可能包含语法和逻辑 fuc 混乱。