如何修改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 相关文章推荐
AJAX for PHP简单表数据查询实例
Jan 02 PHP
PHP MemCached 高级缓存应用代码
Aug 05 PHP
PHP下对字符串的递增运算代码
Aug 21 PHP
PHP新手入门学习方法
May 08 PHP
如何使用php绘制在图片上的正余弦曲线
Jun 08 PHP
php实现网页缓存的工具类分享
Jul 14 PHP
PHPWind9.0手动屏蔽验证码解决后台关闭验证码但是依然显示的问题
Aug 12 PHP
Zend Framework实现自定义过滤器的方法
Dec 09 PHP
PHP 中TP5 Request 请求对象的实例详解
Jul 31 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
Aug 21 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
Dec 13 PHP
php将xml转化对象的实例详解
Nov 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
CodeIgniter php mvc框架 中国网站
2008/05/26 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
2010/11/02 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
谨慎使用PHP的引用原因分析
2012/09/06 PHP
关于PHP自动判断字符集并转码的详解
2013/06/26 PHP
PHP生成json和xml类型接口数据格式
2015/05/17 PHP
分享别人写的一个小型js框架
2007/08/13 Javascript
JavaScript下申明对象的几种方法小结
2008/10/02 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
JavaScript之编码规范 推荐
2012/05/23 Javascript
JavaScript(js)设置默认输入焦点(focus)
2012/12/28 Javascript
window resize和scroll事件的基本优化思路
2014/04/29 Javascript
分享2个jQuery插件--jquery.fileupload与artdialog
2014/12/26 Javascript
tuzhu_req.js 实现仿百度图片首页效果
2015/08/11 Javascript
分享两段简单的JS代码防止SQL注入
2016/04/12 Javascript
Ubuntu系统下Angularjs开发环境安装
2016/09/01 Javascript
微信小程序如何获取手机验证码
2018/11/04 Javascript
vue form check 表单验证的实现代码
2018/12/09 Javascript
JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
2019/08/16 Javascript
VUE 项目在IE11白屏报错 SCRIPT1002: 语法错误的解决
2020/09/27 Javascript
Python实现计算文件夹下.h和.cpp文件的总行数
2015/04/23 Python
使用相同的Apache实例来运行Django和Media文件
2015/07/22 Python
Python面向对象之继承代码详解
2018/01/29 Python
Python中存取文件的4种不同操作
2018/07/02 Python
Python Numpy:找到list中的np.nan值方法
2018/10/30 Python
Python安装selenium包详细过程
2019/07/23 Python
简单瞅瞅Python vars()内置函数的实现
2019/09/27 Python
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
市场营销专科应届生求职信
2013/11/24 职场文书
自主实习接收函
2014/01/13 职场文书
反邪教警示教育方案
2014/05/13 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
2014年工作总结及2015工作计划
2014/12/12 职场文书
MySQL 自定义变量的概念及特点
2021/05/13 MySQL
浅谈如何保证Mysql主从一致
2022/03/13 MySQL
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android