如何修改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 超链接 抓取实现代码
Jun 29 PHP
php 生成唯一id的几种解决方法
Mar 08 PHP
php后台如何避免用户直接进入方法实例
Oct 15 PHP
用PHP代替JS玩转DOM的思路及示例代码
Jun 15 PHP
php使用pack处理二进制文件的方法
Jul 03 PHP
PHP针对常规模板引擎中与CSS/JSON冲突的解决方法
Aug 19 PHP
PHP中使用strpos函数实现屏蔽敏感关键字功能
Aug 21 PHP
php以fastCGI的方式运行时文件系统权限问题及解决方法
May 11 PHP
PHP实现图片上传并压缩
Dec 22 PHP
Thinkphp实现短信验证注册功能
Oct 18 PHP
ecshop适应在PHP7的修改方法解决报错的实现
Nov 01 PHP
phpstorm 配置xdebug的示例代码
Mar 31 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
php下过滤HTML代码的函数
2007/12/10 PHP
学习php中的正则表达式
2014/08/17 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
php简单操作mysql数据库的类
2015/04/16 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
2016/04/04 PHP
PHP按符号截取字符串的指定部分的实现方法
2018/09/10 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
数理公式,也可以这么唯美
2021/03/10 无线电
有效的捕获JavaScript焦点的方法小结
2009/10/08 Javascript
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
IE、FF、Chrome浏览器中的JS差异介绍
2013/08/13 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
深入理解javascript中的立即执行函数(function(){…})()
2014/06/12 Javascript
JS+CSS实现简单滑动门(滑动菜单)效果
2015/09/19 Javascript
JS实现侧边栏鼠标经过弹出框+缓冲效果
2017/03/29 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
Angular刷新当前页面的实现方法
2018/11/21 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
[02:41]DOTA2英雄基础教程 冥魂大帝
2014/01/16 DOTA
Python实现在Linux系统下更改当前进程运行用户
2015/02/04 Python
python标准算法实现数组全排列的方法
2015/03/17 Python
使用Python装饰器在Django框架下去除冗余代码的教程
2015/04/16 Python
浅谈python中scipy.misc.logsumexp函数的运用场景
2016/06/23 Python
基于pandas将类别属性转化为数值属性的方法
2018/07/25 Python
详解Django+uwsgi+Nginx上线最佳实战
2019/03/14 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
python编写简单端口扫描器
2019/09/04 Python
Python基础之变量基本用法与进阶详解
2020/01/03 Python
Python自动化测试笔试面试题精选
2020/03/12 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
美国高级工作服品牌:Carhartt
2018/01/25 全球购物
愚人节活动策划方案
2014/03/11 职场文书
围城读书笔记
2015/06/26 职场文书
800字作文之大雪
2019/12/04 职场文书
Sql Server 行数据的某列值想作为字段列显示的方法
2022/04/20 SQL Server