【问题标题】:how to achieve MVC in my Zend Framework如何在我的 Zend Framework 中实现 MVC
【发布时间】:2012-03-29 17:45:23
【问题描述】:

目前我正在 Zend 中做一个项目,我正在做的工作很完美,但我确信这不是我想做的方式,我的意思是我没有遵循 MVC,我想在我的 zend 应用程序中应用 MVC。 我正在粘贴一个简单模块的代码,该模块将描述我在做什么。请纠正我的错误。

我的控制器

class ContactsController extends Zend_Controller_Action{

   public function contactsAction(){
    if(!Zend_Auth::getInstance()->hasIdentity()){
          $this->_redirect('login/login');
      }
      else{

       $request                = $this->getRequest();
       $user                   = new Zend_Session_Namespace('user');
       $phone_service_id       = $user->p_id;

       $instance               = new Contacts();
       $select                 = $instance->Get_Contacts($p_id);

       $adapter                = new Zend_Paginator_Adapter_DbSelect($select);
       $paginator              = new Zend_Paginator($adapter);
       .
               .
       //more code
   }

请注意我的控制器中的这 2 行

$instance               = new Contacts();
$select                 = $instance->Get_Contacts($pid);

这是我在模型中的联系人类

class Contacts extends Zend_Db_Table{

function Get_Contacts($p_id){
    $DB = Zend_Db_Table_Abstract::getDefaultAdapter();

    $select = $DB->select()
         ->from('contact', array('contact_id','contact_first_name','contact_mobile_no','contact_home_no','contact_email','contact_office_no'))
         ->where('pid = ?', $p_id)
         ->order('date_created DESC');

         return $select;
    }
    }

在此之后,我简单地将我的结果分配给我的视图。

请注意 由于它的工作,但我的班级中没有私有数据成员,我的班级不是蓝图。没有 SETTERS 和 GETTERS 。我怎样才能使我的代码最适合 MVC 和 OOP??

【问题讨论】:

  • 您不接受已接受答案并接受另一个仅指向手册的答案的实际原因是什么?这与我在评论中提供的相同链接对我更彻底的解释:)
  • 您是否知道extends 构成“IS A”关系。联系人不是数据库表。

标签: model-view-controller oop zend-framework


【解决方案1】:

当你学习新技术时要记住一件事,所以首先阅读他们自己的文档。没有人能比他们解释得更好。一开始很难理解,但是当你学习它时,你会习惯,然后你会像我一样喜欢它Zend Offical Site

【讨论】:

    【解决方案2】:

    最简单的答案:你已经差不多是 MVC 了。您使用 Zend_Controller_Action 来获取一些数据并将其传递到您呈现 html 的视图层。唯一缺少的部分是您的模型,它混合在控制器和数据网关之间(您在其中实现了表数据网关模式,即 Zend_Db_Table 东西)。

    我在对another question 的回答中给出了非常详尽的解释,我将如何正确设置控制器和模型之间的关系。我还将它与表单相结合,以处理数据输入、过滤和验证。然后为了捆绑一些常用功能,我在 Model 和 Controller 之间引入了一个 Service 层。

    使用控制器,您可以执行一些操作(列出我的所有联系人、创建新联系人、修改联系人),并且模型仅包含数据(id、姓名、电话、地址)。该服务有助于对一些功能进行分组(findContactByName、findContactById、updateContactWithForm)。

    如果你知道如何拆分 Controller、Mode、Form 和 Service,你的控制器可以变成这样:

    class ContactsController extends Zend_Controller_Action
    {
        public function indexAction ()
        {
            if (!$this->hasIdentity()) {
                $this->_redirect('login/login');
            }
    
            $service   = new Application_Service_Contacts;
            $contacts  = $service->getContacts();
            $paginator = $service->getPaginator($contacts);
    
            $this->view->paginator = $paginator;
        }
    
        protected function hasIdentity ()
        {
            return Zend_Auth::getInstance->hasIdentity();
        }
    }
    

    您希望在控制器中执行的操作取决于您的个人喜好:我会说您在控制器中放置的内容越少越好,但您需要保持控制。所以:获取数据的调用发生在控制器中,检索此数据发生在其他地方。另外:将数据集转换为其他内容的调用发生在控制器中,转换发生在其他地方。

    如果您为服务类提供了足够的方法来获取数据,那么您可以非常快速地更改控制器中的结果。 (注意我把 Zend_Auth 带到了另一个函数:如果你有其他动作,你可以使用这个相同的函数。另外,如果你想在你的认证中改变一些东西,你有一个地方,而不是控制器中的每个动作)

    【讨论】:

    • 非常感谢先生,我在这里的型号和服务怎么样??
    • 您可以查看 ZF 快速入门,其中解释了如何使用表数据网关模式创建模型。快速入门提到了一个数据映射器(在他们的示例中:Application_Model_GuestbookMapper),我希望将其放入单独的子命名空间(服务)而不是模型,但想法是相同的:framework.zend.com/manual/en/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    相关资源
    最近更新 更多