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

TYPO3 - Using underscore in domain model

是否允许在域模型中使用 'underscore' '_'?这个好像不行?

/**
 * 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'。

事实上是可以的,但你必须确保至少你的 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 并在模型中寻找这样命名的 属性。

据我所知,这没有问题"The column name is: operating_abc"。无论如何,您可以为 set/get 使用驼峰命名法。我有几个,其中列名称为 "fax_number",然后是 "setFaxNumber(), getFaxNumber()"。行得通。

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

问题不在于它是否可能,而是它是否被允许,并且根据编码指南,它是不允许的。

All identifiers must use camelCase and start with a lowercase letter. Underscore characters are not allowed...

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

它是 "just" 指南,但整个 TYPO3 核心的设计或重构都考虑到了这一点,如果您遵循这些指南,您将对自己有很大帮助。许多自动化在后台发生,例如从 DB 字段到 属性 名称的映射,您只需按照建议进行操作就可以节省很多时间。

底线:问题不是你能不能做,而是你是否应该做!