如何修改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与XML、XSLT、Mysql的结合运用实现代码
Nov 19 PHP
PHP操作数组的一些函数整理介绍
Jul 17 PHP
基于PHP array数组的教程详解
Jun 05 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
Jan 24 PHP
ThinkPHP模板判断输出Empty标签用法详解
Jun 30 PHP
PHP中上传多个文件的表单设计例子
Nov 19 PHP
PHP 7的一些引人注目的新特性简单介绍
Nov 08 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
Jan 08 PHP
PHP 数组基本操作方法详解
Jun 17 PHP
PHP中检索字符串的方法分析【strstr与substr_count方法】
Feb 17 PHP
详解PHP swoole process的使用方法
Aug 26 PHP
PHPCrawl爬虫库实现抓取酷狗歌单的方法示例
Dec 21 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
PHPMyAdmin 快速配置方法
2009/05/11 PHP
php实现图片添加水印功能
2014/02/13 PHP
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
实例讲解PHP页面静态化
2018/02/05 PHP
PHP以json或xml格式返回请求数据的方法
2018/05/31 PHP
jQuery动态添加 input type=file的实现代码
2012/06/14 Javascript
JavaScript indexOf方法入门实例(计算指定字符在字符串中首次出现的位置)
2014/10/17 Javascript
JavaScript获取当前网页最后修改时间的方法
2015/04/03 Javascript
javascript实现列表切换效果
2016/05/02 Javascript
JQuery PHP图片在线裁剪实例
2020/07/27 Javascript
jQuery-mobile事件监听与用法详解
2016/11/23 Javascript
bootstrap栅格系统示例代码分享
2017/05/22 Javascript
jQuery实现frame之间互通的方法
2017/06/26 jQuery
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
详解webpack多页面配置记录
2018/01/22 Javascript
node.js学习笔记之koa框架和简单爬虫练习
2018/12/13 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
2020/04/13 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
Python中的二叉树查找算法模块使用指南
2014/07/04 Python
你应该知道的python列表去重方法
2017/01/17 Python
opencv python 2D直方图的示例代码
2018/07/20 Python
TensorFlow实现Logistic回归
2018/09/07 Python
Python产生Gnuplot绘图数据的方法
2018/11/09 Python
Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
2019/01/04 Python
We Fashion荷兰:一家国际时装公司
2018/04/18 全球购物
英国豪华文具和皮具配件经典老品牌:Smythson(斯迈森)
2018/04/19 全球购物
prAna官网:瑜伽、旅行和冒险服装
2019/03/10 全球购物
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
怎样自定义一个异常类
2016/09/27 面试题
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
十岁生日家长答谢词
2014/01/17 职场文书
四风问题班子对照检查材料
2014/09/27 职场文书
个人师德师风自我剖析材料
2014/09/29 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
Linux中Nginx的防盗链和优化的实现代码
2021/06/20 Servers