Laravel - Artisan提供了错误的基本网址

med*_*ock 7 php laravel laravel-4

我的app/config/app.php有

'url' => 'http://dev.domain.com/something/somethingElse'
Run Code Online (Sandbox Code Playgroud)

然后我有一个可以从应用程序和工匠命令调用的函数.但URL::route('myRoute')返回不同的结果.当从应用程序调用它返回时http://dev.domain.com/something/somethingElse/myRoute,但在artisan命令中http://dev.domain.com/myRoute.

URL::to 有相同的行为.

注意:我没有为可能覆盖全局环境的其他环境定义任何其他app.php文件.

任何想法为什么会这样?谢谢!

小智 10

Laravel生成的URL由许多部分组成:

  • 方案:http://,https://,等.
  • 主持人:dev.domain.com,localhost,等.
  • 基数:( something/somethingElseWeb服务器上的子目录)
  • 尾巴:myRoute,(Laravel路线参数)

然后连接这些部分以形成URL.

最终,Laravel使用$_SERVER请求变量生成URL .函数prepareBaseUrl()in Symfony\Component\HttpFoundation\Request最终用于确定URL 的基本部分.

当您通过Web浏览器发出请求时,请求将转到~/public/index.php必要的$_SERVER变量,并使用正确的信息填充Laravel以填充URL 的基本部分.

但是,当您在命令行上使用Artisan发出请求时,请求将转到~/artisan脚本.这意味着$_SERVER变量不会以相同的方式填充,并且Laravel无法确定URL 的基本部分; 相反,它返回一个空字符串''.

根据我的发现,看起来Laravel团队没有任何兴趣使应用程序能够在子目录中开箱即用,例如Bugfix:子文件夹的域路由.

我最终以@medowlock描述的方式解决了我将从命令行调用的脚本,例如:

Config::get('app.url') . URL::route('route.name', ['parameter'=>'value'], false)

这样可以将应用程序URL的设置app/config/app.php相对 URL路径.


Max*_*lle 7

如果使用Laravel 4.2,则可以调用该URL::forceRootUrl函数来明确定义laravel应用程序的根URL.

URL::forceRootUrl( Config::get('app.url') );
Run Code Online (Sandbox Code Playgroud)

URL::to在强制使用根URL后,调用将在您的应用配置文件中使用URL定义.

不幸的是,这在Laravel 4.1或Laravel 4.0中不可用

  • 多谢你们.我决定将它放在我的AppServiceProvider中,在boot()方法中.它的工作就像一个魅力. (2认同)