TP3.2多层分级(Logic+Event)详解+案例中多次调用出现的问题

浏览:3933 发布日期:2014/08/19 分类:求助交流 关键字: Logic Event MVC多层 多次调用
本人菜鸟一枚,处于对技术的热忱,在尝试使用PHP开发BS项目。前期从事过一些BS项目,对于MVC情有独钟。在自学TP3.2开发手册中,发现在Controller(TP3.1前为Action)中加入了Logic、Event、Service可选的分层。在此做一个小的Demo进行备忘。
数据库准备:
use test;
show tables;


--  数据库准备
drop table  if exists t_messageInfo;

create table t_messageInfo
(
    id int unsigned  primary key,
    Content nvarchar(50) not null
    
)
engine=innodb;

insert into t_messageInfo
values
(1,'test1'),(2,'test2');

select *from t_messageInfo;

-- 创建存储存储过程

delimiter $$

drop procedure if exists proc_GetMessageInfo$$

create procedure proc_GetMessageInfo
()

begin
    select * from T_messageInfo;
end$$

delimiter ;


call proc_GetMessageinfo();
PHP代码准备:
文档结构截图:

关键代码:
IndexController:
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
    public function index(){
     header("Content-Type:text/html;   charset=utf-8"); 
      $IndexEvent=D('Index','Event');      
      echo "调用IndexEvent";
      dump($IndexEvent->getMessage(""));       
    }
}
IndexEvent:
<?php 
namespace home\Event;
/**
*     TPDemo 
*/
class IndexEvent
{
    
    public function GetMessage($value='')
    {
        $MessageLogic=D('Message','Logic');
        
        return $MessageLogic->getMessageList();
    }
    public function Demo($value='')
    {
        # code...
    }
}
IndexLogic:
<?php 
namespace home\Logic;
use Think\Model;
/**
*         
*/
class MessageLogic 
{
    
    public function getMessageList($value='')
    {
        # code...
         
        $MessageTable=M();
        
        //$MessageTableList=$MessageTable->query('call proc_GetMessageInfo()');
        $MessageTableList=$MessageTable->query('call proc_GetMessageInfo()');
        return $MessageTableList;
    }
}
 ?>
大功告成。这里IndexEvent作为IndexController的事件处理对象,担负了除前台显示意外所有的工作,如数据库访问、数据处理等。这里只是用一个简单的案例来说明TP的多层结构支持。MessageLogic作为数据库中T_MessageInfo的逻辑对象,肩负有关Message相关的数据访问及处理工作。
后续疑问,在进行测试中,出现了一个不和谐的小插曲。在修改IndexController时出现不一样的结果;
<?php
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
    public function index(){
     header("Content-Type:text/html;   charset=utf-8"); 
      $IndexEvent=D('Index','Event');

        //疑似问题内容1
      echo "调用IndexEvent";
      dump($IndexEvent->getMessage(""));
      //疑似问题内容2
      echo "直接调用MessageLogic";
      $MessageLogic=D('Message','Logic');        
      dump( $MessageLogic->getMessageList());
       
    }
}

以上代码 疑似问题内容1、疑似问题内容2中,只能第一个执行成功,另一个则执行失败。
如疑似问题内容1被注释,疑似问题内容2即执行成功;疑似问题内容1和疑似问题内容2共同运行,疑似问题内容1执行成功,疑似问题内容2执行失败;注释疑似问题内容1,疑似问题内容2执行成功。
个人愚见是因为MessageLogic对象的问题,我在IndexEvent中已经实例化一个MessageLogic,在IndexController又实例化一个MessageLogic。因本人能力有限,该情况还处在猜测阶段。还请各位大侠指点。
最佳答案
评论( 相关
后面还有条评论,点击查看>>