如何修改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横向重复区域显示二法
Sep 25 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
Aug 23 PHP
Codeigniter整合Tank Auth权限类库详解
Jun 12 PHP
php函数实现判断是否移动端访问
Mar 03 PHP
PHP文件上传之多文件上传的实现思路
Jan 27 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
thinkphp5框架实现的自定义扩展类操作示例
May 16 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
May 27 PHP
php实现大文件断点续传下载实例代码
Oct 01 PHP
Laravel修改验证提示信息为中文的示例
Oct 23 PHP
PHP代码加密的方法总结
Mar 13 PHP
PHP 对象接口简单实现方法示例
Apr 13 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
ThinkPHP采用模块和操作分析
2011/04/18 PHP
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
2011/04/18 PHP
PHP和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
2011/07/03 PHP
Zend studio文件注释模板设置方法
2013/09/29 PHP
解决CodeIgniter伪静态失效
2014/06/09 PHP
php输出xml属性的方法
2015/03/19 PHP
PHP整合七牛实现上传文件
2015/07/03 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
又一个图片自动缩小的JS代码
2007/03/10 Javascript
JTrackBar水平拖动效果
2007/07/15 Javascript
JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型
2012/10/11 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
jquery ui bootstrap 实现自定义风格
2014/11/14 Javascript
js禁止页面刷新与后退的方法
2015/06/08 Javascript
js实现网页多级级联菜单代码
2015/08/20 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
纯JS实现可拖拽表单的简单实例
2016/09/02 Javascript
如何制作幻灯片(代码分享)
2017/01/06 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
2017/02/27 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
解决vue打包css文件中背景图片的路径问题
2018/09/03 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
jquery检测上传文件大小示例
2020/04/26 jQuery
python使用arcpy.mapping模块批量出图
2017/03/06 Python
Python利用splinter实现浏览器自动化操作方法
2018/05/11 Python
python单例模式实例解析
2018/08/28 Python
Django objects的查询结果转化为json的三种方式的方法
2018/11/07 Python
PyQt5实现让QScrollArea支持鼠标拖动的操作方法
2019/06/19 Python
关于numpy数组轴的使用详解
2019/12/05 Python
安装多个版本的TensorFlow的方法步骤
2020/04/21 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
HTML5拖放API实现拖放排序的实例代码
2017/05/11 HTML / CSS
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
写给女朋友的道歉信
2014/01/08 职场文书
电力安全事故反思
2014/04/27 职场文书