1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
   | <?php
namespace Application\Factory;
use Zend\ServiceManager\AbstractFactoryInterface,
    Zend\ServiceManager\ServiceLocatorInterface,
    Zend\Db\TableGateway\TableGateway,
    Zend\Db\ResultSet\ResultSet;
 
class TableGatewayFactory implements AbstractFactoryInterface
{
    const TABLE_PREFIX = 'my_';
    const TABLE_GATEWAY_SUFFIX = 'tablegateway';
 
    public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
    {
        return strpos($name, self::TABLE_GATEWAY_SUFFIX) !== false;
    }
 
    public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
    {
        $tableName = $this->getTableNameFromServiceName($name);
        $modelClassName = $this->getModelClassNameFromTableName($tableName);
        $prefixedTableName = self::TABLE_PREFIX . $tableName;
        return $this->createTableGateway($serviceLocator, $prefixedTableName, $modelClassName);
    }
 
    protected function getTableNameFromServiceName($serviceName)
    {
        $suffixPos = strpos($serviceName, self::TABLE_GATEWAY_SUFFIX);
        $tableName = substr($serviceName, 0, $suffixPos);
        return $tableName;
    }
 
    protected function getModelClassNameFromTableName($tableName)
    {
        $modelClassName = ucfirst($tableName) . 'Model';
        return $modelClassName;
    }
 
    protected function createTableGateway(ServiceLocatorInterface $serviceLocator, $tableName, $modelClassName)
    {
        $dbAdapter = $serviceLocator->get('Zend\Db\Adapter\Adapter');
        $model = $serviceLocator->get($modelClassName);
        $resultSetPrototype = new ResultSet();
        $resultSetPrototype->setArrayObjectPrototype($model);
        return new TableGateway($tableName, $dbAdapter, null, $resultSetPrototype);
    }
} | 
Partager