如何修改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 相关文章推荐
检测png图片是否完整的php代码
Sep 06 PHP
PHP学习笔记之一
Jan 17 PHP
php邮件发送,php发送邮件的类
Mar 24 PHP
php数据库抽象层 PDO
May 07 PHP
ThinkPHP分页类使用详解
Mar 05 PHP
分享常见的几种页面静态化的方法
Jan 08 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
Dec 15 PHP
thinkphp验证码的实现(form、ajax实现验证)
Jul 28 PHP
PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)
Nov 15 PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
Laravel自动生成UUID,从建表到使用详解
Oct 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
PHP中调用SVN命令更新网站方法
2015/01/07 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
jQuery插件pagination实现分页特效
2015/04/12 Javascript
jQuery Timelinr实现垂直水平时间轴插件(附源码下载)
2016/02/16 Javascript
jQuery短信验证倒计时功能实现方法详解
2016/05/25 Javascript
解析js如何获取css样式
2016/12/11 Javascript
Vue 实现双向绑定的四种方法
2018/03/16 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
2019/04/17 Javascript
javascript+HTML5 canvas绘制时钟功能示例
2019/05/15 Javascript
使用react context 实现vue插槽slot功能
2019/07/18 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
vue-cli中实现响应式布局的方法
2021/03/02 Vue.js
[03:58]2014DOTA2国际邀请赛 龙宝赛后解密DK获胜之道
2014/07/14 DOTA
TensorFlow实现MLP多层感知机模型
2018/03/09 Python
python面向对象实现名片管理系统文件版
2019/04/26 Python
图文详解python安装Scrapy框架步骤
2019/05/20 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
Stefania Mode英国:奢华设计师和时尚服装
2017/10/23 全球购物
飞利浦法国官网:Philips法国
2019/07/10 全球购物
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
27个经典Linux面试题及答案,你知道几个?
2013/01/10 面试题
既然说Ruby中一切都是对象,那么Ruby中类也是对象吗
2013/01/26 面试题
大学生个人求职信范文
2013/09/21 职场文书
生物技术毕业生自荐信
2013/10/23 职场文书
大学生个人简历自我评价
2013/11/16 职场文书
师范学院美术系毕业生自我鉴定
2014/01/29 职场文书
银行优秀员工事迹
2014/02/06 职场文书
关于雷锋的演讲稿
2014/05/10 职场文书
李敖北大演讲稿
2014/05/24 职场文书
机关领导查摆四风思想汇报
2014/09/13 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android
Python中re模块的元字符使用小结
2022/04/07 Python
在Docker容器中部署SQL Server
2022/04/11 Servers