2012-03-13 99 views
-1

目前我在做Zend的项目我做的是可以正常使用的方式,但我敢肯定它不是我的方式我想这样做我的意思是我不是以下MVC,我想在我的zend应用程序中应用MVC。 我正在粘贴一个简单模块的代码,它将描述我正在做什么,并且纠正我在哪里犯错。如何实现MVC在我的Zend框架

我控制器

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 
    } 

PLZ注意此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; 
    } 
    } 

此我简单后我的结果分配给我的看法。

注请 作为其工作,但没有在我的课私有数据成员,我的课是不是一个蓝色print.there没有getter和setter方法我。怎么才能让我的代码最适合MVC和OOP ??

+2

实际上你接受答案时不接受的原因是什么,接受另一个只是指向手册的原因?这与我在评论中提供的链接相同,只是我提供了更全面的解释:) – 2012-03-21 10:30:52

+0

您是否知道'extends'构成“IS A”关系。联系人不是数据库表。 – 2013-08-05 14:52:47

回答

0

记住一件事当u学习新的技术,所以先阅读thier自己的文档。没有人能比他们更好地解释。它首先很难理解,但是当你学习它时,你会习惯并且会比你更喜欢我Zend Offical Site

3

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

我给在回答中一个非常详尽的解释another question我怎么会正确设置控制器和模型之间的关系。我还将此与表单结合起来,以处理数据输入,过滤和验证。然后为了捆绑一些常用功能,我在模型和控制器之间引入了一个服务层。

与控制器,你执行一些操作(列出我的所有联系人,创建新的联系人,修改联系人)和模型纯粹是包含数据(ID,姓名,电话,地址)。该服务有助于对一些函数(findContactByName,findContactById,updateContactWithForm)进行分组。

如果你知道如何分割控制器,模式,形式和服务,您的控制器可以成为这样的事情:

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带到了另一个函数中:如果你有其他的动作,你可以使用这个函数,而且如果你想改变认证中的某些东西,你可以在一个地方找到它,而不是控制器中的每一个动作)

+0

thanQ非常先生那么我的模型和服务呢? – 2012-03-13 12:24:55

+0

您可以查看ZF快速入门,了解如何使用表数据网关模式创建模型。快速入门提到了一个数据映射器(在他们的例子中:Application_Model_GuestbookMapper),我宁愿将它放到一个单独的子名空间(Service)中,而不是Model中,但这个想法是一样的:http://framework.zend.com/manual/ EN/learning.quickstart.create-model.html – 2012-03-13 12:40:31