我的app / config / app.php有
'url' => 'http://dev.domain.com/something/somethingElse'
然后我有一个可以从应用程序和artisan命令调用的函数。但URL::route('myRoute')
会返回不同的结果。从应用程序调用时,它返回http://dev.domain.com/something/somethingElse/myRoute
,但在artisan命令http://dev.domain.com/myRoute
中。
URL::to
具有相同的行为。
注意:我没有为可能覆盖全局环境的其他环境定义任何其他app.php文件。
为什么会这样? 谢谢!
答案 0 :(得分:10)
Laravel生成的URL由许多部分组成:
http://
,https://
等dev.domain.com
,localhost
等something/somethingElse
(Web服务器上的子目录)myRoute
,(Laravel路线参数)然后连接这些部分以形成URL。
最终,Laravel使用$_SERVER
请求变量生成URL。 prepareBaseUrl()
中的Symfony\Component\HttpFoundation\Request
函数最终用于确定网址的 base 部分。
当您通过网络浏览器发出请求时,请求会转到~/public/index.php
,并且必要的$_SERVER
变量会填充正确的信息,以便Laravel填充基础网址的一部分。
但是,当您在命令行上使用Artisan发出请求时,请求将转到~/artisan
脚本。这意味着$_SERVER
变量没有以相同的方式填充,Laravel无法确定URL的 base 部分;相反,它返回一个空字符串''
。
从我所能发现的情况来看,Laravel团队似乎没有任何兴趣使应用程序能够在子目录中开箱即用,例如: Bugfix: domain routing for subfolder
我最终以@medowlock描述的方式解决了我将从命令行调用的脚本,例如:
Config::get('app.url') . URL::route('route.name', ['parameter'=>'value'], false)
这会连接app/config/app.php
中设置的应用程序网址和相对网址路径。
答案 1 :(得分:6)
如果您使用Laravel 4.2,则可以调用URL::forceRootUrl
函数来明确定义laravel应用程序的根URL。
URL::forceRootUrl( Config::get('app.url') );
在强制使用根网址后,对URL::to
的调用将使用您的应用配置文件中的网址定义。
不幸的是,这在Laravel 4.1或Laravel 4.0中不可用