2011-12-01 70 views
2

我正在一个网站上工作,我使用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*/ } 
} 
+0

那么你的前端控制器是如何实例化所有模型和其他依赖的?你有前端控制器吗? – dqhendricks

+1

这真的取决于上下文。 –

+0

我确实有一个前端控制器,但我不知道在哪里启动模型。 – TFennis

回答

1

您应该传递的ModelFactory一个实例给控制器,该控制器是(一个或多个)的内部使用。构造函数中的ModelFactory类应该需要数据库连接(很可能是 - 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; 
    } 
} 

你的工厂也可以只接收配置的数据库连接和初始化只有PDO对象当第一次需要时。如果您希望能够连接多个数据库,它也可能是更好的选择。

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