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}

Надеюсь, это поможет. Чтобы дать достойный совет, вам необходимо знать все ваше приложение, или, по крайней мере, нужно лучше понять проблему.

Другие вопросы по тегам