【问题标题】:how to use more model in MVC如何在 MVC 中使用更多模型
【发布时间】:2012-04-25 04:49:17
【问题描述】:

据我所知,在 MVC 中,模型总是连接到数据库,例如:

class a extends Model {
...
}


class Model {
    public function __construct() {
        $db = new database;
        $db->connect('localhost','root','','example');
    }
}

但是,如果我有更多的模型总是运行以获取数据库中的配置。因此,当运行网站时将使用 2 个模型。 这相当于 2 连接到数据库,所以当有很多人访问我的网站时它对系统有影响(200 请求 = 400 连接到数据库)

【问题讨论】:

  • 模型不总是连接到数据库...我想你误解了 MVC 的概念。
  • 它实际上是在初始化模型的每个新类扩展时进行的。
  • @Hast ,那你也误解了MVC

标签: php model-view-controller model


【解决方案1】:

关于型号

实际上,模型首先不在课堂上。 模型是一个层,其中包含大量对象。模型层中的两个主要类实例组负责以下职责之一:

  • 域业务逻辑和规则:由域对象实现(1)(2)
  • 数据访问和持久化:通常实现为数据映射器(3)

在代码中,它看起来类似于:

$user = $factory->buildObject('user');
$mapper = $factory->buildMapper('user');
$user->setId( 42 );
$mapper->fetch($user);
$now = time();
if ( $user->hasStatus( User::STATUS_LOCKED ) && !$user->isBanned( $now ) )
{
   $user->setStatus( User::STATUS_AVAILABLE );
}
$mapper->commit($user);

您可能会注意到,业务对象在任何时候都不会真正与数据库进行交互。或者甚至意识到这一点。信息可能存储在纯文本文件中,或通过远程 REST API 或某些 noSQL 事物存储。域对象不关心这一点。所有存储都由映射器处理。控制发票制作的业务逻辑不依赖于发票信息的来源。

关于连接

由于您使用的是 OOP,因此您可以利用它。考虑这个例子:

class Test
{
    protected $ob = null;
    public function __construct( $ob )
    {
        $this->ob = $ob;
    }
    public function get() 
    {
        var_dump( $this->ob->data );
    }
    public function set( $val )
    {
        $this->ob->data = $val;
    }
}

$object = new stdClass;
$foo = new Test($object);
$bar = new Test($object);

$foo->set('lorem ipsum');
$bar->get();

查看执行:http://codepad.org/coCibwyk

您应该注意到,Test 类的两个实例共享相同 实例。在您的代码中,您可以对PDO 的实例执行相同的操作。

如果你使用类似于第一个代码被剪断的东西,那么:

class Factory
{
    protected $connection = null;
    public function __construct( $connection )
    {
        $this->connection = $connection;
    }
    public function buildMapper( $className )
    {
        $className = $className . 'Mapper';
        $instance = new $className ;
        $instance->useConnection( $this->connection );
        return $instance;
    }
    // ... some other code 
}

因此,当您使用 $mapper = $factory->buildMapper('user'); 时,该方法会创建一个对象,该对象已经建立了连接。

【讨论】:

    猜你喜欢
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多