2012-10-25 21 views
8

Sau khi tìm kiếm một thời gian dài không thành công. trước khi tôi từ bỏ, tôi muốn hỏi:Zend Framework 2 Định tuyến các tên miền phụ thành mô-đun

Có cách nào để định tuyến tên miền phụ cho một mô-đun trong Zend Framework 2? như:

Subdomain =>Mô-đun
api.site.com => api
dev.site.com => dev
admin.site.com => admin
site.com = > public
...

Tôi đã thử làm như thế này nhưng tôi không thể truy cập vào bộ điều khiển khác với mặc định (chỉ mục).

'router' => array(
    'routes' => array(
     'home' => array(
      'type' => 'Hostname', 
      'options' => array(
       'route' => 'site.com', 
       'defaults' => array(
        '__NAMESPACE__' => 'Application\Controller', 
        'controller' => 'Index', 
        'action'  => 'index', 
       ), 
      ) 
     ) 
    ), 
), 

Cảm ơn bạn đã dành thời gian giúp tôi.

Trả lời

5

Zend Framework 2 không có khái niệm định tuyến cho mô-đun; tất cả các ánh xạ định tuyến nằm giữa một mẫu URI (cho các tuyến HTTP) và một lớp điều khiển cụ thể. Điều đó nói rằng, Zend\Mvc cung cấp trình xử lý sự kiện (Zend\Mvc\ModuleRouteListener) cho phép bạn xác định mẫu URI ánh xạ tới nhiều bộ điều khiển dựa trên một mẫu nhất định và giả lập "định tuyến mô-đun". Để xác định một lộ trình như vậy, bạn sẽ đặt này như cấu hình định tuyến của bạn:

'router' => array(
    'routes' => array(
     // This defines the hostname route which forms the base 
     // of each "child" route 
     'home' => array(
      'type' => 'Hostname', 
      'options' => array(
       'route' => 'site.com', 
       'defaults' => array(
        '__NAMESPACE__' => 'Application\Controller', 
        'controller' => 'Index', 
        'action'  => 'index', 
       ), 
      ), 
      'may_terminate' => true, 
      'child_routes' => array(
       // This Segment route captures the requested controller 
       // and action from the URI and, through ModuleRouteListener, 
       // selects the correct controller class to use 
       'default' => array(
        'type' => 'Segment', 
        'options' => array(
         'route' => '/[:controller[/:action]]', 
         'constraints' => array(
          'controller' => '[a-zA-Z][a-zA-Z0-9_-]*', 
          'action'  => '[a-zA-Z][a-zA-Z0-9_-]*', 
         ), 
         'defaults' => array(
          'controller' => 'Index', 
          'action'  => 'index', 
         ), 
        ), 
       ), 
      ), 
     ), 
    ), 
), 

(Click here to see an example of this @ ZendSkeletonApplication)

Đây chỉ là một nửa của sự cân bằng, mặc dù. Bạn cũng phải đăng ký mọi lớp điều khiển trong mô-đun của mình bằng cách sử dụng định dạng đặt tên cụ thể. Điều này cũng được thực hiện thông qua các tập tin cấu hình giống nhau:

'controllers' => array(
    'invokables' => array(
     'Application\Controller\Index' => 'Application\Controller\IndexController' 
    ), 
), 

Mấu chốt mảng là bí danh ModuleRouteListener sẽ sử dụng để tìm ra bộ điều khiển bên phải, và nó phải nằm trong định dạng sau:

<Namespace>\<Controller>\<Action> 

Giá trị được gán cho khóa mảng này là tên đầy đủ của lớp điều khiển.

(Click here to see an example of this @ ZendSkeletonApplication)

LƯU Ý: NẾU bạn không sử dụng ZendSkeletonApplication, hoặc đã gỡ bỏ nó mô-đun ứng dụng mặc định, bạn sẽ cần phải đăng ký ModuleRouteListener thuộc một trong các module của riêng bạn. Click here to see an example of how ZendSkeletonApplication registers this listener

+2

Cảm ơn bạn rất nhiều vì những lời giải thích rõ ràng và chính xác. Tôi lấy giải pháp của bạn. Tôi đã vật lộn rất nhiều về điều này. – Sapher

+0

Điều đó thật tuyệt vời, cảm ơn bạn. – cr125rider

+0

tôi sử dụng mamp pro và tôi tạo một tên miền phụ trên tên máy chủ ảo của tôi vì vậy sau khi tôi sử dụng reseller.myhost.com/test nó là okey nhưng nếu tôi viết reseller.myhost.com nó đi đến chỉ mục của ứng dụng không indexaction của mô-đun của tôi –

4

Nếu tôi hiểu trượt # 39 của DASPRIDS Rounter Presentation một cách chính xác, nó đơn giản như - trên một cơ sở cho mỗi mô-đun - để xác định host tên miền phụ của bạn, ví dụ:

'router' => array(
    'routes' => array(
     'home' => array(
      'type' => 'Hostname', 
      'options' => array(
       'route' => 'api.site.com', 
       'defaults' => array(
        '__NAMESPACE__' => 'Api\Controller', 
        'controller' => 'Index', 
        'action'  => 'index', 
       ), 
      ) 
     ) 
    ), 
), 

Etc, bạn muốn làm điều này cho tất cả các mô-đun một mình.

+0

Xin lỗi nếu nó có vẻ ngớ ngẩn nhưng bạn có phải đăng ký máy chủ ảo mới cho máy chủ web cho tên miền phụ api không? –

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