Расширение TYPO3 - класс чужого домена не может быть идентифицирован сопоставителем свойств - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть форма во внешнем интерфейсе, которая создает объект модели Question. Каждому вопросу должен быть присвоен один Category, который выбирается в форме (через <f:form.select>), а затем отправляется следующим образом:

tx_qa_questionform[question][category] = 1

, в основном отправляя UID Category. После отправки формы я получаю исключение:

#1297759968 TYPO3\CMS\Extbase\Property\Exception
Exception while property mapping at property path "category": Could not find a suitable type converter for "Category" because no such class or interface exists.

Так что, похоже, PropertyMapper не может идентифицировать домен Category, хотя он определен в расширении. Разве это не должно произойти само по себе? Или есть какая-то конфигурация, которую я пропустил, чтобы настроить?

Model/Question.php

namespace Vendor\QA\Domain\Model;

class Question extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {

    /**
     * @var Category $category
     */
    protected $category;

    /**
     * @var string $name
     */
    protected $name = '';

    /**
     * @var string $mail
     */
    protected $mail = '';

    /**
     * @var string $content
     */
    protected $content = '';

    public function __construct(Category $category, string $name, string $mail, string $content) {
        $this->setCategory($category);
        $this->setName($name);
        $this->setMail($mail);
        $this->setContent($content);
    }

    public function setCategory(Category $category): void {
        $this->category = $category;
    }

    public function getCategory(): Category {
        return $this->category;
    }

    public function setName(string $name): void {
        $this->name = $name;
    }

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

    public function setMail(string $mail): void {
        $this->mail = $mail;
    }

    public function getMail(): string {
        return $this->mail;
    }

    public function setContent(string $content): void {
        $this->content = $content;
    }

    public function getContent(): string {
        return $this->content;
    }
}

Model/Category.php

namespace Vendor\QA\Domain\Model;

class Category extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {

    /**
     * @var string $name
     */
    protected $name;

    public function __construct(string $name) {
        $this->setName($name);
    }

    public function setName(string $name): void {
        $this->name = $name;
    }

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

Controller/FrontendController.php

namespace Vendor\QA\Controller;

use Vendor\QA\Domain\Model\Question;
use Vendor\QA\Domain\Repository\QuestionRepository;
use Vendor\QA\Domain\Repository\CategoryRepository;

class FrontendController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {

    private $questionRepository;
    private $categoryRepository;

    public function injectQuestionRepository(QuestionRepository $questionRepository) {
        $this->questionRepository = $questionRepository;
    }

    public function injectCategoryRepository(CategoryRepository $categoryRepository) {
        $this->categoryRepository = $categoryRepository;
    }

    public function formAction() {
        $categories = $this->categoryRepository->findAll();
        $this->view->assign('categories', $categories);
        $this->view->assign('newQuestion', null);
    }

    public function createQuestionAction(Question $question) {
        $this->questionRepository->add($question);
    }
}

1 Ответ

1 голос
/ 13 февраля 2020

Вам нужны аннотации @ phpdo c в функциях действий вашего контроллера. Смотрите, например, showAction здесь: https://docs.typo3.org/m/typo3/book-extbasefluid/master/en-us/7-Controllers/1-Creating-Controllers-and-Actions.html#flow -pattern-display-a-single-domain-object

После изменения аннотаций phpdo c очистите системные кеши.

...