2013-04-05 57 views
30

Tôi cần truy cập phương thức từ bộ điều khiển khác bên trong bộ điều khiển khác. Tôi làm nó như thế nào? Tôi có thể sử dụng phương thức this->get không?Cách truy cập bộ điều khiển khác từ bên trong bộ điều khiển Symfony2

Tôi có thể bao gồm bộ điều khiển bên trong bộ điều khiển hiện tại của mình và tạo đối tượng của nó và truy cập phương thức thông qua đối tượng không? Là nó "ok" để làm điều đó theo cách này?

Tôi muốn gọi phương thức biểu mẫu --- newAction của bộ điều khiển khác.

+0

Tôi nghĩ bạn không được phép làm điều đó nếu bạn đang theo dõi MVC, bạn nên trích xuất hàm taht thành một Mô hình hoặc đối tượng trợ giúp. – zad

+0

Bạn có thể chỉ cách thực hiện theo cách MVC – chirag7jain

+0

Bạn muốn gì với bộ điều khiển đó? –

Trả lời

34

Bạn có thể xác định bộ điều khiển của mình là dịch vụ, sau đó tải bộ điều khiển đó trong bộ điều khiển khác.

Trong services.yml bạn xác định điều khiển cần thiết như một dịch vụ:

services: 
    your_service_name: 
     class: YourCompany\YourBundle\Controller\YourController 

Sau đó, trong bất kỳ điều khiển bạn sẽ có thể để có được dịch vụ này thông qua container:

$yourController = $this->get('your_service_name'); 

Có một số thông tin hữu ích về Controllers as Services trong tài liệu

+3

Đây có phải là cách tốt nhất để làm điều đó hay không. Có cách nào khác để làm điều đó – chirag7jain

+0

@CJ Vâng, như nó đã được đề cập trong ý kiến, bạn không nên gọi hành động điều khiển trong bộ điều khiển khác.Nhưng từ Symfony2 POV - có bộ điều khiển được định nghĩa là dịch vụ là OK –

+0

Cảm ơn rất nhiều. Tôi chỉ muốn chắc chắn rằng tôi đang theo dõi tốt nhất parctice – chirag7jain

56

Nếu bạn không muốn xác định các lớp như một dịch vụ, vì nó không cảm thấy như là một thực hành tốt với tôi và @Qoop trích dẫn Fabien saying the same, bạn có thể sử dụng chuyển tiếp:

http://symfony.com/doc/current/controller/forwarding.html

public function indexAction($name) 
{ 
    $response = $this->forward('AcmeHelloBundle:Hello:fancy', array(
     'name' => $name, 
     'color' => 'green', 
    )); 

    // ... further modify the response or return it directly 

    return $response; 
} 

Nếu bạn cần nhúng đầu ra của một hành động điều khiển bên trong trong một khuôn mẫu, thì documentation for Symfony cũng có thứ gì đó cho nó.

+0

điều này là sai vì nó sẽ tạo ra phản hồi bằng cách sử dụng mẫu hành động ưa thích thay vì mẫu được liên kết với indexAction – gondo

+1

@gondo, ý của bạn là, nếu bạn sử dụng mẫu bằng chú thích? Yepp. Đúng rồi. Sau đó, bạn sẽ nhận được mẫu được tạo - vì vậy phản hồi vì nó sẽ được gửi lại. Nếu bạn muốn nhận dữ liệu trước khi sử dụng chú thích, thì bạn phải xác định lớp là dịch vụ. – SimonSimCity

+0

Tôi thấy các vấn đề lớn hơn về "chuyển tiếp" khi nói đến thử nghiệm đơn vị. Bạn sẽ không thể giả lập subrequest, khi bạn thay vào đó xác định bộ điều khiển của bạn như một dịch vụ, bạn có thể dễ dàng giả lập nó. – user3746259

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