扩展 TYPO3 7.6 的 FE 用户的我自己的域存储库的调用不起作用

The calls of my own domain repository that extend FE user of TYPO3 7.6 don't work

我在自己的扩展模型中有一个 class,它扩展了 TYPO3 7.6 的 FE 用户调用 CommunityManager,我想使用存储库通用的调用,如 findByUid()findAll() 但它们不起作用,return 的值为 Null

我一直在研究它,即使在这里有几个问题,但它仍然不起作用。我目前有以下设置

在我的 CommunityManagerController 中

/**
 * communityManagerRepository
 *
 * @var \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
 * @inject
 */
 protected $communityManagerRepository = null;

/**
 * action list
 *
 * @return void
 */
 public function listAction()
  {
    $this->communityManagerRepository = $this->objectManager->get('VENDOR\MyExt\Domain\Repository\CommunityManagerRepository');
    $communityManagers = $this->communityManagerRepository->findAll();
    $this->view->assign('communityManagers', $communityManagers);
  }

CommunityManagerRepository

class CommunityManagerRepository extends TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
{
  public function initializeObject()
  {
    $defaultQuerySettings = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings::class);
    $defaultQuerySettings->setRespectStoragePage(false);
    $this->setDefaultQuerySettings($defaultQuerySettings);
  }
 }

以及 Typoscript 代码

常数

plugin.tx_myext_nameofmyplugin {
  persistence {
    storagePid = 5
  }
}

设置中

 config.tx_extbase {
  persistence {
    classes {

      TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
        subclasses {
          Tx_MyExt_CommunityManager = VENDOR\MyExt\Domain\Model\CommunityManager

        }
      }
      VENDOR\MyExt\Domain\Model\CommunityManager {
        mapping {
          tableName = fe_users
          recordType = Tx_MyExt_CommunityManager
        }
      }

    }
  }
}

非常感谢您指导我解决问题

首先,您正在使用注入注释加载类型为 \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository 的存储库,但您在操作中使用 VENDOR\MyExt\Domain\Repository\CommunityManagerRepository 覆盖了它。您可以简单地在您的 communityManagerRepository-属性 的类型注释中添加您自己的存储库类名。 第二:不要使用注入注释。使用像这样的注入方法进行注入:

class CommunityManagerController extends TYPO3\CMS\Extbase\Mvc\Controller\ActionController{
        /**
     * The communityManagerRepository
     *
     * @var \VENDOR\MyExt\Domain\Model\CommunityManagerRepository
     */
    protected $communityManagerRepository;

    /**
     * Inject the communityManagerRepository
     *
     * @param \VENDOR\MyExt\Domain\Model\CommunityManagerRepository $communityManagerRepository
     */
    public function injectCommunityManagerRepository(\VENDOR\MyExt\Domain\Model\CommunityManagerRepository $communityManagerRepository){
        $this->communityManagerRepository = $communityManagerRepository;
    }
}

注入注释不好用。你可以在这里阅读,为什么是这样:https://gist.github.com/NamelessCoder/3b2e5931a6c1af19f9c3f8b46e74f837

现在您不需要与 objectManager 相关的行,因为注入方法会为您完成此操作。

最后,根据您的配置,communityManagerRepository 将 return 个类型为 \VENDOR\MyExt\Domain\Model\CommunityManager 的对象,但由于 $defaultQuerySettings->setRespectStoragePage(false);,您的 storagePid 设置将被忽略。 无论如何,您现在应该获得系统中存在的所有 fe_users 记录,除非您在模型的持久性设置中为 fe_users 添加了新的记录类型(根据您的示例,您没有这样做) ).那么extbase只会return fe_users条正确记录类型的记录给你。

我假设 VENDOR 和 MyExt 在您的设置中是正确的,并且模型 CommunityManager 存在。

class CommunityManager extends \TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
}

class CommunityManagerRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
}

在类似的情况下,我不得不使用子类和 recordType 稍微扩展一下设置:

config.tx_extbase { 
        persistence {
                classes {
                        TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
                                subclasses {
                                        Tx_MyExt_CommunityManager = VENDOR\MyExt\Domain\Model\CommunityManager

                                }
                        }
                        VENDOR\MyExt\Domain\Model\CommunityManager {
                                mapping {
                                        tableName = fe_users
                                        recordType = Tx_MyExt_CommunityManager
                                }
                        }

                }
        }
}

另见

这里有几点需要检查:

1. 检查 fe_users 和 pid 5 您是否存储了用户。

2. 检查扩展名 typoscript 是否添加到 template.

3.进入安装工具然后按clear cache button

4. 在那里,在 Controller 中,你不使用 CommunityManagerRepositoryFrontendUserRepository 来自 extbase 你可以先通过第二步,如果您使用 CommunityManagerRepository,因为您将 respectStorage 设置为 false

我的回答可能为时已晚 post。但是我遇到了同样的问题,在调试 extbase 类 之后我找到了解决方案。

您的设置没问题;除了 1 个缺失变量 recordTypeColumnName(这应该是 fe_users table 记录中包含值 "Tx_MyExt_CommunityManager" 的字段)。

在我自己的解决方案中,我利用了 table 行中的 pid 列。据我所知,我的存储文件夹的 id,对于我所有的扩展记录将保持不变。

有两种方法可以设置 recordTypeColumnName 的值:

方法一:

在 TCA 中,在 ctrl 数组中设置类型。

  $GLOBALS['TCA'][$tableName]['ctrl']['type'] = 'pid';

方法二:

在 TypoScript 中 constants.txt

  PID.myStorage = 5

在 TypoScript 中 setup.txt

  plugin.tx_MyExt.persistence.storagePid = {$PID.myStorage}

  config.tx_extbase {
    persistence {
      classes {
        TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
          subclasses {
            {$PID.myStorage} = VENDOR\MyExt\Domain\Model\CommunityManager
          }
          recordTypeColumnName = pid
        }

        VENDOR\MyExt\Domain\Model\CommunityManager {
          mapping {
            tableName = fe_users
            recordType = {$PID.myStorage}
          }
        }
      }
    }
  }