【问题标题】:TYPO3 - Using underscore in domain modelTYPO3 - 在域模型中使用下划线
【发布时间】:2018-01-26 08:53:19
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我将其更改为 ... setOperating_abc() getOperating_abc() ... 错误消失了 ...但该字段为空。我错过了什么?
    • 我已经添加了snail_case 属性映射的解释,这应该是你的问题。
    【解决方案2】:

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

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

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

    这是“只是”指导方针,但整个 TYPO3 核心的设计或重构都考虑到了这一点,如果你遵循这些指导方针,你会帮助自己很多。在后台进行了大量自动化操作,例如从 DB 字段到属性名称的映射,您只需遵循建议即可节省大量时间。

    底线:问题不在于你是否可以,而是你是否应该这样做!

    【讨论】:

      【解决方案3】:

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

      为什么要使用带下划线的 set/get?不一致,会造成混乱。

      【讨论】:

      • 我将其更改为 ... setOperatingAbc() getOperatingAbc() ... 见上文。但是得到如图所示的错误。我错过了什么?
      猜你喜欢
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 2014-04-06
      • 1970-01-01
      相关资源
      最近更新 更多