2015-06-13 2 views
2

Я делаю какой-то сайт на рынке с Zend Framework 2. У дома появился слайдер, показывающий все продукты (реализованные с ключевыми кадрами CSS3) и некоторый текст. Оба скользящих изображения и текст считываются из базы данных MySQL. Но в результате я не получаю никаких выходных данных, но также и ошибок. Ползунок получает столько изображений, сколько строк базы данных, но до сих пор не повторяется контент; плюс, если я пытаюсь изменить вещи (например, учетные данные db или функции getter в модели), он выдает ошибки, как ожидалось, поэтому он четко читает db, и проблема в другом месте.Zend Framework 2 - Отображение содержимого базы данных

Db для текста имеет 3 поля: идентификаторов имени текста

Модели для текста (home.php, есть более HomeInterface.php определить все функции)

<?php  
namespace Site\Model;  

class Home implements HomeInterface { 
    protected $id; 
    protected $name; 
    protected $text; 


    public function getId() { 
     return $this->id; 
    } 

    public function getName() { 
     return $this->name; 
    } 

    public function getText() { 
     return $this->text; 
    } 
} 
?> 

Mapper для текста

<?php  
namespace Site\Mapper;  

use Site\Model\HomeInterface;  
use Zend\Db\Adapter\AdapterInterface;  
use Zend\Db\Adapter\Driver\ResultInterface;  
use Zend\Stdlib\Hydrator\HydratorInterface;  
use Zend\Db\ResultSet\HydratingResultSet;  
use Zend\Db\Sql\Sql;  
use Zend\Stdlib\Hydrator\ClassMethods;  

class TextMapper implements TextMapperInterface {  
    protected $homePrototype;  
    protected $adapter;  
    protected $hydrator;  

    public function __construct(AdapterInterface $adapter, HomeInterface $homePrototype, HydratorInterface $hydrator) {  
     $this->adapter = $adapter;  
     $this->homePrototype = $homePrototype;  
     $this->hydrator = $hydrator;  
    }  

    public function find($name) {  
     $sql = new Sql($this->adapter);  
     $select = $sql->select();  
     $select->from("mono");  
     $select->where(array("name = ?" => $name));  
     $stmt = $sql->prepareStatementForSqlObject($select);  
     $result = $stmt->execute();  

     if ($result instanceof ResultInterface && $result->isQueryResult() && $result->getAffectedRows()) {  
      return $this->hydrator->hydrate($result->current(), $this->homePrototype);  
     }  

     throw new \InvalidArgumentException("{$name} non esiste."); 
    }  
}  
?>  

Mapper для текста имеет завод, так как он имеет зависимости:

<?php 
namespace Site\Factory; 

use Site\Mapper\TextMapper;  
use Zend\ServiceManager\FactoryInterface;  
use Zend\ServiceManager\ServiceLocatorInterface;  
use Site\Model\Home;  
use Zend\Stdlib\Hydrator\ClassMethods;  

class TextMapperFactory implements FactoryInterface {  
    public function createService(ServiceLocatorInterface $serviceLocator) {  

     return new TextMapper($serviceLocator->get("Zend\Db\Adapter\Adapter"), new Home(), new ClassMethods(false));  
    }  
}  
?>  

Сервис для текста:

<?php  
namespace Site\Service;  

use Site\Model\Home;  
use Site\Model\HomeInterface;  
use Site\Mapper\TextMapperInterface;  

class HomeService implements HomeServiceInterface {  
    protected $textMapper;  

    public function __construct (TextMapperInterface $textMapper) {  
     $this->textMapper = $textMapper;  
    }  
    public function findText($name) {  
     return $this->textMapper->find($name);  
    }  
}  
?>  

Фабрика службы:

<?php  
namespace Site\Factory;  

use Site\Service\HomeService;  
use Zend\ServiceManager\FactoryInterface;  
use Zend\ServiceManager\ServiceLocatorInterface;  

class HomeServiceFactory implements FactoryInterface {  
    public function createService(ServiceLocatorInterface $serviceLocator) {  
     $textMapper = $serviceLocator->get("Site\Mapper\TextMapperInterface");  
     return new HomeService($textMapper);  
    }  
}  
?>  

Контроллер

<?php  
namespace Site\Controller;  

use Zend\Mvc\Controller\AbstractActionController;  
use Site\Service\HomeServiceInterface;  
use Zend\View\Model\ViewModel; 

class SkeletonController extends AbstractActionController {  
    protected $homeService;  

    public function __construct(HomeServiceInterface $homeService) {  
     $this->homeService = $homeService;  
    }  

    public function indexAction() {  
     return new ViewModel(array (
      "home" => $this->homeService->findText("home")  
     ));  
    }  
}  
?>  

Наконец, вид:

<?php echo $this->home->getText(); ?>  

Код для слайдера аналогичен, и обе части этой страницы, вероятно, имеют одинаковую проблему. Как я уже сказал, db обнаружен, таблицы и столбцы тоже, они не пусты, но ничего не отражается. Интерфейсы правильно написаны, определяя все функции. Все представления находятся в папке Site \ view \ Site \ Skeleton. Какие-нибудь подсказки о том, где проблема? Спасибо.

ответ

0

Ваш код выглядит хорошо. Единственная проблема, которую я вижу, заключается в том, что вы используете гигатор ClassMethods, и у вас нет настроек на вашем объекте.

Гидратор will use the entity API to hydrate the entity, if the setId, setName or setText are not callable then the values will not be set.

Хотя я рекомендую добавить методы пропавшие вы также можете использовать Zend\Stdlib\Hydrator\Reflection установить свойство сущностей без сеттеров (через SPL ReflectionProperty)

+0

Так вы говорите о (методах класса) заставляет меня добавить методы установщиков? Могу ли я оставить их пустыми какое-то время, пока я не смогу создать всю часть пользователя? Я также попытаюсь сделать это с помощью Reflection, хотя для этого проекта понадобится администратор sidelater – ImLearningZF2

+0

Вам нужно будет добавить их для его работы для гидратора 'ClassMethods'. – AlexP

+0

Он выглядит незначительным, но он работает хорошо. спасибо за помощь – ImLearningZF2

Смежные вопросы