2

我正在尝试创建一个对象,但这些值没有存储到数据库中。这是在“索引”操作上完成的,因为插件是通过 TypoScript 插入的,实际上不会创建输出。所以调用动作时没有给出对象,这就是我自己创建它的原因。

$stat = new Tx_MyExt_Domain_Model_Stat;
$stat->setSubscriberId($_COOKIE['statid']);
$stat->setDomain($_SERVER['HTTP_HOST']);
$stat->setRequestUri($_SERVER['REQUEST_URI']);

$this->statRepository = t3lib_div::makeInstance('Tx_myExt_Domain_Repository_StatRepository');
$this->statRepository->add($stat);

做 avar_dump($stat)给出以下内容:

object(Tx_MyExt_Domain_Model_Stat)#191 (9) {
  ["subscriber_id":protected]=>
  string(1) "2"
  ["domain":protected]=>
  string(22) "test.localhost.example"
  ["request_uri":protected]=>
  string(26) "/testpage/index.php?id=2"
  ["uid":protected]=>
  NULL
  ["_localizedUid":protected]=>
  NULL
  ["_languageUid":protected]=>
  NULL
  ["pid":protected]=>
  NULL
  ["_isClone":"Tx_Extbase_DomainObject_AbstractDomainObject":private]=>
  bool(false)
  ["_cleanProperties":"Tx_Extbase_DomainObject_AbstractDomainObject":private]=>
  NULL
}

所以这看起来像正确分配了值。但是当查看数据库时,我得到了这个:

uid    pid    subscriber_id    domain    request_uri    crdate  
13     0      0                NULL      NULL           1328176026 

存储库:

class Tx_MyExt_Domain_Repository_StatRepository extends Tx_Extbase_Persistence_Repository
{}

模型:

class Tx_MyExt_Domain_Model_Stat extends Tx_Extbase_DomainObject_AbstractEntity 
{

    /**
     * @var int
     * @dontvalidate
     */
    protected $subscriber_id = 0;

    /**
     * @var string
     * @dontvalidate
     */
    protected $domain = '';

    /**
     * @var string
     * @dontvalidate
     */
    protected $request_uri = '';



    /**
     * @param int $susbcriber_id Subscriber id
     * @return void
     */
    public function setSubscriberId($subscriber_id) 
    {
        $this->subscriber_id = $subscriber_id;
    }

    /**
     * @return int Susbcriber id
     */
    public function getSubscriberId() 
    {
        return $this->subscriber_id;
    }

    /**
     * @param string $domain Domain
     * @return void
     */
    public function setDomain($domain)
    {
        $this->domain = $domain;
    }

    /**
     * @return string Domain
     */
    public function getDomain() 
    {
        return $this->domain;
    }

    /**
     * @param string $request_uri Request URI
     * @return void
     */
    public function setRequestUri($request_uri)
    {
        $this->request_uri = $request_uri;
    }

    /**
     * @return string Request URI
     */
    public function getRequestUri() 
    {
        return $this->request_uri;
    }

}

有人可以告诉我这里可能出了什么问题吗?

4

2 回答 2

8

通过整个 extbase 进程进行调试。似乎在 中typo3/sysext/extbase/Classes/Persistence/Backend.php,这一行的属性被跳过了:

if (!$dataMap->isPersistableProperty($propertyName) || $this->propertyValueIsLazyLoaded($propertyValue)) continue;

这是因为$dataMap->isPersistableProperty($propertyName)不返回任何东西。调查typo3/sysext/extbase/Classes/Persistence/Mapper,有:

/**
 * Returns TRUE if the property is persistable (configured in $TCA)
 *
 * @param string $propertyName The property name
 * @return boolean TRUE if the property is persistable (configured in $TCA)
 */
public function isPersistableProperty($propertyName) {
    return isset($this->columnMaps[$propertyName]);
}

所以解决方案非常简单:创建一个有效的 TCA。我没有一个(或过于简约),因为我使用的表格不会显示在后端。

于 2012-02-03T10:38:20.630 回答
3

虽然 TCA 的错误配置可能会导致问题,但可能还有其他问题。例如,当您定义唯一键时,extbase 不喜欢它并且静默失败。

在与多个项目中的问题作斗争后,我现在对使用扩展生成器制作的项目使用以下调试例程

  • 从与表相关的类以及打字稿中删除您自己的添加。如果您在Configuration/ExtensionBuilder/settings.yaml中更改了它们的状态以合并或保留,则必须对 ext_tables.php、ext_tables.sql、Configuration/TCA 和 Configuration/Typoscript 中的所有文件执行此操作。

  • 检查您的应用程序现在是否保存。如果没有,请向扩展生成器报告详细的错误报告。

  • 通常您的应用程序现在应该保存。递归读取您所做的更改,直到找到错误。从 ext_tables.sql 开始(不要忘记每次都必须删除和读取数据库),继续使用 ext_tables.php、Configuration/TCA/* 并以 Configuration/Typoscript 结束(我个人的经验是这些顺序是最快的)

  • 向 extbase 团队报告您的内容并将其添加到此线程(因为这是您遇到错误时谷歌的第一次点击)

于 2012-03-24T09:53:32.037 回答