如何修改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 增加了对 .ZIP 文件的读取功能
Oct 09 PHP
支持数组的ADDSLASHES的php函数
Feb 16 PHP
phpmyadmin 常用选项设置详解版
Mar 07 PHP
php带密码功能并下载远程文件保存本地指定目录 修改加强版
May 16 PHP
提高PHP编程效率的方法
Nov 07 PHP
php调用c接口无错版介绍
Mar 11 PHP
ci检测是ajax还是页面post提交数据的方法
Nov 10 PHP
PHP的文件操作与算法实现的面试题示例
Aug 10 PHP
Twig模板引擎用法入门教程
Jan 20 PHP
PHP生成和获取XML格式数据的方法
Mar 04 PHP
PHP上传图片、删除图片简单实例
Nov 12 PHP
php 删除一维数组中某一个值元素的操作方法
Feb 01 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
网络资源
2006/10/09 PHP
用Zend Encode编写开发PHP程序
2010/02/21 PHP
从php核心代码分析require和include的区别
2011/01/02 PHP
PHP统计二维数组元素个数的方法
2013/11/12 PHP
php学习笔记之面向对象
2014/11/08 PHP
php日期操作技巧小结
2016/06/25 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
2016/09/11 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
JS动态获取当前时间,并写到特定的区域
2013/05/03 Javascript
ff chrome和ie下全局动态定位的异同及全局高度的取法
2014/06/30 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
Bootstrap popover用法详解
2016/12/22 Javascript
easyui下拉框动态级联加载的示例代码
2017/11/29 Javascript
Vue 按键修饰符处理事件的方法
2018/05/04 Javascript
js实现GIF图片的分解和合成
2019/10/24 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
es6中Promise 对象基本功能与用法实例分析
2020/02/23 Javascript
js+canvas实现纸牌游戏
2020/03/16 Javascript
python操作xml文件示例
2014/04/07 Python
在Python的web框架中中编写日志列表的教程
2015/04/30 Python
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
python脚本实现验证码识别
2018/06/07 Python
python读取图片并修改格式与大小的方法
2018/07/24 Python
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
python 实现在tkinter中动态显示label图片的方法
2019/06/13 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
2019/09/05 Python
python模拟点击玩游戏的实例讲解
2020/11/26 Python
美国宠物商店:Wag.com
2016/10/25 全球购物
雅诗兰黛香港官网:Estee Lauder香港
2017/09/26 全球购物
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
服务员岗位责任制
2014/02/11 职场文书
食品科学与工程专业毕业生求职信范文
2014/07/21 职场文书
红领巾广播站广播稿
2014/10/19 职场文书
2014年保洁工作总结
2014/11/24 职场文书
逃课检讨书
2015/01/26 职场文书