Tôi đã xây dựng một dịch vụ web đầu tiên trên Zend Framework (1.10), và bây giờ tôi đang tìm cách để tái cấu trúc một số logic trong Bộ điều khiển Hành động để nó dễ dàng hơn cho tôi và những người còn lại trong nhóm của tôi để mở rộng và duy trì dịch vụ.Zend Action Controller - chiến lược tái cấu trúc
Tôi có thể thấy nơi có cơ hội để tái cấu trúc, nhưng tôi không rõ ràng về các chiến lược tốt nhất về cách thức. Các tài liệu và hướng dẫn tốt nhất về các bộ điều khiển chỉ nói về các ứng dụng quy mô nhỏ, và không thực sự thảo luận cách trừu tượng mã lặp đi lặp lại nhiều hơn mà leo lên các quy mô lớn hơn.
Cấu trúc cơ bản cho các bộ điều khiển hành động của chúng tôi là:
- Extract nhắn XML ra khỏi cơ thể theo yêu cầu - Điều này bao gồm xác nhận chống lại một lược đồ RelaxNG hành động cụ thể
- Chuẩn bị phản ứng XML
- Validate dữ liệu trong thông báo yêu cầu (dữ liệu không hợp lệ ném ngoại lệ - một thông báo được thêm vào phản hồi được gửi ngay lập tức)
- Thực hiện hành động cơ sở dữ liệu (chọn/chèn/cập nhật/xóa)
- Return thành công hay thất bại của hành động, với thông tin cần thiết
Một ví dụ đơn giản là hành động này mà trả về một danh sách các nhà cung cấp dựa trên một tập hợp linh hoạt các tiêu chí:
class Api_VendorController extends Lib_Controller_Action
{
public function getDetailsAction()
{
try {
$request = new Lib_XML_Request('1.0');
$request->load($this->getRequest()->getRawBody(), dirname(__FILE__) . '/../resources/xml/relaxng/vendor/getDetails.xml');
} catch (Lib_XML_Request_Exception $e) {
// Log exception, if logger available
if ($log = $this->getLog()) {
$log->warn('API/Vendor/getDetails: Error validating incoming request message', $e);
}
// Elevate as general error
throw new Zend_Controller_Action_Exception($e->getMessage(), 400);
}
$response = new Lib_XML_Response('API/vendor/getDetails');
try {
$criteria = array();
$fields = $request->getElementsByTagName('field');
for ($i = 0; $i < $fields->length; $i++) {
$name = trim($fields->item($i)->attributes->getNamedItem('name')->nodeValue);
if (!isset($criteria[$name])) {
$criteria[$name] = array();
}
$criteria[$name][] = trim($fields->item($i)->childNodes->item(0)->nodeValue);
}
$vendors = $this->_mappers['vendor']->find($criteria);
if (count($vendors) < 1) {
throw new Api_VendorController_Exception('Could not find any vendors matching your criteria');
}
$response->append('success');
foreach ($vendors as $vendor) {
$v = $vendor->toArray();
$response->append('vendor', $v);
}
} catch (Api_VendorController_Exception $e) {
// Send failure message
$error = $response->append('error');
$response->appendChild($error, 'message', $e->getMessage());
// Log exception, if logger available
if ($log = $this->getLog()) {
$log->warn('API/Account/GetDetails: ' . $e->getMessage(), $e);
}
}
echo $response->save();
}
}
Vì vậy, - biết nơi những đặc tính chung trong các bộ điều khiển của tôi, chiến lược tốt nhất cho việc tái cấu trúc là gì trong khi vẫn giữ nó giống như Zend và cũng có thể kiểm thử với PHPUnit?
Tôi đã suy nghĩ về việc trừu tượng hóa logic điều khiển thành lớp cha (Lib_Controller_Action), nhưng điều này làm cho việc kiểm thử đơn vị phức tạp hơn theo cách mà dường như tôi sai.
Có thể đẩy tính phổ biến vào các lớp dịch vụ/kho lưu trữ? Các lớp như vậy sẽ có thể kiểm tra được, có thể sử dụng được trên các bộ điều khiển và có thể làm cho mã điều khiển nhỏ gọn hơn. –
Một cách tiếp cận khác là thu thập tính phổ biến thành người trợ giúp hành động. –