【问题标题】:Best way to manage instance of a model管理模型实例的最佳方式
【发布时间】:2012-01-10 19:25:36
【问题描述】:

我正在开发一个网站,我使用 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*/ }
}

【问题讨论】:

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

标签: php model-view-controller oop


【解决方案1】:

您应该将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混乱。

【讨论】:

    猜你喜欢
    • 2011-03-23
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 2012-02-22
    • 2016-05-17
    • 2010-11-28
    相关资源
    最近更新 更多