2015-03-31 63 views
1

我試圖從composer包中找到我的應用程序的基礎目錄。有沒有一個作曲家API或適當的方式來完成這一點。如何從composer包中找到供應商安裝的基本目錄

爲了澄清,如果我的包安裝這個樣子的,我在這裏已經有文件(使用PSR-4):

/home/project/vendor/Acme/my-package/src/ 

我怎樣才能找到/家庭/項目動態?

更新的信息:

我試圖加載從包含從包內通過Dotenv包中的API URL端點根.ENV文件。

+1

我想知道爲什麼你需要你所包含的項目的物理位置。這不知何故說明了對外部世界的依賴,並且可能應該通過要求包的用戶提供該路徑而不是自動檢測它來處理。 – Sven 2015-03-31 18:25:32

+0

更新的問題與更多的信息。 – dcbarans 2015-03-31 18:34:43

+1

基於你的意見,我看到你建議我應該通過構造函數按需加載數據..這是一個更簡單的解決方案 – dcbarans 2015-03-31 18:39:31

回答

0

從@Sven最好最乾淨的解決方案是收集類初始化的輸入並將配置保留在程序包外。

0

啊..我想我已經想通了..

,因爲我用include_once './vendor/autoload.php';在我的index.php我可以只使用getcwd()基於輸入包

+2

不,您不能,因爲在應用程序執行過程中,該值可能會隨時更改。 – Sven 2015-03-31 18:23:47

1

這應該這樣做:

<?php 

$root = null; 

// Set the current directory. 
// Make sure you set this up so 
// that you get out of your own root. 
// Assuming this php file is at the root 
// of this composer package, this should suffice. 
$directory = dirname(__FILE__); 

// Go up until you find a composer.json file 
// which should exist in the ancestors 
// because its a composer package. 
do { 
    $directory = dirname($directory); 
    $composer = $directory . '/composer.json'; 
    if(file_exists($composer)) $root = $directory; 
} while(is_null($root) && $directory != '/'); 

// We either are at the root or we got lost. 
// i.e. a composer.json was nowhere to be found. 
if(!is_null($root)) 
{ 
    // Yay! we are at the root. 
    // and $root contains the path. 
    // Do whatever you seem fit! 
    bootstrapOrSomething(); 
} 
else 
{ 
    // Oh no! Can we default to something? 
    // Or just bail out? 
    throw new Exception('Oops, did you require this package via composer?'); 
} 

@sven有可能的情況下這種策略可能會有所幫助。像任何項目的常規控制檯應用程序(phar)一樣,爲了避免全局安裝,但仍然加載一個bootsrap文件。 Composer允許將bin文件安裝在根目錄https://getcomposer.org/doc/articles/vendor-binaries.md上,但允許用戶將phar文件放在他們認爲合適的地方是一個優點。

有人可能會討論控制的倒置,但是有時候,簡單應該會發揮作用。

相關問題