Модель Zend Framework 2 для базы данных, отдельная модель для каждой таблицы?
Я просмотрел руководство по 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 ответ
Решение
Вы должны сделать 2 вещи с вашим кодом. Во-первых, правильно реализовать 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
}
}
Надеюсь это поможет