2015-10-13 134 views
2

我運行一個內置在Laravel 4.2中的多租戶網站。在App配置中,我知道您可以設置單個基本網址,例如更改Laravel 4.2內部的應用程序URL Artisan命令

/* 
|-------------------------------------------------------------------------- 
| Application URL 
|-------------------------------------------------------------------------- 
| 
| This URL is used by the console to properly generate URLs when using 
| the Artisan command line tool. You should set this to the root of 
| your application so that it is used when running Artisan tasks. 
| 
*/ 

'url' => 'http://apples.local', 

我已經建立了一個工匠命令提供定期寄送電子郵件給用戶,無論他們通過訪問該網站的域。因此,該命令需要生成具有不同域的URL,例如http://oranges.local

在我的命令,我試圖生成的URL之前改變app.url配置變量,但似乎沒有影響:

Config::set('app.url', 'http://oranges.local'); 
$this->info('App URL: ' . Config::get('app.url')); 
$this->info('Generated:' . URL::route('someRoute', ['foo', 'bar'])); 

儘管在運行時實際改變配置,這還總是產生:

App URL: http://oranges.local 
Generated: http://apples.local/foo/bar 

URL生成器完全忽略了應用程序配置!

我知道我可以設置多個環境並將--env=oranges傳遞給Artisan,但在我的使用案例中,這並不實際。我只想在運行時在站點範圍內設置應用程序url。

任何想法?

+1

從URL生成器(而不是絕對路徑)獲取路由路徑並單獨追加域是否可行?例如,'URL :: route('someRoute',['foo','bar'],false);''會產生'/ foo/bar'。 – benJ

+0

謝謝,是的,我也曾考慮過這個問題,但問題仍然是我的用例。您的建議適用於我自己生成的網址,但我也使用生成自己的網址的套餐,例如。 https://github.com/iwyg/jitimage,這些也需要渲染正確的域名,而不僅僅是默認的根網址。 – Andrew

回答

1

好的,whoacowboy是對的,配置根本沒有被考慮。我發現的是,該網站的基本URL(即使在Artisan命令中)似乎始終來自Symphony Request對象。

因此改變/惡搞裏面工匠域,下面的工作:

Request::instance()->headers->set('host', 'oranges.local'); 

你與變更完成後它可能是明智的,再次恢復的主機名,但至少在我的使用案例,這已經解決了我所有的問題!

0

URL::route()調用$route->domain()後者從$route->action['domain']

/** 
* Get the domain defined for the route. 
* 
* @return string|null 
*/ 
public function domain() 
{ 
    return isset($this->action['domain']) ? $this->action['domain'] : null; 
} 

域所以像它使用Config::get('app.url')設置URL不看。

benJ似乎有個好主意。爲什麼不手動編寫URL?

$emailURL = Config::get('app.url') . '/foo/bar/'並稱之爲一天。

+0

感謝您的建議。重複我對benJ的評論,這對於我自己寫的url是完全可靠的建議,但是像iwyg/jitimage這樣的包用於調整大小/緩存圖像的包會生成自己的url並且它們也需要正確的域。但是,是的,這可能是我最終必須作出的犧牲。 – Andrew