TYPO3 - 在域模型中使用下划线

时间:2018-01-26 08:53:19

标签: typo3 extbase typo3-8.x typo3-extensions

是否允许在域模型中使用'下划线''_'?这似乎不起作用?

/**
 * Mymodel
 */
class Mymodel extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {

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

    /**
     * Returns the operating_abc
     *
     * @return string $operating_abc
     */
    public function getOperatingAbc() {
        return $this->operating_abc;
    }

    /**
     * Sets the operating_abc
     *
     * @param string $operating_abc
     * @return void
     */
    public function setOperatingAbc($operating_abc) {
        $this->operating_abc = $operating_abc;
    }   

}

我收到此错误:

未捕获TYPO3例外 无法访问受保护的属性Vendor \ Mymodel \ Domain \ Model \ Mymodel :: $ operating_abc

这是有效的:

/**
 * Mymodel
 */
class Mymodel extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {

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

    /**
     * Returns the operatingAbc
     *
     * @return string $operatingAbc
     */
    public function getOperatingAbc() {
        return $this->operatingAbc;
    }

    /**
     * Sets the operatingAbc
     *
     * @param string $operatingAbc
     * @return void
     */
    public function setOperatingAbc($operatingAbc) {
        $this->operatingAbc = $operatingAbc;
    }   

}

输出:

Vendor\Mymodel\Domain\Model\Mymodel prototypepersistent entity (uid=2, pid=0)
   operatingAbc => protected 'TWRXT' (4 chars)
   uid => protected 2 (integer)
   _localizedUid => protected 2 (integer)modified
   _languageUid => protected 0 (integer)modified
   _versionedUid => protected 2 (integer)modified
   pid => protected 0 (integer)

列名是:operating_abc

在输出中我也希望得到'operating_abc'。

3 个答案:

答案 0 :(得分:2)

实际上可以,但您必须确保至少您的setter遵循名称。因此,它必须命名为setOperating_abc

通常,您应该使用通常的lowerCamelCase约定,特别是因为您可以免费自动映射到snail_case中的数据库字段。如果你不这样做,你必须添加从DB到属性的映射,如下所示:

plugin.tx_myextension {
    persistence {
        classes {
            MyVendor\MyExtension\Domain\Model\MyModel {
                mapping {
                    columns {
                        operating_abc.mapOnProperty = operating_abc
                    }
                }
            }
        }
    }
}

否则,Extbase会在内部将operating_abc转换为operatingAbc,并在模型中查找名为this的属性。

答案 1 :(得分:2)

问题不在于是否可能,但是如果允许的话,并且根据编码指南是不允许的。

  

所有标识符必须使用camelCase并以小写字母开头。 不允许使用下划线字符 ...

https://docs.typo3.org/typo3cms/CoreApiReference/latest/CodingGuidelines/PhpFileFormatting/PhpSyntaxFormatting.html#identifiers

这只是“正义”的指导原则,但整个TYPO3核心的设计或重构都考虑到了这一点,如果您遵循这些指导原则,您将自己帮助很多。在后台发生了很多自动化,例如从DB字段到属性名称的映射,您可以在遵循建议的情况下节省很多时间。

底线:问题不在于你是否可以,但如果你应该这样做的话!

答案 2 :(得分:0)

据我所知,这没有问题“列名是:operating_abc”。无论如何,您可以使用camelcase进行设置/获取。我有几个,其中列名称称为“fax_number”,然后是“setFaxNumber(),getFaxNumber()”。这很有效。

为什么要使用下划线的set / get?它不一致,会弄得一团糟。