2012-02-13 24 views
57

Câu hỏi đặt ra là như sau:Cách lấy đường dẫn máy chủ đến thư mục web trong Symfony2 từ bên trong bộ điều khiển?

Làm thế nào tôi có thể nhận được đường dẫn máy chủ vào thư mục web trong Symfony2 từ bên trong bộ điều khiển (hoặc từ bất cứ nơi nào khác vì lý do đó)

Những gì tôi đã tìm thấy (cũng , bằng cách tìm kiếm ở đây):

này được khuyên trong bài viết sách dạy nấu ăn về xử lý thuyết tập tin

$path = __DIR__ . '/../../../../web'; 

tìm thấy bằng cách tìm kiếm xung quanh, chỉ có thể sử dụng từ bên trong bộ điều khiển (hoặc dịch vụ với ker nel tiêm):

$path = $this->get('kernel')->getRootDir() . '/../web'; 

Vì vậy, có hoàn toàn không có cách nào để có được ít nhất đó là 'web' một phần của con đường? Điều gì xảy ra nếu tôi, ví dụ, quyết định đổi tên nó hoặc di chuyển hay gì đó?

Tất cả mọi thứ đã được dễ dàng trong symfony đầu tiên, khi tôi có thể nhận được như tất cả mọi thứ tôi cần thiết từ bất cứ nơi nào trong mã bằng cách gọi :: get phương pháp tĩnh sfConfig() ..

+0

tôi đã có cùng một vấn đề và phải sử dụng getRootDir(). Đó là thực sự gây khó chịu mà bạn không thể có được đường dẫn đầy đủ đến thư mục/web! : P – ddtpoison777

Trả lời

43

Có thực sự không có cách nào trực tiếp để có được con đường với webdir trong Symfony2 vì khung công tác hoàn toàn độc lập với webdir.

Bạn có thể sử dụng getRootDir() trên cá thể của lớp nhân, giống như bạn viết. Nếu bạn xem xét đổi tên /web thư mục trong tương lai, bạn nên đặt cấu hình đó thành cấu hình. Ví dụ AsseticBundle có một tùy chọn như vậy trong cấu hình DI của nó (xem herehere).

+1

Cảm ơn bạn. Tôi sẽ sử dụng phương thức getRootDir nếu không có gì khác xuất hiện, nó có vẻ là phương pháp hợp lý và phổ biến nhất để làm điều này. – Sylvix

15

Bạn cũng có thể lấy nó từ bất kỳ lớp ContainerAware (fi Controller) từ dịch vụ yêu cầu:

  • Nếu bạn đang sử dụng apache như một máy chủ web (Tôi cho rằng cho khác máy chủ web giải pháp sẽ là tương tự) và đang sử dụng virtualhosting (url của bạn trông như thế này - localhost/app.php sau đó bạn có thể sử dụng:

    $container->get('request')->server->get('DOCUMENT_ROOT'); 
    // in controller: 
    $this->getRequest()->server->get('DOCUMENT_ROOT'); 
    
  • Else (url của bạn trông như thế này - localhost/path/to/Symfony/web/app.php:

    $container->get('request')->getBasePath(); 
    // in controller: 
    $this->getRequest()->getBasePath(); 
    
+0

Cảm ơn câu trả lời của bạn. Nhưng bắt được - Tôi không phải là nhà phát triển duy nhất trong dự án và tôi biết chắc chắn rằng một số người trong số họ không sử dụng máy chủ ảo và một số người làm, tôi đưa vào. Vì vậy, giải pháp nên phổ biến hơn thế ... Đó là lý do tại sao (và xem xét câu trả lời thứ hai) Tôi có thể sử dụng phương thức getRootDir() như một phương thức phổ quát hơn. – Sylvix

+0

Nếu bạn muốn nhận thư mục không có ngữ cảnh yêu cầu, thư mục này sẽ không hoạt động phải không? Giống như lệnh? – tom10271

10

Giải pháp của tôi là để thêm mã này vào các app.php

define('WEB_DIRECTORY', __DIR__); 

Vấn đề là trong mã dòng lệnh có sử dụng hằng số sẽ phá vỡ. Bạn cũng có thể thêm hằng số để ứng dụng giao diện điều khiển tập tin/và môi trường khác front controllers

Một giải pháp khác có thể thêm một phương pháp tĩnh tại AppKernel trả DIR. '/ ../web /' Vì vậy, bạn có thể truy cập ở mọi nơi

39

Để truy cập thư mục gốc từ bên ngoài bộ điều khiển, bạn có thể chỉ cần nhập %kernel.root_dir% làm đối số trong cấu hình dịch vụ của mình.

service_name: 
    class: Namespace\Bundle\etc 
    arguments: ['%kernel.root_dir%'] 

Sau đó, bạn có thể nhận được các mục web root trong constructor lớp:

public function __construct($rootDir) 
{ 
    $this->webRoot = realpath($rootDir . '/../web'); 
} 
11

UPDATE: Từ 2.8 này không còn hoạt động vì assetic không còn được bao gồm theo mặc định. Mặc dù nếu bạn đang sử dụng assetic này sẽ làm việc.

Bạn có thể sử dụng biến %assetic.write_to%.

$this->getParameter('assetic.write_to');

Kể từ khi tài sản của bạn phụ thuộc vào biến này được đổ vào thư mục web của bạn, nó là an toàn để giả định và sử dụng để xác định vị trí thư mục web của bạn.

http://symfony.com/doc/current/reference/configuration/assetic.html

8

Bạn đang trên Symfony, suy nghĩ "Dependency Injection" ^^

Trong tất cả các dự án SF của tôi, tôi làm trong parameters.yml:

web_dir: "%kernel.root_dir%/../web" 

Vì vậy, tôi có thể yên tâm sử dụng thông số này trong bộ điều khiển:

$this->getParameter('web_dir'); 
0

Đối với Symfony3 Trong điều khiển của bạn thử

$request->server->get('DOCUMENT_ROOT').$request->getBasePath() 
0
$host = $request->server->get('HTTP_HOST'); 
$base = (!empty($request->server->get('BASE'))) ? $request->server->get('BASE') : ''; 
$getBaseUrl = $host.$base; 
+0

Không phải là điều này để nhận url yêu cầu, không phải cho đường dẫn hệ thống tệp, như được yêu cầu? –

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