2012-11-01 26 views
6

Tôi đã thêm mô-đun ZfcUser vào ứng dụng Zend Framework 2 của mình. Nhưng tôi phải sử dụng bảng cơ sở dữ liệu hiện có, có tên cột hơi khác với cấu trúc bảng mặc định cho ZfcUser.ZF2: Trình ánh xạ người dùng tùy chỉnh cho mô-đun ZfcUser

Trong ZfcUser wiki page nó nói rằng có thể sử dụng công cụ lập bản đồ tùy chỉnh nếu mô hình của tôi không phù hợp với giao diện được cung cấp. Và vì bảng cơ sở dữ liệu của tôi khác với mặc định, lớp thực thể người dùng của tôi cũng khác với tiêu chuẩn ZfcUser \ Entity \ User. Nhưng tôi có thể nói ZfcUser để làm việc với lớp của riêng tôi dễ dàng bằng cách ghi đè thiết lập trong file config/autoload/zfcuser.global.php:

'user_entity_class' => 'MyApp\Entity\MyUser', 

Nhưng `ve không tìm thấy một cách dễ dàng để nói ZfcUser để sử dụng lớp bản đồ của tôi cho đến nay.

Tôi đã chỉ phát hiện ra rằng ánh xạ được tạo ra bởi ZfcUser \ Module :: getServiceConfig() bên trong đó, tôi có thể thấy được ánh xạ được trả về từ chức năng nhà máy:

// ... 
public function getServiceConfig() 
{ 
    return array(
    // ... 
     'factories' => array(
      // ... 
      'zfcuser_user_mapper' => function ($sm) { 
       $options = $sm->get('zfcuser_module_options'); 
       $mapper = new Mapper\User(); 
       $mapper->setDbAdapter($sm->get('zfcuser_zend_db_adapter')); 
       $entityClass = $options->getUserEntityClass(); 
       $mapper->setEntityPrototype(new $entityClass); 
       $mapper->setHydrator(new Mapper\UserHydrator()); 
       return $mapper; 
      }, 
      // ... 

Có cách nào để làm cho ZfcUser sử dụng lớp người lập bản đồ người dùng tùy chỉnh của tôi?

Trả lời

4

Tôi đã gặp sự cố tương tự như bạn nhưng cuối cùng cũng đã đăng nhập vào ứng dụng của tôi. Tôi theo lời khuyên của Rob và tạo ra nhà máy dịch vụ của riêng mình trong mô-đun người dùng hiện tại của tôi. Thật không may Bernhard cũng là điểm trên. Bạn phải đào sâu vào mã nguồn ZfcUser để làm cho nó hoạt động. Dự án tôi đang làm bây giờ có một máy chủ MSSQL và tôi phải nói rằng nó đã được khó khăn nhận được một xử lý về mọi thứ. Tôi đã kết thúc chỉ tinh chỉnh một chức năng trong nguồn ZfcUser để có được trang đăng nhập hoạt động.

Tôi chỉ cần đăng nhập chức năng cho ứng dụng hiện tại, nhưng dự án sắp tới sẽ có nhiều vai trò hơn. Tôi đang tìm kiếm thứ gì đó không quá phức tạp để kết nối nhanh chóng, đồng thời cung cấp thêm nhiều lựa chọn và khả năng cho tương lai.

Dưới đây là những gì tôi đã làm cho bây giờ và những gì tôi đã học được:

tôi sao chép các thư mục Entity và Mapper từ thư mục ZfcUser qua b2bUser hiện tại của tôi (mô-đun của tôi) thư mục. Mọi thứ ... ngay cả thư mục Ngoại lệ bên trong Mapper. Nó có thể không cần thiết, nhưng tôi không có tâm trạng để tìm ra sự phụ thuộc.

Trong tập tin zfcuser.global.php, cấu hình hoạt động của tôi trông như sau:

'user_entity_class' => 'b2bUser\Entity\User', 
'enable_registration' => false, 
'enable_username' => true, 
'auth_identity_fields' => array('username'), 
'login_redirect_route' => 'home', 
'enable_user_state' => false, 

tôi rời khỏi phần còn lại của các thiết lập về mặc định. Tôi đã xóa tùy chọn email khỏi danh tính xác thực vì họ sẽ không sử dụng địa chỉ email để đăng nhập vào hệ thống. user_entity_class là hình tôi đã sao chép qua ...

Mô-đun.php (b2bUser) sao chép sau đây để cấu hình quản lý dịch vụ:

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

Sau khi thiết lập được thực hiện, tôi đã thay đổi không gian tên, vv của các tập tin trong Entity và Mapper để phản ánh ngôi nhà mới của họ. Đã thay đổi Thực thể và Giao diện để phản ánh cấu trúc dữ liệu của riêng tôi. Tôi đã làm tương tự với các tệp Mapper và đảm bảo rằng các tên biến trong tệp Hydrator giống với tên cột cơ sở dữ liệu của tôi.

Tôi đã để tệp AbstractDbMapper ở vị trí cũ. Nhưng đây là tập tin tôi đã chỉnh sửa một chút.

Đây là diện mạo của tôi. Người tài xế SQLSRV đầy pooh, phàn nàn trong suốt thời gian về một đối tượng hoặc một chuỗi ...

protected function select(Select $select, $entityPrototype = null, HydratorInterface $hydrator = null) 
{ 
    $this->initialize(); 
    $selectString = $this->getSlaveSql()->getSqlStringForSqlObject($select); 
    $stmt = $this->getDbAdapter()->driver->createStatement($selectString); 
    $stmt->prepare(); 
    $res = $stmt->execute($stmt); 

    $resultSet = new HydratingResultSet($hydrator ?: $this->getHydrator(), 
      $entityPrototype ?: $this->getEntityPrototype()); 
    $resultSet->initialize($res); 
    return $resultSet; 
} 

Và đó là lý đó. Tôi hy vọng nó giúp một người nào đó để có được nó và chạy trên hệ thống của mình ít nhất. Tôi sẽ không để tôi như thế này, nhưng đó là một nhiệm vụ để nó hoạt động.

+0

Cảm ơn bạn! Tôi đã tìm kiếm các thông tin rất giống nhau, và với sự giúp đỡ của bài viết của bạn, tôi quản lý để tải lại các lớp Entity và Mapper của zfcUser được sử dụng với DB của tôi và chức năng mở rộng của Entity! – Brock

0

Hiện tại dường như không có cách nào dễ dàng để thay đổi cấu trúc bảng mà không sửa đổi nguồn ZfcUser. Có một yêu cầu kéo trên Github rằng nên giải quyết vấn đề này:

https://github.com/ZF-Commons/ZfcUser/pull/174

3

Ceate xưởng dịch vụ của riêng bạn cho zfcuser_user_mapper và nó sẽ được sử dụng.

+1

Có thể đó chính xác là những gì tôi đang tìm kiếm. Câu hỏi đặt ra là làm thế nào để làm điều đó. –

+1

thêm một mục nhập cho zfcuser_user_mapper vào Module.php của bạn. đảm bảo rằng mô-đun của bạn được tải sau khi ZfcUser, nó sẽ ghi đè lên mặc định. để xem bây giờ zfcuser_user_mapper được cấu hình, xem Module.php của ZfcUser. Tôi ngạc nhiên rằng vấn đề của bảng tùy chỉnh đã được ra khỏi đó trong một thời gian mà không có một sự thay đổi trong codebase chính thức. bạn có thể muốn nhìn vào ngã ba của tôi tại https://github.com/thoaionline/ZfcUser – thoaionline

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