Làm thế nào để lấy mã gốc của ứng dụng Symfony2?


121

Cách tốt nhất để lấy thư mục ứng dụng gốc từ bên trong bộ điều khiển là gì? Có thể lấy nó ra bên ngoài bộ điều khiển không?

Bây giờ tôi lấy nó bằng cách chuyển nó (từ các tham số) đến dịch vụ dưới dạng một đối số, như thế này:

services:

    sr_processor:
        class: Pro\Processor
        arguments: [%kernel.root_dir%]

Có cách nào tốt hơn, đơn giản hơn để lấy thông tin này trong Symfony2 không?


13
giải pháp của bạn là tốt nhất
Inoryy

4
bạn đang trộn lẫn một dịch vụ và một bộ điều khiển yo
john Smith

4
Một lần nữa cho Symfony 3.3 trở đi sử dụng %kernel.project_dir%để root dự án của bạn.
Muzafar Ali

1
hãy chắc chắn để đóng gói literals trong dấu ngoặc kép: ["%kernel.root_dir%"]
ochitos

Câu trả lời:


220

CẬP NHẬT 2018-10-21:

Kể từ tuần này, getRootDir()không được dùng nữa. Vui lòng sử dụng getProjectDir()thay thế, theo đề xuất trong phần bình luận của Muzaraf Ali.

—-

Dùng cái này:

$this->get('kernel')->getRootDir();

Và nếu bạn muốn root web :

$this->get('kernel')->getRootDir() . '/../web' . $this->getRequest()->getBasePath();

điều này sẽ hoạt động từ phương thức hành động của bộ điều khiển ...

CHỈNH SỬA: Đối với các dịch vụ, tôi nghĩ cách bạn đã làm nó càng rõ ràng càng tốt, mặc dù tôi sẽ chuyển dịch vụ hạt nhân hoàn chỉnh làm đối số ... nhưng điều này cũng sẽ thực hiện thủ thuật ...


3
+1 nhưng không chính xác cho symfony2. Sử dụng thay thế:$this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();
Sebastian

36
Giải pháp này chỉ phù hợp với bộ điều khiển. Ở đây vấn đề là về dịch vụ. Dù sao thì, tại sao lại truyền toàn bộ vùng chứa chỉ để lấy một biến? Đó là tốt hơn để vượt qua chỉ% kernel.root_dir%
Massimiliano Arione

2
Massimiliano là đúng, và như một sự bổ sung, tôi sử dụng $this->container->getParameter('kernel.cache_dir')trong các bộ điều khiển thay vì giải pháp mà bạn cung cấp
lackovic10

2
Đây là chủ đề nhiều hơn về dịch vụ của bạn đã containertiêm :) Nếu bạn làm theo các phương pháp hay nhất, hãy tiêmcontainer nên tránh bằng mọi giá. Đối với các giải pháp nhận được webthư, tôi vẫn sử dụng một trong tôi cung cấp ở trên;)
Jovan Perovic

4
Kể từ Symfony 3.3 trở đi sử dụng %kernel.project_dir%/web/thay vì%kernel.root_dir%/../web/
Muzafar Ali


8

Nếu bạn đang sử dụng đường dẫn này để truy cập vào các phần của dự án không phải là mã (ví dụ: thư mục tải lên hoặc cơ sở dữ liệu SQLite) thì tốt hơn nên chuyển đường dẫn thành một tham số, như sau:

parameters:
    database_path: '%kernel.root_dir%/../var/sqlite3.db'

Tham số này có thể được đưa vào mọi nơi bạn cần, vì vậy bạn không cần phải lo lắng về các đường dẫn trong mã của mình nữa. Ngoài ra, tham số có thể được ghi đè tại thời điểm triển khai. Cuối cùng, mọi lập trình viên bảo trì sẽ có một ý tưởng tốt hơn bạn đang sử dụng nó để làm gì.

Cập nhật: Đã sửa lỗi sử dụng hằng số kernel.root_dir.


6

Ngoài ra, bạn cũng có thể sử dụng biểu thức chính quy:

    $directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/yourbundle/';
    $directoryPath = preg_replace("/app..../i", "", $directoryPath);
    echo $directoryPath;

2

Vì Symfony 3.3, bạn có thể sử dụng ràng buộc, như

services:
_defaults:
    autowire: true      
    autoconfigure: true
    bind:
        $kernelProjectDir: '%kernel.project_dir%'

Sau đó, bạn có thể sử dụng tham số $ kernelProjectDir trong bất kỳ dịch vụ điều khiển HOẶC nào. Giống như

class SomeControllerOrService
{
    public function someAction(...., $kernelProjectDir)
    {
          .....
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.