TYPO3 Flow Dependency Injection и получение объектов, которые являются подчиненными объектами других
Здравствуйте, я учился использовать FLOW и у меня есть несколько вопросов:
У меня есть действие в контроллере, как это:
/**
* Displays a subproduct.
*
* @param \My\Package\Domain\Model\Product $product The main product.
* @param \My\Package\Domain\Model\Subproduct $subProduct A sub-product of $product.
* @return void
*/
public function subproductAction(\My\Package\Domain\Model\Product $product, \My\Package\Domain\Model\Subproduct $subProduct) {
$this->view->assign('product', $product);
$this->view->assign('subProduct', $subProduct);
}
Это было хорошо для тестирования и изучения фреймворка, но теперь я хочу убедиться, что $subProduct на самом деле является субпродуктом $product.
Каков будет лучший способ сделать это?
- Используйте DI (как сейчас), чтобы получить и продукт, и субпродукт, и проверьте, если $ product
содержит $subProduct, если не изменяет, какие переменные я назначаю своему
Посмотреть? Или же: - Введите продукт и используйте какой-либо метод $ product для возврата субпродукта $, если он является субпродуктом продукта.
- Создать функцию репо, которая получает субпродукт, если его столбец продукта является продуктом?
Продукты могут содержать множество подпродуктов, и для моего приложения мне нужно только получить один подпродукт и отобразить его, поэтому я не могу просто использовать метод getSubProducts() своих продуктов, так как он будет возвращать все из них.
Спасибо за любые советы
2 ответа
Я знаю, что это старый вопрос, но нет ничего о внедрении зависимости.
В вашем \My\Package\Domain\Model\Product
у тебя должно быть поле protected $subProducts
типа \Doctrine\Common\Collections\Collection<My\Package\Domain\Model\Subproduct>
с setsubProducts
, getSubProducts
и возможно addSubProduct
(get + add) методы внутри.
Это коллекция, так что вы можете использовать contains
, add
и так далее.
Теперь, когда у вас есть продукт, назначенный для просмотра в вашем контроллере - в жидкости как {product}
- вы можете использовать жидкость for
посмотреть помощник на {product.subProducts}
- нет необходимости помещать его в контроллер (все get [и некоторые другие] публичные методы из Model работают таким образом).
Просто для проверки (при обновлении) вы можете проверить, если $product->getSubProducts->contains($subProduct)
тогда что-то..
Я бы пошел с первым подходом. Позвольте платформе дать вам сущности и проверьте в ваших действиях, действительно ли $ subProduct принадлежит продукту $.
Из моего опыта часто лучше всего пойти с простым подходом.
Я не уверен, чего вы здесь добиваетесь, но если вы хотите отобразить только $ subProduct, почему бы не указать $ subProduct и использовать его отношение к продукту в шаблоне? Я имею в виду, что $ subProduct должен иметь обратную связь с продуктом, верно?
Итак, ваше действие будет выглядеть так:
/**
* Displays a subproduct.
*
* @param \My\Package\Domain\Model\Subproduct $subProduct A sub-product of $product.
* @return void
*/
public function subproductAction(\My\Package\Domain\Model\Subproduct $subProduct) {
$this->view->assign('subProduct', $subProduct);
}
и в вашем шаблоне вы можете сделать что-то вроде:
{subProduct.product.title}
Надеюсь, это поможет. Чтобы дать достойный совет, вам необходимо знать все ваше приложение, или, по крайней мере, нужно лучше понять проблему.