gpt4 book ai didi

zend-framework - 数据映射器、 Controller 和模型的 Zend 框架结构

转载 作者:行者123 更新时间:2023-12-04 06:50:06 25 4
gpt4 key购买 nike

我刚开始使用 Zend Framework,所以我对结构有很多疑问。
我希望我能正确解释它,这相当困难。

好的,我已经完成了快速入门教程,并决定在我的第一个项目中使用类似的结构。

所以我有一个数据映射器、一个模型和数据库表文件。

我创建了一个表单,我可以在其中输入一些信息(项目)并用它上传图像。

我有 2 个 Datamapper(项目和图像)以及它们的 2 个模型。我有一个项目 Controller ,它会跳入 ItemMapper。在 Datamapper 中,我有一个保存方法。请看下面:

 public function save(Application_Model_Item $item)
{

$data = array(
'item_title' => $item->getItemTitle(),
'item_description' => $item->getItemDescription(),
);
$this->getDbTable()->insert($data);

// Add Image Information ($imageData is Session Data)
$table = new Application_Model_DbTable_Image();
foreach ($imageData as $fileData)
{
$image = new Application_Model_Image($fileData);
$data = array(
'image_newname' => $image->getNewImageName(),
'image_thumbname' => $image->getImageThumbName(),
);
$table->insert($data);
}

现在我的问题。
  • 我的模型中有 Getter 和 Setter。项目数据库表中的所有内容都应该在 1 个模型中吗?意味着有关图像的所有内容都应该转到图像模型,因为它位于不同的数据库表中?
  • 我将有关图像的信息保存在项目映射器中是否正确?我应该在 ImageMapper 中没有 save() 方法并将其保存在那里吗?如果是这样,我如何从项目映射器跳转到图像映射器?还是我会先完成有关项目的所有内容,将 ID 返回给 Controller ,然后从 Controller 调用 ImageMapper?
  • 我读了一些关于“胖模型瘦 Controller ”的东西。我一直都有这个,但我注意到我的 Controller 只是把表单放在一起就变得很胖。我有大约 5 个下拉字段,它们取决于下拉列表。当我看到我复制代码时,我决定将它添加到一个单独的函数中。所以我有一个县的下拉菜单。我写了一个函数,它也在我的 Controller 中,所以它看起来像这样:
    public function getCounties ()

    {
    // List of Counties does not exist in Cache, read from DB
    if(!$CountyList = $this->getFromCache('counties')){

    $geolocationMapper = new Application_Model_GeolocationMapper();
    $CountyDropdown = $geolocationMapper->createCountyDropdown();

    // Save DB Result in Cache
    $this->addToCache ('counties',$CountyDropdown);
    return $CountyDropdown;
    }
    else{
    // Return Country List from Cache
    return $this->getFromCache('counties');
    }

    }

  • 在我的添加功能中,我使用

    //将地理信息分配给表单
    $CountyList = $this->getCounties();               
    $form->getElement('county')->setMultiOptions($CountyList);

    编辑功能比
    $CountyList = $this->getCounties();
    $form->getElement('county')->setMultiOptions($CountyList)->setValue($activeCounty)

    所有像 getCounties () 这样的函数都留在 Controller 中还是应该移到 GeolocationMapper 中?如果是这样,那将如何调用?
  • 是否应该在某个函数中创建表单,所以我只会调用 createForm() 之类的东西?我确实有很多重复项(添加和编辑功能),而且 Stuff 来自数据库或表单无效,它来自带有 setValue 的缓存。它只是在使用可靠的下拉列表时加起来。

  • 我知道这是很多问题,但我觉得它变得非常困惑,作为一个学习者,当它工作时你很高兴,但我也想以适当的方式组织它。我希望这一切都有意义。

    也许你们中的一些人有一些我可以使用的提示。非常感谢您提前提供的帮助。

    最佳答案

    这里有很多问题,大多数答案很大程度上取决于个人喜好。有了这个警告:

    Should everything what is in the Item Database Table be in 1 Model?



    我会说是的,尽管总的来说,尝试从模型而不是数据库结构的角度来考虑它。所以所有的“项目”数据都进入项目模型——这些数据都存储在一个数据库表中这一事实是无关紧要的,因为映射器处理从一个到另一个的转换。

    Is it correct that I save the Information about the Image in the Item Mapper?



    在您的示例中不清楚 $imageData 来自哪里,但我会说如果有要保存的图像数据,Item 映射器应该调用 Image 映射器,例如:
    public function save(Application_Model_Item $item)
    {
    $data = array(
    'item_title' => $item->getItemTitle(),
    'item_description' => $item->getItemDescription(),
    );
    $this->getDbTable()->insert($data);

    // save image data if present
    if (isset($item->image)) {
    $imageMapper = new Yourapp_Mapper_Image();
    $imageMapper->save($item->image);
    }

    return true;
    }

    [Should] all the Functions like getCounties () stay in the Controller or should it be moved to the GeolocationMapper? And if so, how would that be called up?



    我看不出有任何理由让这些功能出现在 Controller 中。取决于您对 Zend_Form 的舒适程度组件,一种方法可能是编写自定义 Yourapp_Form_Element_Counties扩展类 Zend_Form_Element_Select .然后,您将逻辑从 getCounties 函数移到此类中,因此表单元素本身负责填充它呈现的选项。例如。:
    class Yourapp_Form_Element_Counties extends Zend_Form_Element_Select
    {
    public function getMultiOptions()
    {
    // load counties here and return an array in the format key -> value
    }
    }

    如果您有很多与位置相关的表单元素,另一种方法可能是创建一个 GeoLocation Service 类,该类具有返回选项的县、市等功能。

    Should the Form be created in some Function so I would only call up something like createForm()



    除了填充选择选项之外,目前尚不清楚您在 Controller 中已经做了多少表单操作,因此很难回答这个问题。以下是我在使用 Zend_Form 时通常遵循的原则:
  • 每个表单都有自己的类,扩展 Zend_Form(或 Zend_Dojo_Form),它存在于 application/forms 中,名为 Myapp_Form_*
  • 每个表单类都在 init() 方法中设置其元素(为此目的,Zend_Form 的构造函数会自动调用该方法)。
  • 如果我发现我需要在不同的操作中对相同的表单进行细微的修改(例如,在添加和编辑操作中),我会为表单创建一个抽象基类(例如 Myapp_Form_Post_Base ),它定义了元素,然后是特定于操作的类扩展它:Myapp_Form_Post_Add , Myapp_Form_Post_Edit等等。这些类在它们自己的 init() 方法中对基本表单进行所需的任何更改。

  • 然后我的操作看起来像这样:
    public function editAction()
    {
    $form = new Myapp_Form_Post_Edit();

    if ($this->_request->isPost()) {
    if ($form->isValid($this->_request->getPost()) {
    // save data, set flash messge and redirect
    }
    }

    $this->view->form = $form;
    }

    我唯一的另一条建议是尝试遵循对您来说最合乎逻辑的方法。你可能会发现很难为很多这些东西找到明确的“最佳实践”,因为有很多不同的方法可以做到这一点。

    关于zend-framework - 数据映射器、 Controller 和模型的 Zend 框架结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6775362/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com