laravel5.4 后台RBAC功能完成中遇到的问题及解决方法
1.在后台模块中有些公共的地方 比如头部 尾部 左侧菜单栏; 在laravel中通过继承模板来实现,但是在做RBAC的时候
需求是:不同的登陆用户显示不同的菜单;去数据库获取这些数据 但是每个界面都要载入layout.blade.php这个页面 需要的数据也是每个页面都需要
so第一思路是:共享数据 文档 http://laravelacademy.org/post/6758.html 有同样问题的超链接 http://laravelacademy.org/post/697.html
view->share('key','value')
视图composer
但是由于数据是动态的 需要从数据库取 而且用到了session,而AppServiceProvider这个类是在中间件之前运行,那么就出现了session无法使用的问题,网上搜遍也没有找到问题;
最后使用简单粗暴的问题解决了 直接在类里写个方法 在layout页面中 直接调用这个方法 就输出结果了 然后再对结果进行处理


2.由于laravel从数据库中取出的数据全是obj,而有时候要用数组形式的
在取出的时候加->toArray() 但是也只能是外层对象变为数组 内层还是对象
那么就可以$menus = json_decode(json_encode($menus), true);来 来把数据完全转换为数组了 这是学习源头 https://blog.csdn.net/itbsl/article/details/76472807
3.在弄菜单的时候遇到无限级分类的问题
刚开始的方法是对数据进行遍历 然后再每个元素上加个level的标识 然后把子级跟着父级后面
public function getTreeMenu($menu_list, $p_id = 0, $level = 0)
{
static $arr = [];
// dd($menu_list);
foreach ($menu_list as $v) {
// dd($v);
if ($v->parent_id == $p_id) {
$v->level = $level;
$arr[] = $v;
$this->getTreeMenu($menu_list, $v->id, $level+1);
}
} return $arr;
}
这里我在后面用的时候不是很方便;由于static的问题 出现使用两次循环的时候数据缓存的问题
后来用了另一种形式的数组 很方便 就是这种形式 可以用到很多地方 比如全国地方省份 市 县城的显示 多级菜单的显示

学习源头 http://www.jb51.net/article/123363.htm
附代码:
// 形成父级子级形式的数组 子级在父级里
public function getTree($arr)
{
$refer = array();
$tree = array();
foreach($arr as $k => $v){
$refer[$v['id']] = & $arr[$k]; //创建主键的数组引用
}
foreach($arr as $k => $v){
$pid = $v['parent_id']; //获取当前分类的父级id
if($pid == 0){
$tree[] = & $arr[$k]; //顶级栏目
}else{
if(isset($refer[$pid])){
$refer[$pid]['subcat'][] = & $arr[$k]; //如果存在父级栏目,则添加进父级栏目的子栏目数组中
}
}
}
return $tree;
}
这样在取出的时候只用遍历一遍
<ul class=" nav-tabs nav-stacked">
@foreach(\iqiyi\Http\Controllers\Index::menuTree() as $k => $menu)
@if(!isset($menu['subcat']))
<li role="presentation" class=" normal" id="{{$menu['id']}}"><a href="{{$menu['href']}}">{{$menu['name']}}</a></li>
@elseif(isset($menu['subcat']))
<li role="presentation" class="dropdown normal " id="{{$menu['id']}}">
<a class="dropdown-toggle" data-toggle="dropdown" href="{{$menu['href']}}" role="button" aria-haspopup="true" aria-expanded="false">
{{$menu['name']}}<span class="caret"></span>
</a>
<ul class="dropdown-menu dropdown-menu-small ">
@foreach($menu['subcat'] as $son)
<li role="presentation"><a class="bg-warning" href="{{$son['href']}}">{{$son['name']}}</a></li>
@endforeach
</ul>
</li>
@endif
@endforeach
</ul>
4.在curd的时候需要多个where条件 ->where()->where() 多个连接即可
5. 在一对多 多对多的关系表 要更新的时候 如何解决呢?
1.把原来的数据按条件删除 再插入新的数据
2.把现有的数据从数据库中取出来 和更新的数据做对比 a array_diff b (取出的是a独有的数据) b array_diff a (取出的是b独有的数据) 删除那些a独有的数据 再插入 b独有的数据 个人 感觉数据量特别大 而且交集比较多的时候 方法2更快
6.在生成独一无二的订单号或者id号的时候
$input['id'] = date('YmdHis') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
这样可简单的生成一个定长的单号
7.laravel中要查看sql语句的执行情况时候 可以用
DB::connection->enableQueryLog() 开启查询日志
print_r(DB::getQueryLog()) // 获取查询语句 参数 和执行时间
如果在一个类中 有多个方法 需要多次查看查询语句的时候 把DB::connection()->getQueryLog() 写到 __construct()构造方法中 在查看的时候 DB::getQueryLog()
public function __construct() {
DB::connection()->enableQueryLog(); // 开启查询日志
}
8.在左侧的菜单时候用到bootstrap 需要父级菜单可以点击 但是悬浮的时候要显示它的子级菜单
学习源头: http://www.jb51.net/article/98215.htm
$(document).ready(function(){
dropdownOpen();//调用
});
/**
* 鼠标划过就展开子菜单,免得需要点击才能展开
*/
function dropdownOpen() {
var $dropdownLi = $('li.dropdown');
$dropdownLi.mouseover(function() {
$(this).addClass('open');
}).mouseout(function() {
$(this).removeClass('open');
});
}
9.虚拟机的ip地址是会改变的:
你在公司和家里 网络不同的时候会变
网络卡 有人顶你的时候 ip也会变
测试一个ip通不通的方法 ping 域名/ip地址
查看ip的方法:ifconfig
所以有时候连接不到的时候 有可能是ip地址改变了
10.在进行crud的时候 要考虑 用户不填的情况 做处理
laravel5.4 后台RBAC功能完成中遇到的问题及解决方法的更多相关文章
- asp.net url址址中中文汉字参数传递乱码解决方法
中文乱码是网站开发中会常碰到的问题,今天我们来讲一下关于url址址中中文汉字参数传递乱码解决方法,有需要的朋友可以参考下.在cs文件里传参的时候用UrlEncode: Response.Redirec ...
- VS2012中丢失ArcGIS模板的解决方法
VS2012中丢失ArcGIS模板的解决方法 由于ArcGIS10.0(for .NET)默认是用VS2010作为开发工具的,所以在先安装VS2012后装ArcGIS10.0 桌面版及ArcObjec ...
- js中style.display=""无效的解决方法
本文实例讲述了js中style.display=""无效的解决方法.分享给大家供大家参考.具体解决方法如下: 一.问题描述: 在js中我们有时想动态的控制一个div显示或隐藏或更多 ...
- java开发中遇到的问题及解决方法(持续更新)
摘自 http://blog.csdn.net/pony12/article/details/38456261 java开发中遇到的问题及解决方法(持续更新) 工作中,以C/C++开发为主,难免与其他 ...
- SpringBoot拦截器中无法注入bean的解决方法
SpringBoot拦截器中无法注入bean的解决方法 在使用springboot的拦截器时,有时候希望在拦截器中注入bean方便使用 但是如果直接注入会发现无法注入而报空指针异常 解决方法: 在注册 ...
- @NamedEntityGraphs --JPA按实体类对象参数中的字段排序问题得解决方法
JPA按实体类对象参数中的字段排序问题得解决方法@Entity @Table(name="complaints") @NamedEntityGraphs({ @NamedEntit ...
- 关于验证码在IE中不刷新的快速解决方法
今天在做验证码的时候发现在IE中,验证码不会刷新,而谷歌等其他浏览器没有问题,所以我想到应该是缓存问题,因为IE默认的设置是如果访问地址没变化就不会去获取而是加载缓存中的内容 所以解决方案就是在验证码 ...
- 在启动php时,无法启动此程序,由于计算机中丢失MSVCR110.dll的解决方法
在启动php时,运行RunHiddenconsole.exe php-cgi.exe -b 127.0.0.1:9000 -c时,出现错误:无法启动此程序,由于计算机中丢失MSVCR110.dll 方 ...
- 国内不fq安装K8S四: 安装过程中遇到的问题和解决方法
目录 4 安装过程中遇到的问题和解决方法 4.1 常见问题 4.2 常用的操作命令 4.3 比较好的博客 国内不fq安装K8S一: 安装docker 国内不fq安装K8S二: 安装kubernet 国 ...
随机推荐
- 无效类字符串:ProgID: Excel.Application
网上发现的方案是改注册表,其实用不着那么麻烦,找2种excel文件:xlsx和xls,把默认打开方式都换成你机器上有的程序就行,比如WPS Office的WPS 表格
- 微博评论箱的隐藏Bug解决
最近给站点添加社交评论功能,即用微博.QQ帐号就可以在网站上评论.其中Sina微博评论箱在IE和Firefox有个Bug,就是如果初始页面中微博评论箱所在那一部分处于不可见状态,那么后面即使切换了显示 ...
- 利用Python进行数据分析
最近在阅读<利用Python进行数据分析>,本篇博文作为读书笔记 ,记录一下阅读书签和实践心得. 准备工作 python环境配置好了,可以参见我之前的博文<基于Python的数据分析 ...
- Apriori算法思想和其python实现
第十一章 使用Apriori算法进行关联分析 一.导语 "啤酒和尿布"问题属于经典的关联分析.在零售业,医药业等我们经常需要是要关联分析.我们之所以要使用关联分析,其目的是为了从大 ...
- PHP采用Cookie实现 购物车
先来看一下逻辑分析图:
- tomcat7性能调优与配置(以windows版为例)
一.配置tomcat服务状态查看帐号(E:\Tomcats\apache-tomcat-7.0.73Test\conf下面的tomcat-users.xml中)加入:<user username ...
- mina框架tcpt通讯接收数据断包粘包处理
用mina做基于tcp,udp有通讯有段时间了,一直对编码解码不是很熟悉,这次做项目的时候碰到了断包情况,贴一下解决过程, 我接受数据格式如下图所示: unit32为c++中数据类型,代表4个字节,由 ...
- 第四章 MySQL数据类型和运算符
5.1 MySQL数据类型介绍 一.数据类型简介 (1) 数据表由多列字段构成,每一个字段指定了不同的数据类型,指定了数据类型之后,也就决定了向字段插入的数据内容 (2) 不同的数据类型也决定了 My ...
- csrf攻击与防范
CSRF(Cross Site Request Forgeries)跨网站请求伪造,也叫XSRF,通过伪装来自受信任用户的请求来攻击利用受信任网站. 与对比 xss:本网站运行了来自其它网站的脚本 c ...
- PAT1102: Invert a Binary Tree
1102. Invert a Binary Tree (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...