如何修改Laravel中url()函数生成URL的根地址


Posted in PHP onAugust 11, 2017

前言

本文主要给大家介绍了修改Laravel中url()函数生成URL的根地址的相关内容,相信大家都晓得 Larevel 的一票帮助函数中有个 url(),可以通过给予的目录生成完整的 URL,是非常方便的一个函数:

// return: https://skin.dev/user/profile
url('user/profile')

但是这玩意生成的 URL 中要补完的部分是框架内部根据 Request 自动判断的,而自动判断出的东西有时候会出错(譬如在套了一层反向代理之类的情况下)。

文档上并没有提到我们要如何才能自定义它生成的 URL 中的根地址和协议头部分(http(s)),这就非常吃瘪了。那我们要咋办呢?

首先我们来看看 url() 被定义的位置:

# File: src/Illuminate/Foundation/helpers.php

/**
 * Generate a url for the application.
 *
 * @param string $path
 * @param mixed $parameters
 * @param bool $secure
 * @return Illuminate\Contracts\Routing\UrlGenerator|string
 */
function url($path = null, $parameters = [], $secure = null)
{
 if (is_null($path)) {
  return app(UrlGenerator::class);
 }

 return app(UrlGenerator::class)->to($path, $parameters, $secure);
}

可以看到,它从 Laravel 的服务容器中解析出了一个 Illuminate\Contracts\Routing\UrlGenerator,并且把参数转交给了这个对象的 to 方法。

而这个 UrlGenerator 类是在 src/Illuminate/Routing/RoutingServiceProvider.php 这个服务提供者中被绑定到服务容器上去的:

/**
 * Register the URL generator service.
 *
 * @return void
 */
protected function registerUrlGenerator()
{
 $this->app['url'] = $this->app->share(function ($app) {
  // 略

  $url = new UrlGenerator(
   $routes, $app->rebinding(
    'request', $this->requestRebinder()
   )
  );

  return $url;
 });
}

这也就意味着我们可以随时通过 url 这个 abstract 来访问服务容器中的这个 UrlGenerator,并且修改它。

而且它也确实暴露了我们需要的方法:forceSchema 和 forceRootUrl。

修改 url() 函数生成的 URL 中的根地址的代码如下:

// 用它提供的方法检测 URL 是否有效
if (app('url')->isValidUrl($rootUrl)) {
 app('url')->forceRootUrl($rootUrl);
}

// 强制生成使用 HTTPS 协议的 URL
app('url')->forceSchema('https');

上面那些代码推荐放在自定义的 ServiceProvider,这样之后所有的 url() 函数生成的链接都会使用上面定义的根地址和协议了。

所以说啊,要真正掌握 Laravel 的那些东西,光看文档还是不够的。而且 Laravel 的源码文档做的很不错,读起来很清晰,能学到不少东西。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
php中使用__autoload()自动加载未定义类的实现代码
Feb 06 PHP
PHP的基本常识小结
Jul 05 PHP
php函数指定默认值方法的小例子
Dec 04 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
Nov 14 PHP
Win7下手动安装apache2.2、php5.4笔记
Apr 03 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 PHP
在WordPress中使用wp_count_posts函数来统计文章数量
Jan 05 PHP
PHP中递归的实现实例详解
Nov 14 PHP
PHP Class SoapClient not found解决方法
Jan 20 PHP
PHP使用ActiveMQ实例
Feb 05 PHP
PHP命名空间与自动加载机制的基础介绍
Aug 25 PHP
PHP扩展安装方法步骤解析
Nov 24 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
Aug 11 #PHP
基于Laravel5.4实现多字段登录功能方法示例
Aug 11 #PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
Aug 11 #PHP
关于PHP中协程和阻塞的一些理解与思考
Aug 11 #PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 #PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
Aug 11 #PHP
Redis在Laravel项目中的应用实例详解
Aug 11 #PHP
You might like
main.php
2006/12/09 PHP
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
2011/11/02 PHP
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
PHP防止表单重复提交的几种常用方法汇总
2014/08/19 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
PHP通过CURL实现定时任务的图片抓取功能示例
2016/10/03 PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
2019/01/10 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
雄兵连第三季海报曝光,艾妮熙德成主角,蔷薇新造型
2021/03/09 国漫
jQuery 常见开发使用技巧总结
2009/12/26 Javascript
jQuery页面滚动浮动层智能定位实例代码
2011/08/23 Javascript
HTML复选框和单选框 checkbox和radio事件介绍
2012/12/12 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
javascript实现切换td中的值
2014/12/05 Javascript
js图片轮播特效代码分享
2015/09/07 Javascript
关于Javascript中document.cookie的使用
2017/03/08 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
2017/08/17 Javascript
layui radio性别单选框赋值方法
2018/08/15 Javascript
Element Popover 弹出框的使用示例
2020/07/26 Javascript
[01:18]一目了然!DOTA2DotA快捷操作对比第一弹
2014/07/01 DOTA
[00:34]TI7不朽珍藏III——纯金地穴编织者饰品展示
2017/07/15 DOTA
[45:15]Optic vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python实现字典的key和values的交换
2015/08/04 Python
Numpy截取指定范围内的数据方法
2018/11/14 Python
详解django中Template语言
2020/02/22 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
2020/05/10 Python
Python3 ffmpeg视频转换工具使用方法解析
2020/08/10 Python
Python如何利用Har文件进行遍历指定字典替换提交的数据详解
2020/11/05 Python
HTML利用九宫格原理进行网页布局
2020/03/13 HTML / CSS
伦敦剧院及景点门票:Encore Tickets
2018/07/01 全球购物
戴尔新西兰官网:Dell New Zealand
2020/01/07 全球购物
幼师自我鉴定范文
2013/10/01 职场文书
给老婆的道歉信
2015/01/20 职场文书
《全神贯注》教学反思
2016/02/22 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书