如何修改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 相关文章推荐
兼容PHP5的PHP目录管理函数库
Jul 10 PHP
PHP 上传文件大小限制
Jul 05 PHP
php下安装配置fckeditor编辑器的方法
Mar 02 PHP
优化PHP代码技巧的小结
Jun 02 PHP
探讨:parse url解析URL,返回其组成部分
Jun 14 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
Jun 25 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(四)
Jun 23 PHP
Yii学习总结之数据访问对象 (DAO)
Feb 22 PHP
PHP里的单例类写法实例
Jun 25 PHP
smarty内部日期函数html_select_date()用法实例分析
Jul 08 PHP
PHP实现截取中文字符串不出现?号的解决方法
Dec 29 PHP
详细解读php的命名空间(二)
Feb 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
用文本文件实现的动态实时发布新闻的程序
2006/10/09 PHP
PHP程序员编程注意事项
2008/04/10 PHP
PHP 处理图片的类实现代码
2009/10/23 PHP
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
2014/08/15 PHP
CodeIgniter框架URL路由总结
2014/09/03 PHP
Yii实现MySQL多数据库和读写分离实例分析
2014/12/03 PHP
PHP 极验验证码实例讲解
2016/09/29 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
2017/04/04 PHP
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
jquery实现个人中心导航菜单效果和美观都非常不错
2014/09/02 Javascript
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
js实现人民币大写金额形式转换
2016/04/27 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
2016/08/06 Javascript
jquery表单验证插件validation使用方法详解
2017/01/20 Javascript
详解VUE Element-UI多级菜单动态渲染的组件
2019/04/25 Javascript
详解Python爬虫的基本写法
2016/01/08 Python
详解Python requests 超时和重试的方法
2018/12/18 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
2019/01/09 Python
Python子类继承父类构造函数详解
2019/02/19 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
python 实现在shell窗口中编写print不向屏幕输出
2020/02/19 Python
Python+Xlwings 删除Excel的行和列
2020/12/19 Python
python实现图片转字符画
2021/02/19 Python
解决Python import .pyd 可能遇到路径的问题
2021/03/04 Python
摩顿布朗英国官方网上商店:奢华沐浴、身体和头发护理
2016/10/29 全球购物
楼面部长岗位职责范本
2014/02/14 职场文书
巾帼建功标兵事迹材料
2014/05/11 职场文书
2015年资料员工作总结
2015/04/25 职场文书
承诺书范本大全
2015/05/04 职场文书
李强优秀员工观后感
2015/06/16 职场文书
2016年艾滋病宣传活动总结
2016/04/01 职场文书
Mysql分析设计表主键为何不用uuid
2022/03/31 MySQL