如何修改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 相关文章推荐
简单采集了yahoo的一些数据
Feb 14 PHP
require(),include(),require_once()和include_once()区别
Mar 27 PHP
PHP Pear 安装及使用
Mar 19 PHP
ie6 动态缩略图不显示的原因
Jun 21 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
May 27 PHP
yii2.0实现验证用户名与邮箱功能
Dec 22 PHP
Smarty高级应用之缓存操作技巧分析
May 14 PHP
php格式化时间戳
Dec 17 PHP
php获取POST数据的三种方法实例详解
Dec 20 PHP
php实现文件管理与基础功能操作
Mar 21 PHP
Windows下wamp php单元测试工具PHPUnit安装及生成日志文件配置方法
May 28 PHP
aec加密 php_php aes加密解密类(兼容php5、php7)
Mar 14 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
Protoss魔法科技
2020/03/14 星际争霸
关于php程序报date()警告的处理(date_default_timezone_set)
2013/10/22 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
ThinkPHP3.1新特性之G方法的使用
2014/06/19 PHP
php调用KyotoTycoon简单实例
2015/04/02 PHP
[原创]php token使用与验证示例【测试可用】
2017/08/30 PHP
用javascript实现的图片马赛克后显示并切换加文字功能
2007/04/21 Javascript
Riot.js 快速的JavaScript单元测试框架
2009/11/09 Javascript
web页面数据展示新想法(json)
2010/06/08 Javascript
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
jquery的map与get方法详解
2013/11/04 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
JavaScript中操作字符串小结
2015/05/04 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
JavaScript使用键盘输入控制实现数字验证功能
2016/08/19 Javascript
详解JS-- 浮点数运算处理
2016/11/28 Javascript
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
VUE 实现滚动监听 导航栏置顶的方法
2018/09/11 Javascript
JS 数组随机洗牌的实例代码
2018/09/12 Javascript
vue列表单项展开收缩功能之this.$refs的详解
2019/05/05 Javascript
原生js 实现表单验证功能
2021/02/08 Javascript
django表单实现下拉框的示例讲解
2018/05/29 Python
Django 外键的使用方法详解
2019/07/19 Python
python中使用while循环的实例
2019/08/05 Python
Python函数式编程实例详解
2020/01/17 Python
Python模块zipfile原理及使用方法详解
2020/08/04 Python
Python扫描端口的实现
2021/01/25 Python
德国购买踏板车网站:Microscooter
2019/10/14 全球购物
Oracle快照(snapshot)
2015/03/13 面试题
公司担保书格式范文
2014/05/12 职场文书
义诊活动总结
2015/02/04 职场文书
公务员个人总结
2015/02/12 职场文书
2015年精神文明建设工作总结
2015/04/21 职场文书
撤回我也能看到!教你用Python制作微信防撤回脚本
2021/06/11 Python
Java 多态分析
2022/04/26 Java/Android