Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php TYPO3 extbase:获取模型对象中的父对象_Php_Typo3_Extbase - Fatal编程技术网

Php TYPO3 extbase:获取模型对象中的父对象

Php TYPO3 extbase:获取模型对象中的父对象,php,typo3,extbase,Php,Typo3,Extbase,我有两(2)门课: 人模班 我理解MVC模式,模型应该只携带数据,没有逻辑,也没有任何类型的依赖关系。 所以为了解决这个问题,我将使用两个不同的模型类,基于同一个表,只存储那些应用于特定模型的属性和验证元数据 想象一下下面这两个模型: namespace Acme\MyPlugin\Domain\Model; class PostalAddressPrivate { /** * @var string $privatePersonFirstName */ pr

我有两(2)门课:

人模班
我理解MVC模式,模型应该只携带数据,没有逻辑,也没有任何类型的依赖关系。
所以为了解决这个问题,我将使用两个不同的模型类,基于同一个表,只存储那些应用于特定模型的属性和验证元数据

想象一下下面这两个模型:

namespace Acme\MyPlugin\Domain\Model;
class PostalAddressPrivate
{
    /**
     * @var string $privatePersonFirstName
     */
    protected $privatePersonFirstName;

    /**
     * @var string $privatePersonName
     */
    protected $privatePersonName;

    [...]

}

namespace Acme\MyPlugin\Domain\Model;
class PostalAddressCommercial
{
    /**
     * @var string $privatePersonFirstName
     */
    protected $companyName;

    [...]

}
现在,您必须告诉持久化层,这些模型位于同一个表中。您可以在该插件的打字脚本设置中执行此操作

plugin.tx_myplugin {
    persistence {
        classes {
            Acme\MyPlugin\Domain\Model\PostalAddressPrivate {
                mapping {
                    tableName = tx_myplugin_domain_model_postal_address
                }
            }
            Acme\MyPlugin\Domain\Model\PostalAddressCommercial {
                mapping {
                    tableName = tx_myplugin_domain_model_postal_address
                }
            }
    }
}  
现在,您可以将逻辑传输到控制器中,并在那里决定使用哪个模型。您可以使用公共接口或抽象类等扩展此简单案例

控制器中的“选择正确的模型”逻辑有时可能有点棘手。通常,您需要将一些处理extbase“property mapper”的代码放在适当的“initializexxaction”方法中。 一开始,我受到了这篇德语文章的启发(对于较旧版本的extbase!): 希望谷歌翻译会给你一些提示,以解决即将到来的问题

最重要的是,您可以通过一些前端工作来协助基于服务器的验证和处理。例如,根据选择的私有/商业状态启用或禁用某些公式字段的JavaScript技巧。
您还可以根据控制器中使用的模型变量调整流体模板以渲染/不渲染某些零件。

我将以不同方式处理此问题。这是没有控制器作业imho。这绝对是一个模板/视图作业。我会在模板中使用if条件来显示正确的布局(字段是否可编辑)。之后,您必须确保没有人可以仅通过开发人员工具(例如)使字段可编辑

这可以通过在后端逻辑中添加条件来实现,例如:

if($model->isAllowedProperty) { AddFieldToResultArrOrSimilar() }

我会以不同的方式处理这个问题。这不是imho的控制器作业。这绝对是一个模板作业。我会在模板中使用if条件来显示正确的布局(字段是否可编辑)。之后,您必须确保没有人可以仅通过开发人员工具(例如)使字段可编辑。也就是说,
如果($model->isAllowedProperty){AddFieldToResultArrOrSimilar}
我同意Xatenev的观点。这就属于模板中的关键部分。@Xatenev您能创建一个答案吗?@AdrianDymorz这样做了。谢谢你通知我(很老的问题)。如果你还需要任何帮助,请随意评论我的答案。你完全误解了MVC模式。模型中的逻辑和依赖关系都没有问题。如果数据(在本例中)严格绑定到实体的实例,那么它就是域逻辑。该模型正是ist所属的唯一地方。别相信我的话:好的,j4k3,你是对的。也许我不应该用“模型”这个词,而应该用“实体”,因为这就是我真正的意思。根据我的经验,将所有应用程序逻辑从实体中提取出来,例如,实体管理器类ehich也是模型层的一部分,这可能就是您的意思。例如,在Symfony中,每次我试图将一些外部依赖项欺骗到实体类中(因为它有时非常方便),迟早会遇到“循环依赖项问题”,因此我会坚持我的习惯,将实体仅作为值对象。
plugin.tx_myplugin {
    persistence {
        classes {
            Acme\MyPlugin\Domain\Model\PostalAddressPrivate {
                mapping {
                    tableName = tx_myplugin_domain_model_postal_address
                }
            }
            Acme\MyPlugin\Domain\Model\PostalAddressCommercial {
                mapping {
                    tableName = tx_myplugin_domain_model_postal_address
                }
            }
    }
}  
if($model->isAllowedProperty) { AddFieldToResultArrOrSimilar() }