ZendFramework2 AbstractTableGateway getSql

Я получил проект ZF2 с 2 моделями PosTable/TopTable, которые расширяют AbstractTableGateway.

Я хочу Paginate результаты из этих таблиц, поэтому у меня есть функция Pagination в обоих из них.

это то, что выглядит модель PosTable:

...
class PosTable extends AbstractTableGateway {

public function __construct($adapter) {
    $this->table = 'pos';
    $this->adapter = $adapter;
}
...
public function getPosPaginator($tid) {
    $sql = $this->getSql();
    $select = $sql->select();
    $select->where('tid = '.$tid)->where('deleted = 0')->order('crdate ASC');
    $adapter = new \Zend\Paginator\Adapter\DbSelect($select, $sql);
    $paginator = new \Zend\Paginator\Paginator($adapter);
    return $paginator;
}
...

который отлично работает. но в моем TopTable это выглядит так:

...
class TopTable extends AbstractTableGateway {

public function __construct($adapter) {
    $this->table = 'top';
    $this->adapter = $adapter;
}

public function getTopPaginator($fid) {
    $sql = $this->getSql();
    $select = $sql->select();
    $select->where('fid = '.$fid)->where('deleted = 0');
    $adapter = new \Zend\Paginator\Adapter\DbSelect($select, $sql);
    $paginator = new \Zend\Paginator\Paginator($adapter);
    return $paginator;
}

 ...

мой контроллер выглядит так для PosTable:

  ...       
  public function posAction(){
            ...
    $pos = $this->getPosTable()->getPosPaginator($tid);

    $pos->setCurrentPageNumber($pageid)->setItemCountPerPage(19);
            ... return $pos etc...

тот же контроллер topAction:

    ...
public function topAction(){
            ...
        $top = $this->getTopTable()->getTopPaginator($fid);
    $top->setCurrentPageNumber($pageid)->setItemCountPerPage(20);
            ...return $top etc..

в этом контроллере я также получил следующие функции:

    public function getTopTable(){
    return $this->getServiceLocator()->get('Application\Model\TopTable');
}
public function getPosTable(){
    return $this->getServiceLocator()->get('Application\Model\PosTable');
}

PosTable Pagination работает отлично, но TopTable Pagination не работает. я получаю эту ошибку:

Fatal error: Call to a member function select() on a non-object in ....

похоже на

        $sql = $this->getSql();

не возвращает объект. Как я могу решить эту проблему? один работает, один не имеет никакой очевидной причины.

my module.php выглядит так:

    namespace Application;

class Module
{
    public function getAutoloaderConfig()
    {
        return array('Zend\Loader\StandardAutoloader' =>
                array('namespaces' =>
                        array(__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,),
                ),
        );
    }

    public function getConfig()
    {
        return include __DIR__ . '/config/module.config.php';
    }

    public function getServiceConfig()
    {
        return array(
                'factories' => array(


'Application\Model\TopTable' =>  function($sm) {
                        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                        $table     = new \Application\Model\TopTable($dbAdapter);
                        return $table;
                    },
                    'Application\Model\ForTable' =>  function($sm) {
                        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                        $table     = new \Application\Model\ForTable($dbAdapter);
                        return $table;
                    },
                    'Application\Model\PosTable' =>  function($sm) {
                        $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');


                        $table     = new \Application\Model\PosTable($dbAdapter);
                            return $table;
                        },
                ),
        );
    }
}
0
nl ja de
вы можете опубликовать конфигурацию службы для своего приложения
добавлено автор Raj, источник
да, конечно, я отредактировал мое сообщение соответственно
добавлено автор José Marquez, источник

1 ответы

Хорошо, после прохождения кода TableGateway и вашего расширенного класса я обнаружил, что ваша реализация не вызывает инициализацию, какая настройка объекта sql пытается вызвать родительский табличный шлюз, ниже приведен модифицированный конструктор для ваших PosTable и TopTable

    /* for PosTable */
class PosTable extends TableGateway {

    public function __construct($adapter) {
        parent::__construct('pos', $adapter);
    }
...

    /* for TopTable */
class TopTable extends TableGateway {

    public function __construct($adapter) {
        parent::__construct('top', $adapter);
    }
...
0
добавлено
можете ли вы добавить всю трассировку сообщения об ошибках, можете ли вы идентифицировать что-либо из журнала ошибок
добавлено автор Raj, источник
Извините, я просто заметил, что вы расширили AbstractTableGateway, у которого нет конструктора и инициализации кода, попробуйте расширить его с помощью TableGateway, у которого есть конструктор и код инициализации
добавлено автор Raj, источник
хорошо, что у вас есть решение, я подумал о том, чтобы рекомендовать то же самое раньше, но так как вы расширили базовый класс, было бы целесообразно вызвать родительский код инициализации и использовать SQL-код по умолчанию, я изменил код в своем ответе и IMHO рекомендуется выполнить расширение шлюза таблицы и вызвать его конструктор с именем таблицы по вашему выбору
добавлено автор Raj, источник
Большое спасибо за ваши усилия! но я все еще не могу заставить его работать. Я изменил модель TopTable следующим образом: public function __construct ($ adapter) {parent :: __ construct ('top', $ adapter);/* $ this-> table = 'top'; $ this-> adapter = $ adapter; * /} теперь я получаю эту ошибку: Fatal error: невозможно вызвать конструктор в .....
добавлено автор José Marquez, источник
к сожалению, не отображается трассировка ошибки, только «Неустранимая ошибка: невозможно вызвать конструктор в C: \ ... \ module \ Application \ src \ Application \ Model \ TopTable.php в строке 12" Журнал ошибок PHP имеет только ту же ошибку msg (PHP Fatal error), как указано.
добавлено автор José Marquez, источник
Я думаю, я мог бы решить это с помощью обходного пути: я заменил $ sql = $ this-> getSql (); с $ sql = новым Sql ($ this-> adapter, $ this-> table); поэтому создается новый объект sql, и функция работает так, как ожидалось. спасибо за вашу помощь, идея появилась после проверки конструктора TableGateway, как вы предложили
добавлено автор José Marquez, источник