2013-02-26 30 views
5

Tôi vừa bắt đầu thiết lập một ứng dụng ZF2 mới cho một dự án mới, dựa trên bộ xương ZF2 và đang xem hướng dẫn của họ trên Models.Mô hình ZF2 được chia sẻ giữa các Mô-đun

tl; dr: làm cách nào để chia sẻ Mô hình giữa nhiều mô-đun khác nhau, bằng cách đặt nó ở đâu đó ở cấp cao hơn (bên ngoài/mô-đun)?

Chúng tôi có một số module thiết lập như sau:

/ 
/module/ModuleName 
/module/ModuleName/config 
/module/ModuleName/src 
/module/ModuleName/src/ModuleName 

Tôi chỉ muốn thiết lập một thư mục /module/ModuleName/src/ModuleName/Model/TableName.php, nhưng sau đó tôi nhận ra: bảng mà sẽ cần phải được truy cập trong module khác nữa. Vậy tôi nên làm gì đây?

Tôi có nên đặt thư mục Mô hình vào /module/Model hoặc sẽ được coi là một mô-đun tức là site.com/model (dựa trên cấu hình hiện tại của chúng tôi).

Tôi có nên sao chép và dán mô hình giữa các địa điểm không? Tôi có nên dán các mô hình trở lại trong /vendor/library/Company/Model ở đâu đó không? Không hoàn toàn chắc chắn nếu có một thực hành tốt nhất cho việc này!

Câu hỏi 2: Hướng dẫn cũng đề xuất sử dụng ServiceManager để khởi tạo các mô hình cơ sở dữ liệu để sử dụng cùng một cá thể. Nếu tôi có một mô-đun với 5 bộ điều khiển, với mỗi bộ điều khiển truy cập các bảng hoàn toàn riêng biệt (nói 4 bảng mỗi bảng)? Dường như với tôi rằng nó sẽ redundantly khởi tạo 16 bảng trên mỗi tải trang (cho các bộ điều khiển khác trong mô-đun đó). Một bảng khởi tạo đơn thêm 55ms vào tải trang. Có cách nào để giái quyết vấn đề này không?? Tôi không chắc chắn làm thế nào tôi muốn di chuyển cấu hình để hành động của bộ điều khiển dựa trên những gì hướng dẫn không khởi tạo tablegateway?

Trả lời

8

1)

Bạn có thể sử dụng bất kỳ mô hình từ bất kỳ thành phần trong ứng dụng của bạn, vì vậy họ có thể "chia sẻ". Ví dụ Fro bạn sử dụng ServiceManager để giúp bạn lấy các cá thể của các mô hình (và các lớp khác) trong dự án của bạn.

Service Manager Config:

'factories' => array(
    'AuthService' => function($sm) { 
     $auth = new \Zend\Authentication\AuthenticationService(); 

     return $auth; 
    }, 
    'RoleMapper' => function($sm) { 
     $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
     $mapper = new \Application\Mapper\RoleMapper; 
     $mapper->setDbAdapter($dbAdapter); 
     $mapper->setEntityPrototype(new \Application\Model\Role); 
     $mapper->setHydrator(new \Application\Model\RoleHydrator); 

     return $mapper; 
    }, 
    'UserMapper' => function($sm) { 
     $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
     $mapper = new \MyModule\Mapper\UserMapper; 
     $mapper->setDbAdapter($dbAdapter); 
     $mapper->setEntityPrototype(new \MyModule\Model\User); 
     $mapper->setHydrator($sm->get('UserHydrator')); 

     return $mapper; 
    }, 
    .... 

Như bạn thấy, bạn có thể có các lớp học từ nhiều mô-đun được xác định trong đó. Thông thường, bạn chỉ cần định nghĩa một cấu hình ServiceManager riêng biệt cho mỗi module.

Có gì để ngăn chặn bạn khỏi làm một thể hiện của "UserMapper" bên trong mô-đun ứng dụng của bạn như thế này:

Một số Bộ điều khiển:

$this->getServiceLocator()->get('UserMapper'); 
// Or even grab Zend libraries like this 
$this->getServiceLocator()->get('AuthService'); 

Các ServiceManager sẽ cho phép bạn lấy trường hợp của các lớp học từ bất kỳ các mô-đun của bạn bên trong bất kỳ mô-đun nào khác có vấn đề.

2)

Người quản lý dịch vụ không thực sự làm một thể hiện của bất cứ điều gì cho đến khi bạn yêu cầu nó, vì vậy không có chi phí như bạn đề nghị.

Từ ví dụ trên, không có trường hợp thực sự tạo ra cho đến khi bạn lần đầu tiên yêu cầu một:

$this->getServiceLocator()->get('UserMapper'); // instance now created. 

Nếu bạn không bao giờ hỏi người quản lý dịch vụ cho một "RoleMapper" chẳng hạn, sau đó không có trường hợp được tạo ra.

+0

Cảm ơn rất nhiều vì đã trả lời của bạn Andrew! Bạn đang đúng: # 2, có vẻ như tôi đã nhìn vào điều sai trái trong wincachegrind. Tin tốt! Tôi đã nhìn thấy 'UserMapper' xung quanh rất nhiều trong một vài hướng dẫn - đó chỉ là một ví dụ, hoặc nó là một điều ZF2 thực tế? Liên quan đến # 1: Vì vậy, nếu tôi đăng ký chức năng 'Manufacturing \ Model \ WorkflowTable '=> ($ sm) {..}', thì tôi có thể gọi '$ this-> getServiceLocator() -> get ('Manufacturing \ Model \ WorkflowTable') 'trong bất kỳ thư viện nào khác? Nó sẽ là một thực hành tiêu chuẩn hơn để có một mô-đun cơ sở với các mô hình của chúng tôi ?? – Benno

+0

Có ý tưởng, bạn có thể gọi nó trong bất kỳ mô-đun nào, tất cả các bản ghi dịch vụ quản lý được kết hợp với nhau để bạn có được mọi thứ từ tất cả các mô-đun – Andrew

+0

UserMapper chỉ là một ví dụ mà tôi đã sử dụng, đó là một kịch bản phổ biến để mọi người sử dụng trình ánh xạ DataMapper pattern – Andrew

Các vấn đề liên quan