如何修改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安装全攻略:APACHE
Oct 09 PHP
PHP学习散记_编码(json_encode 中文不显示)
Nov 10 PHP
php开发留言板的CRUD(增,删,改,查)操作
Apr 19 PHP
屏蔽机器人从你的网站搜取email地址的php代码
Nov 14 PHP
解析PHP获取当前网址及域名的实现代码
Jun 23 PHP
PHP仿博客园 个人博客(1) 数据库与界面设计
Jul 05 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
Nov 19 PHP
php基于socket实现SMTP发送邮件的方法
Mar 05 PHP
PHP的时间戳与具体时间转化的简单实现
Jun 13 PHP
php实现图片按比例截取的方法
Feb 06 PHP
php实现微信企业号支付个人的方法详解
Jul 26 PHP
PHP实现的贪婪算法实例
Oct 17 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静态新闻列表自动生成代码
2007/06/14 PHP
常用的php对象类型判断
2008/08/27 PHP
PHP中获取时间的下一周下个月的方法
2014/03/18 PHP
PHP 9 大缓存技术总结
2015/09/17 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
PHP用户注册邮件激活账户的实现代码
2017/05/31 PHP
Javascript miscellanea -display data real time, using window.status
2007/01/09 Javascript
jQuery EasyUI API 中文文档 - EasyLoader 加载器
2011/09/29 Javascript
Jquery操作下拉框(DropDownList)实现取值赋值
2013/08/13 Javascript
使用变量动态设置js的属性名
2014/10/19 Javascript
javascript去掉代码里面的注释
2015/07/24 Javascript
JS截取与分割字符串常用技巧总结
2015/11/10 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
angularJS开发注意事项
2018/05/26 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
解决vue 单文件组件中样式加载问题
2019/04/24 Javascript
JavaScript实现图片的放大缩小及拖拽功能示例
2019/05/14 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
Python批量查询域名是否被注册过
2017/06/21 Python
python 表达式和语句及for、while循环练习实例
2017/07/07 Python
利用Pandas读取文件路径或文件名称包含中文的csv文件方法
2018/07/04 Python
python命令行工具Click快速掌握
2019/07/04 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)
2020/01/06 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
酒店服务实习自我鉴定
2013/09/22 职场文书
电脑租赁公司创业计划书
2014/01/08 职场文书
2014年元旦活动方案
2014/02/15 职场文书
投资意向书范本
2014/04/01 职场文书
明信片寄语大全
2014/04/08 职场文书
2016元旦文艺汇演主持词
2015/07/06 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
2016年党员创先争优公开承诺书
2016/03/25 职场文书
Ruby处理YAML和json数据
2022/04/18 Ruby