У меня есть немного вопрос OOD.Zend Framework 2 - Использовать метод обслуживания как параметр InputFilter
У меня есть обслуживание:
namespace Front\Service\Course;
use Front\ORM\EntityManagerAwareInterface;
use Zend\Http\Request;
use Zend\InputFilter\InputFilter;
use Front\InputFilter\Course\CreateFilter;
class Create implements EntityManagerAwareInterface
{
/**
* @var \Doctrine\Orm\EntityManager
*/
protected $entityManager = null;
public function create(CreateFilter $createFilter)
{
if (!$createFilter->isValid()) return false;
/* @var $courseRepository \Front\Repositories\CourseRepository */
$courseRepository = $this->getEntityManager()->getRepository('Front\Entities\Course');
$course = $courseRepository->findByName($createFilter->getCourse());
}
/* (non-PHPdoc)
* @see \Front\ORM\EntityManagerAwareInterface::getEntityManager()
*/
public function getEntityManager()
{
return $this->entityManager;
}
/* (non-PHPdoc)
* @see \Front\ORM\EntityManagerAwareInterface::setEntityManager()
*/
public function setEntityManager(\Doctrine\ORM\EntityManager $entityManager)
{
$this->entityManager = $entityManager;
return $this;
}
}
И контроллер:
class CreateController extends \Zend\Mvc\Controller\AbstractController
{
public function onDispatch(MvcEvent $e)
{
$jsonModel = new JsonModel();
/* @var $courseCreateService \Front\Service\Course\Create */
$courseCreateService = $this->getServiceLocator()->get('Front\Service\Course\Create');
$courseCreateFilter = new CreateFilter();
$courseCreateFilter->setData($this->params()->fromPost());
if (!$courseCreateFilter->isValid()) {
$jsonModel->setVariable('status', 0);
$jsonModel->setVariable('message', $courseCreateFilter->getMessages());
return;
}
$courseCreateService->create($courseCreateFilter);
}
}
метод обслуживание декларация:
public function create(CreateFilter $createFilter)
я заставить пользователь Службы использовать CreateFilter контейнер, который, полученные из Zend/InputFilter каждый раз, когда он хочет создать новый курс.
Мой вопрос: может быть, лучше, когда я отправлю на сервисный слой, а не на типизированный объект, но простое значение? На примере в моем случае это мощь выглядит следующим образом:
public function create($courseName)
Мой CreateFilter выглядит следующим образом:
class CreateFilter extends InputFilter
{
public function __construct()
{
$input = new Input('name');
$validatorChain = new ValidatorChain();
$validatorChain->addValidator(new StringLength(array('max'=>60)))
->addValidator(new NotEmpty());
$input->setRequired(true)->setValidatorChain($validatorChain);
$this->add($input);
}
/**
* @return string | null
*/
public function getCourse()
{
return $this->getValue('name');
}
}
Если вы ожидаете, что это будет входной фильтр, ваш класс должен отразить это, но вместо того, чтобы форсировать реализацию конкретного класса, почему бы просто не потребовать, чтобы предоставленный класс реализовал «Zend \ InputFilter \ InputFilterInterface»? – Crisp
Во-первых, это не моя зависимость, это пользовательский ввод с точки зрения сервиса. И он должен иметь конкретный метод getCourse, определенный внутри CreateFilter. – SpalaX
Если служба ожидает, что у нее будет метод getCourse, тогда ваш класс фильтра должен реализовать интерфейс, который определяет это. Моя точка зрения, ваша служба должна ожидать, что объект, реализующий этот интерфейс вместо конкретного имени класса, вместо того, чтобы быть беспричинным. – Crisp