用于数据库的Zend框架2模型,每个表的单独模型?

时间:2014-10-21 22:12:41

标签: database model zend-framework2 service-locator tablegateway

我浏览了Zend Framework 2的手册,了解如何创建模型来管理桌面上的操作。是否有必要使用方法exchangeArray()的类?它只是复制数据:/我可以创建一个模型来管理几个表吗?

我创建了两个类:

namespace Application\Model;
use Zend\Db\Adapter\Adapter;
use Zend\Db\Adapter\AdapterAwareInterface;

    abstract class AbstractAdapterAware implements AdapterAwareInterface
    {
        protected $db;

        public function setDbAdapter(Adapter $adapter)
        {
            $this->db = $adapter;
        }
    }

namespace Application\Model;

class ExampleModel extends AbstractAdapterAware
{

    public function fetchAllStudents()
    {

        $result = $this->db->query('select * from Student')->execute();

        return $result;
    }

}

我还在Module.php中添加条目:

'initializers' => [
                'Application\Model\Initializer' => function($instance, \Zend\ServiceManager\ServiceLocatorInterface $serviceLocator){
                    if ($instance instanceof AdapterAwareInterface)
                    {
                        $instance->setDbAdapter($serviceLocator->get('Zend\Db\Adapter\Adapter'));
                    }
                }

            ],
    'invokables' => [
        'ExampleModel' => 'Application\Model\ExampleModel'
    ],

我通过以下方式执行模型中的方法:

$this->getServiceLocator()->get('ExampleModel')->fetchAllStudents();

1 个答案:

答案 0 :(得分:0)

你应该用你的代码做两件事。首先,正确实现AdapterAwareInterface。其次,创建一个初始化程序,将适配器注入模型。请考虑以下代码:

...

'initializers' => [
    function($instance, ServiceLocatorInterface $serviceLocator){
            if ($instance instanceof AdapterAwareInterface) {
                $instance->setDbAdapter($serviceLocator->get('Zend\Db\Adapter\Adapter'));
            }
    }
]

...

abstract class AbstractModel implements AdapterAwareInterface
{
    protected $db;

    public function setDbAdapter(Adapter $adapter)
    {
        $this->db = adapter;
    }
}

...

'invokables' => [
    'ExampleModel' => 'Application\Model\ExampleModel'
]

正如您从上面所看到的,毕竟,您的每个型号都不需要工厂。您可以注册invokables或创建一个Abstract Factory来实例化您的模型。请参阅以下示例:

...

'abstract_factories' => [
    'Application\Model\AbstractFactory'
]

...

class AbstractFactory implements AbstractFactoryInterface
{
    public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
    {
        return class_exists('Application\Model\'.$requestedName);
    }

    public function createServiceWithName(\Zend\ServiceManager\ServiceLocatorInterface $serviceLocator, $name, $requestedName)
    {
        $class = 'Application\Model\'.$requestedName();

        return new $class
    }
}

希望这有帮助