如何修改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.MVC的模板标签系统(二)
Sep 05 PHP
站长助手-网站web在线管理程序 v1.0 下载
May 12 PHP
PHP中的extract的作用分析
Apr 09 PHP
php array_map array_multisort 高效处理多维数组排序
Jun 11 PHP
zen cart新进商品的随机排序修改方法
Sep 10 PHP
php中sprintf与printf函数用法区别解析
Feb 17 PHP
使用Discuz关键词服务器实现PHP中文分词
Mar 11 PHP
php动态变量定义及使用
Jun 10 PHP
PHP中FTP相关函数小结
Jul 15 PHP
PHP多维数组排序array详解
Nov 21 PHP
PHP chop()函数讲解
Feb 11 PHP
在laravel中实现事务回滚的方法
Oct 10 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
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
php生成扇形比例图实例
2013/11/06 PHP
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
php实现数组中出现次数超过一半的数字的统计方法
2018/10/14 PHP
jQuery中:image选择器用法实例
2015/01/03 Javascript
移动端滑动插件Swipe教程
2016/10/16 Javascript
Bootstrap CSS布局之表单
2016/12/17 Javascript
微信小程序中hidden不生效原因的解决办法
2017/04/26 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
封装运动框架实战左右与上下滑动的焦点轮播图(实例)
2017/10/17 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
vue2.0路由切换后页面滚动位置不变BUG的解决方法
2018/03/14 Javascript
微信小程序引入VANT组件的方法步骤
2019/09/19 Javascript
js实现无限层级树形数据结构(创新算法)
2020/02/27 Javascript
JS中的const命令你真懂它吗
2020/03/08 Javascript
python开发中module模块用法实例分析
2015/11/12 Python
Python简单实现自动删除目录下空文件夹的方法
2017/08/29 Python
PyCharm 常用快捷键和设置方法
2017/12/20 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
Python 用matplotlib画以时间日期为x轴的图像
2019/08/06 Python
Python面向对象封装操作案例详解
2019/12/31 Python
Python类如何定义私有变量
2020/02/03 Python
基于FME使用Python过程图解
2020/05/13 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
python urllib和urllib3知识点总结
2021/02/08 Python
python推导式的使用方法实例
2021/02/28 Python
html5+CSS3+JS实现七夕言情功能代码
2017/08/28 HTML / CSS
Urban Outfitters英国官网:美国平价服饰品牌
2016/11/25 全球购物
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
北京天润融通.net面试题笔试题
2012/02/20 面试题
自主招生自荐信格式
2013/12/03 职场文书
建议书范文
2015/02/05 职场文书
python可视化之颜色映射详解
2021/09/15 Python
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python