技术开发 频道

PHP应用程序架构浅谈

  7. 自动生成代码

  99%的值对象和DAO代码,可以根据数据库模式(schema)自动生成,前提是你的表和列使用约定的方式进行命名。如果你修改数据库模式,一个自动生成代码的脚本将大大节省你的时间。

  8. 业务逻辑

  业务逻辑直接反映使用者的需要。它们处理值对象,根据业务需要修改值对象的属性,使用DAO与数据库层交互。

class NewsletterLogic {
    
function NewsletterLogic() {
      ...
    }

function subscribePerson(&$person) {
      ...
    }

function unsubscribePerson(&$person) {
      ...
    }

function sendNewsletter(&$newsletter) {
      ...
    }
  }

  9. 页逻辑(控制器)

  当一个网页被请求时,页控制器(page controller)就会运行,然后产生输出。控制器的任务,就是将HTTP请求转化成业务对象(business object),然后调用相应的业务逻辑,生成展示输出的对象。

  页逻辑依次执行以下步骤(请参照后面的PageController类的代码):

i. 假定页面请求之中,包含一个cmd参数。

ii. 根据cmd参数的值,执行相应的动作。

iii. 验证页面返回的值,生成一个值对象。

iv. 针对值对象,执行业务逻辑。

v. 如果有必要,可以导向另一个页面。

vi. 收集必要的数据,输出结果。

  注意:可以编写一个工具函数(utility function),处理GET或POST值,当有的变量没有赋值时,提供一个默认值。页逻辑不包含HTML代码。

class PageController {
    var $person; #$person
is used by the HTML page
    var $errs;

function PageController() {
      $action
= Form::getParameter('cmd');
      $this->person = new Person();
      $this
->errs = array();

if ($action == 'save') {
        $this->parseForm();
        
if (!this->validate()) return;

NewsletterLogic::subscribe($this
->person);

header(
'Location: confirmation.php');
        exit;
      }
    }

function parseForm() {
      $this
->person->name = Form::getParameter('name');
      $this->person->birthdate = Util::parseDate(Form::getParameter('birthdate');
      ...
    }

function validate() {
      
if ($this->person->name == '') $this->errs['name'] = FORM_MISSING;
      #FORM_MISSING is a constant
      ...
      return (sizeof($this
->errs) == 0);
    }
  }
0
相关文章