2011-08-27 21 views
15

Tôi đang sử dụng PHP Storm làm IDE của mình, nhưng tôi tin rằng các IDE khác như Netbeans sẽ có cùng vấn đề như tôi sẽ giải thích bên dưới.Bảo toàn khả năng tự động hoàn thành với Symfony2 Dependency Injection

Khi sử dụng một khung công tác như Symfony2, chúng tôi có thêm thế giới tuyệt vời về Dependency Injection. Vì vậy, các đối tượng có thể được khởi tạo đơn giản bằng cách sử dụng mã như đoạn mã sau:

$myThingy = $this->get('some_cool_service'); 

Điều này rất tiện dụng vì các đối tượng đã được định cấu hình trước đó. Một vấn đề là, tự động hoàn thành phá vỡ hoàn toàn về cơ bản bất kỳ IDE PHP nào, vì IDE không biết kiểu get() đang trả về.

Có cách nào để bảo vệ hoàn thành tự động không? Việc tạo ra ví dụ như một phần mở rộng của Controller có phải là câu trả lời không? Ví dụ:

class MyController extends Controller { 
    /** 
    * @return \MyNamespace\CoolService 
    */ 
    public getSomeCoolService() { 
     return new CoolService(); 
    } 
} 

và sau đó cho bộ điều khiển ứng dụng, hãy chỉ định MyController làm lớp cơ sở thay vì Bộ điều khiển?

Điều gì về việc sử dụng lớp Nhà máy hoặc bất kỳ phương pháp khả thi nào khác?

+0

Có phải vấn đề mà nó không biết đó là một đối tượng hay không biết đó là đối tượng của một lớp cụ thể không? Nếu đó là trước đây, bạn không thể bỏ $ myThingy làm đối tượng? '$ myThingy = (đối tượng) $ this-> get ('some_cool_service');' – DaveRandom

+0

Đúng, nhưng thậm chí việc truyền tới một đối tượng vẫn sẽ để nguyên IDE không biết gì về kiểu lớp thể hiện, nghĩa là ... vẫn không tự động - hoàn thành thật đáng buồn. :( –

+0

Những thứ tương tự như tôi đã có: http://stackoverflow.com/questions/21936380/best-practise-including-code-completion-in-zf2, cùng một giải pháp nhưng tất cả đều cần thêm công việc – Gizzmo

Trả lời

15

Đó là sự tham gia của hơn, nhưng bạn vẫn có thể làm điều này với nhật thực PDT:

$myThingy = $this->get('some_cool_service'); 
/* @var $myThingy \MyNamespace\CoolService */ 

CẬP NHẬT: Ví dụ trên this page cho thấy bạn cũng có thể sử dụng theo chiều ngược lại với phpStorm:

$myThingy = $this->get('some_cool_service'); 
/* @var \MyNamespace\CoolService $myThingy */ 
+1

Điều này không bao giờ làm việc trong Eclipse của tôi – gilden

+0

@gilden: Tôi đã từng làm điều này mà không có không gian tên, tôi không chắc chắn 100% nó hoạt động, nhưng nếu chắc chắn nên – greg0ire

+0

Chỉ cần thử nó một lần nữa và yeah ... không làm việc cho tôi. Tôi có thể Ctrl + click vào chú thích để mở tập tin corrent mặc dù tôi thực sự muốn nó làm việc – gilden

7

Bạn có thể xác định các thuộc tính riêng tư trong bộ điều khiển của mình

class MyController extends Controller 
{ 
    /** 
    * @var \Namespace\To\SomeCoolService; 
    */ 
    private $my_service; 

    public function myAction() 
    { 
     $this->my_service = $this->get('some_cool_service'); 
     /** 
     * enjoy your autocompletion :) 
     */ 
    } 
} 
+0

Điều này có vẻ như là một sự khởi đầu, vâng. –

+0

Bằng cách này bạn không thể biết trong mã nếu '$ this-> my_service' đã được bắt đầu. Tôi sẽ sử dụng cách tiếp cận này chỉ với tiêm constructor. –

+0

@barius Yep, tôi đã tìm thấy cách tiếp cận tốt nhất để chỉ sử dụng getters và làm loại gợi ý của tôi ở đó cho bộ điều khiển. – gilden

1

Tôi sử dụng Komodo Studio và gắn thẻ biến với @var, ngay cả trong các phương thức, bảo toàn tính năng tự động hoàn thành cho tôi.

namespace MyProject\MyBundle\Controller; 

use Symfony\Component\DependencyInjection\ContainerAware; 
use Symfony\Component\HttpFoundation\Request; 

class WelcomeController extends ContainerAware 
{ 
    public function indexAction() 
    { 
     /*@var Request*/$request = $this->container->get('request'); 
     $request->[autocomplete hint list appears here] 
    } 
} 
0

làm việc với NetBeans IDE 7.1.2 PHP

+0

có nó hoạt động như thế này:/* @var $ em \ Doctrine \ ORM \ EntityManager */ – ivoba

6

tôi sử dụng lớp điều khiển cơ sở cho bó. Bạn cần chú thích phương thức trả về. Ít nhất là nó hoạt động trên Eclipse.

/** 
* Gets SomeCoolService 
* 
* @return \Namespace\To\SomeCoolService 
*/ 
protected function getSomeCoolService() 
{ 
    return $this->get('some_cool_service'); 
} 

Tôi không thích/* var ... * /, bởi vì quá nhiều mã. Tôi không thích các thuộc tính riêng tư, bởi vì bạn có thể giả định sai rằng các dịch vụ đã được tải.

+0

Đồng ý về câu trả lời này, tôi đã tìm thấy nó là giải pháp sạch nhất cho các trường hợp bạn cần sự phụ thuộc trong lớp hơn 1 thời gian. – Inoryy

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