dongqie2010 2013-06-27 07:07
浏览 13
已采纳

Zend Framework 2在Model中实例化表

I have a Model, called Admin with custom functions.

<?php

namespace ZendCustom\Model;

use Zend\Db\TableGateway\TableGateway;
use Zend\Db\Exception\ErrorException;

abstract class Admin {

/**
 * @var TableGateway
 */
protected $_table;

/**
 * @var array 
 */
protected $data;

/**
 * @var bool
 */
protected $loaded = false;

/**
 * Constructor
 * 
 * @param array $data
 * @throws Exception
 */
public function __construct(array $data = array()) {
    if (!is_null($this->_table)) {
        if (!empty($data)) {
            $this->loaded = !empty($this->data);
        }
    } else {
        die('Please, specify table for ' . __CLASS__);
    }
}
}

And docs says to describe table, we should use:

// module/Album/src/Album/Controller/AlbumController.php:
    public function getAlbumTable()
    {
        if (!$this->albumTable) {
            $sm = $this->getServiceLocator();
            $this->albumTable = $sm->get('Album\Model\AlbumTable');
        }
        return $this->albumTable;
    }

http://framework.zend.com/manual/2.0/en/user-guide/database-and-models.html

How could I set my Model Table inside Admin Model, without Controller?

  • 写回答

1条回答 默认 最新

  • douwan7382 2013-06-27 08:15
    关注

    You can just inject it when it's instantiated via the Service Manager.

    Module.php

    /**
     * Get the service Config
     * 
     * @return array 
     */
    public function getServiceConfig()
    {
        return array(
            'factories' => array(
                 'ZendCustom\Model\AdminSubclass' =>  function($sm) {
                    // obviously you will need to extend your Admin class
                    // as it's abstract and cant be instantiated directly
                    $model= new \ZendCustom\Model\AdminSublcass();
                    $model->setAlbumTable($sm->get('Album\Model\AlbumTable'));
                    return $model;
                },
            )
        )
    }
    

    Admin.php

    abstract class Admin {
    
        protected $_albumTable;
    
        /**
         * @param  \Album\Model\AlbumTable
         */
        public function setAlbumTable($ablum)
        {
            this->_albumTable = $ablum;
        }
    }
    

    Now if you want your Admin class (or a sublcass of it rather..) then you use the Service Manage to get the instance, and it will inject the Table Object you wanted..

    Inside a controller you could do this:

    $admin = $this->getServiceLocator()->get('ZendCustom\Model\AdminSubclass');
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?