如何修改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 相关文章推荐
基于mysql的论坛(1)
Oct 09 PHP
echo, print, printf 和 sprintf 区别
Dec 06 PHP
学习discuz php 引入文件的方法DISCUZ_ROOT
Jun 21 PHP
PHP 反向排序和随机排序代码
Jun 30 PHP
php用正则表达式匹配中文实例详解
Nov 06 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
Oct 21 PHP
四个PHP非常实用的功能
Sep 29 PHP
php中实现进程锁与多进程的方法
Sep 18 PHP
laravel创建类似ThinPHP中functions.php的全局函数
Nov 26 PHP
PHP获取表单数据与HTML嵌入PHP脚本的实现
Feb 09 PHP
PHP基于堆栈实现的高级计算器功能示例
Sep 15 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
Dec 30 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实现图片简单上传
2006/10/09 PHP
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
laravel实现上传图片,并且制作缩略图,按照日期存放的代码
2019/10/16 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
通用JS事件写法实现代码
2009/01/07 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
如何设置一定时间内只能发送一次请求
2014/02/28 Javascript
jquery实现华丽的可折角广告代码
2015/09/02 Javascript
jQuery实现文本框邮箱输入自动补全效果
2015/11/17 Javascript
Bootstrap每天必学之附加导航(Affix)插件
2016/04/25 Javascript
jQuery插件扩展extend的简单实现原理
2016/06/24 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
2018/06/25 Javascript
详解微信小程序调起键盘性能优化
2018/07/24 Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
2019/08/07 Javascript
微信小程序实现电子签名功能
2020/07/29 Javascript
[01:02:55]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
tensorflow学习笔记之简单的神经网络训练和测试
2018/04/15 Python
numpy判断数值类型、过滤出数值型数据的方法
2018/06/09 Python
我就是这样学习Python中的列表
2019/06/02 Python
python修改文件内容的3种方法详解
2019/11/15 Python
Python基于模块Paramiko实现SSHv2协议
2020/04/28 Python
python中什么是面向对象
2020/06/11 Python
Python Mock模块原理及使用方法详解
2020/07/07 Python
canvas绘制树形结构可视图形的实现
2020/04/03 HTML / CSS
美国网上鞋城:Shoeline.com
2016/11/17 全球购物
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
Juice Beauty官网:有机美容产品,护肤与化妆品
2020/06/13 全球购物
幼儿运动会邀请函
2014/01/17 职场文书
部队党性分析材料
2014/02/16 职场文书
小学生开学感言
2014/02/28 职场文书
乡镇干部先进性教育活动个人整改措施
2014/09/16 职场文书
幼儿园见习报告范文
2014/10/30 职场文书
给校长的建议书作文500字
2015/09/14 职场文书