2009-09-16 22 views
3

你们大多数人都应该知道'有名'的文章关于“Writing Robust PHP Backends with Zend Framework” 经过一段有趣的阅读之后,我决定尝试一下,因为我无法找到处理数据的黄金解决方案。我是否理解如何使用Zend Framework构建健壮的php后端?

然后,我试图写一种骨架,以具体的例子。

但是有些观点对我来说很奇怪。但我稍后会详细讲述这一点。

我删除了一些代码更清晰。 下面是代码:

// Kind of stdClass. the User Domain Object 
    // Nothing more to say, it's just about to have a User object 
    // I guess we could do here some business logic like the username should 
    // be only alpha, etc.. 

    class User 
    { 
     $_data = array('userId', 'userName'); 
     public function __construct($data = null) 
     { 
      $this->populate($data); 
     } 

     public function populate($data = null) 
     { 
      if (is_object ($data)) 
      { 
       $data = (array) $data; 
      } 

      if (! is_array($data)) 
      { 
       throw new Exception ('Data must be an array or an object'); 
      } 

      foreach ($data as $property => $value) 
      { 
       $this->$property = $value; 
      } 
     } 

     public function toArray() 
     { 
      return $this->_data; 
     } 
    } 

    // The UserTable extends Zend_Db_Adapter_Abstract or Zend_Db_Table 
    // Here we do things like fetch, add, update, etc... 
    // Validating the data depending on the persistent layers which is the db : 
    // respect the data types and formats. 

    class UserTable extends Zend_Db_Adapter_Abstract 
    { 
     public function __construct ($options) 
     { 
      parent::__construct($options); 
     } 

     public function validateUser($user) 
     { 
      if (null == $user->name || len($user->name) >= 30 || len($user->name) <= 0) 
      { 
       throw new Zend_Db_Exception ('Username must be between 0 and 30 chars and must not be null'); 
      } 

      $user->name = $this->quote($user->name); 

      return $user;   
     } 

     public function createUser(User $user) 
     { 
      $user = $this->validateUser($user); 

      $user = $user->toArray(); 

      try 
      { 
       $this->insert('Users', $user); 
       $user->id $this->lastInsertId('Users'); 

      } catch (Zend_Db_Expection $e) { 
       echo 'Error while creating user :', $e->getMessage(); 
      } 

      return $user; 
     } 

     public function updateUser(User $user) 
     { 
      $user = $this->validateUser($user); 

      $user = $user->toArray(); 

      if (null == $user->id) 
      { 
       throw new Exception ('User must have an userId to be updated'); 
      } 

      try 
      { 
       $this->update('Users', $user, 'userId = ' . $user->id); 

      } catch (Zend_Db_Expection $e) { 
       echo 'Error while updating user :', $e->getMessage(); 
      } 

      return $user; 
     } 
    } 

    // the UserService will be used like an API from the Controller 
    // Let says that our adapters must implements an interface for our Service 
    // be able to work. 
    // It overrides the method provided by the adapter without knowledge of 
    // the data is stored. You can then provide another adapter 
    // than DB (like webservice, xml, etc...) 
    // But then, if the adapter implements an interface, why should I use 
    // a Service Layer ? Maybe i didn't understand the Service Layer Concept. 

    class UserService 
    { 
     $_adapter = null; 

     public function __construct($adapter = null) 
     { 
      $this->setAdapter($adapter); 
     } 

     public function setAdapter($adapter = null) 
     { 
      $this->_adapter = $adaper; 
     } 

     public function getUserById($id = 0) 
     { 
      $this->getAdapter()->getUserById($id); 
     } 

     public function save(User $user) 
     { 
      if (null != $user->id) 
      { 
       $this->getAdapter()->createUser($user); 
      } else { 
       $this->getAdapter()->updateUser($user); 
      } 
     } 

     // proxy method to the PostService 
     // let's say that we have getPostsByUser($userId) method within the 
     // PostService class 
     // Btw, Maybe we should find a better way to initialize the adapter, 
     // to let it less dependent. 

     public function getPosts(User $user) 
     { 
      $postService = new PostService(new PostTable()); 
      return $postService->getPostsByUser($user->id); 
     } 
    } 



    // The use in a controller is pretty easy, and the controller, just do 
    // what it should in an MVC architecture. 
    // get the data from the model, pass it to the view. 

    class UserController 
    { 
     protected $user = null; 

     public function init() 
     { 
      // get the user object from the session 
     } 
     public function postsAction() 
     { 
      $userService = new UserService(new UserTable()); 

      $this->view->posts = $userService->getPostsByUser($user->id); 

     } 
    } 

所以最终的问题是,我是否理解这个概念?或者我犯了一些错误实施它?

附: :标签自动完成不再工作,所以我无法提供正确的标签。

回答

1

我想你应该看看Zend_Db_Table。它可以让你创建UserTable类。

另外你的控制器没有扩展Zend_Controller_Action怎么来。

你可能想要使用Zend_From或Zend_Validate来验证你的模型。

我的东西你的实现并不是很糟糕,但这篇文章似乎对我来说太老了。

+0

你说得对Zend_Db_Table,但我喜欢能够使用我自己的Select语句连接等,但我会promess。 我只是忘了扩展控制器,但实际上它确实如此。 你对Zend_Form&Zend_Validate是正确的,但是这些表单实际上可以放入一个UserForm类中,除了服务层以外,它们将没有任何关系。谢谢你的回答。 – 2009-09-16 16:03:22

+1

您可以使用Zend_Db_table进行连接,只需要禁用完整性检查即可。希望你用ZF获得一个很好的学习曲线。我从2个月开始使用它,我真的很喜欢它,我刚刚重新发现了PHP。 – RageZ 2009-09-16 16:06:17