在laravel中合并路由_一些实用的 Laravel 小技巧

2023-11-02

Laravel 中一些常用的小技巧,说不定你就用上了。

1.侧栏[1]

网站一般都有侧栏,用来显示分类,标签,热门文章,热门评论啥的,但是这些侧栏都是相对独立的模块,如果在每一个引入侧栏的视图中都单独导入与视图有关的数据的话,未免太冗余了。所以最佳的做法是:新建一个widgets视图文件夹,再利用Laravel 的ViewComposers单独为侧栏绑定数据,这样侧栏就可以随便引入而不用关心数据是否绑定啦。

举个栗子,拿最常用的分类侧栏来说,在resources/views/widgets下新建你的分类侧栏视图文件

categories.blade.php:
 
<divclass="widget widget-default"
 
<divclass="widget-header"><h6><iclass="fa fa-folder fa-fw"></i>分类</h6></div>
 
<ulclass="widget-body list-group"
 
@forelse($categoriesas$category)
 
@if(str_contains(urldecode(request->getPathInfo),'category/'.$category->name))
 
<lihref="{{ route('category.show',$category->name) }}"
 
class="list-group-item active"
 
{{$category->name }}
 
<spanclass="badge"{{$category->posts_count }}</span>
 
</li>
 
<ahref='http://www.jobbole.com/members/wx2715401697'@else</a>
 
<ahref="{{ route('category.show',$category->name) }}"
 
class="list-group-item"
 
</a>
 
<ahref='http://www.jobbole.com/members/endif1983'@endif</a>
 
<ahref='http://www.jobbole.com/members/mxbeijing2007'@empty</a>
 
<pclass="meta-item center-block"No categories.</p>
 
@endforelse
 
</ul>

新建app/Http/ViewComposers文件夹,然后创建CategoriesComposer.php:

<?php
 
namespaceAppHttpViewComposers;
 
useAppHttpRepositoriesCategoryRepository;
 
useIlluminateViewView;
 
classCategoriesComposer
 
{
 
publicfunction__construct(CategoryRepository$categoryRepository)
 
{
 
$this->categoryRepository=$categoryRepository;
 
}
 
publicfunctioncompose(View$view)
 
{
 
$categories=$this->categoryRepository->getAll->reject(function($category){
 
return$category->posts_count==0;
 
});
 
$view->with('categories'$categories);
 
}
 
再在app/Providers文件夹下新建ComposerServiceProvider.php文件:
 
<?php
 
namespaceAppProviders;
 
useIlluminateSupportServiceProvider;
 
useIlluminateSupportFacadesView;
 
classComposerServiceProviderextendsServiceProvider
 
{
 
publicfunctionboot
 
{
 
View::composer('widget.categories''AppHttpViewComposersCategoriesComposer');
 
}
 
publicfunctionregister{}
 
}

最后别忘了在config/app.php中的providers数组中添加AppProvidersComposerServiceProvider::class啊。好了,现在你可以随时随地@include('widget.categories')了。对了,要善于在ViewComposer中利用Collection的强大方法进行数据处理。

2.善用路由别名

Laravel 最让人喜欢的地方之一是可以给路由起一个别名,比如:

Route::get('user/profile''UserController@showProfile')->name('user.profile');
 
// 等价于:
 
Route::get('user/profile'['uses'=>'UserController@showProfile''as'=>'user.profile']);;
 
//例如:
 
<ahref="{{ route('user.profile') }}"lufficc</a>

因为一个普通的项目路由至少也得有几十个,如果使用url方法的话,你不但要记住具体的路由,更麻烦的是如果你将来想要改变某个路由(比如把'user/profile'改为'u/profile',或者加个前缀啥的),必须改变所有相关的视图文件,而使用命名路由的话,只要命名不变,毫不受影响。

所以视图文件中尽量避免使用url方法,为每一个路由命名,一个默认的命名规则为:资源名称.或者,如post.show,image.upload。

3.全局动态设置

仅仅是.env的配置还无法满足我们的需求,有时我们需要可以在后台动态的进行一些设置,比如网站的标题,网站的背景图片或者是否允许评论等等。那么实现这个的最佳实践是什么?

熟悉wordpress的同学知道,wordpress可以进行很多自定义,因为wordpress有一张键值对数据库表,它就是靠这个实现个性化的。因此我们也可以参考这种思路,增加一个键值对表,以Xblog为例子,新建一个maps表:

$table->text('value')->nullable(true);

maps表的作用就是实现键值对key-value存储,tag的是为了可以有一个分类。然后后台进行存储的话,不要写死,这样就可以随时在变单中添加设置而无需更改代码:

]);
 
$map->tag='settings';
 
$map->value=$value;
 
$map->save;
 
注意firstOrNew的用法:如果不存在这个选项我们就新增一个并保存,否则就更新它。然后我们就可以在视图中随便增加任意多个表单了(或者也可以用js动态生成表单)。有了数据,怎么在视图中利用呢?利用ViewComposer,新建一个SettingsComposer.php,然后将查询的数据以数组的形式传递给视图:
 
//在SettingsComposer.php的compose方法中绑定数据
 
publicfunctioncompose(View$view)
 
{
 
$settings=Map::where('tag''settings')->get;
 
foreach($settingsas$setting){
 
}
 
}

然后就可以在视图中随便引用了,如你表单新增加了一个description

然后就可以在任何视图引用了:{{ $description or ''}}。另外还可以绑定一个单例Facades到容器,这样就可以在代码中随时获取配置信息啦。

 //1.注册
 
publicfunctionregister
 
{
 
$this->app->singleton('XblogConfig'function($app){
 
returnnewMapRepository;
 
});
 
}
 
//2.注册Facade
 
classXblogConfigextendsFacade
 
{
 
publicstaticfunctiongetFacadeAccessor
 
{
 
return'XblogConfig';
 
}
 
}
 
//3.添加到aliases数组
 
'aliases'=>[
 
***************** 省略 span>
 
'XblogConfig'=>AppFacadesXblogConfig::class
 
],
 
//4.愉快的使用,可爽
 
$page_size=XblogConfig::getValue('page_size'7);

4.数据库查询

怎么统计一篇文章有多少评论?最快的方法是:

$post = Post::where('id',1)->withCount('comments')->first;

这样$post变量就有一个属性comments_count了:

$post->comments_count;

如果想获取点赞数大于的100的评论个数怎么办?这样:

$post=Post::where('id'1)->withCount('comments'function($query){
 
$query->where('like''>'100);
 
})->first;

5.多态关联

文章可以有评论,页面可以有评论,评论也可以有评论,但是总不能建三张评论表吧?如果自己写条件判断也太麻烦了吧,Laravel的多态关联上场了!!

//1.第一步在Comment模型中说明我是可以多态的
 
return$this->morphTo;
 
}
 
//2.在想要评论的模型中增加comments方法,
 
publicfunctioncomments
 
{
 
return$this->morphMany(Comment::class'commentable');
 
}
 
//3.使用,就像普通的一对多关系一样:
 
$model->comments;
 
Schema::create('comments'function(Blueprint$table){
 
//等价于
 
****************省略
 
然后 laravel 会自动维持这些关系。注意,保存的评论的时候是有小技巧的,你的表单中至少要传两个参数:commentable_id和commentable_type:
 
$comment=newComment;
 
$commentable_id=$request->get('commentable_id');
 
//commentable_type取值例如:AppPost,AppPage等等
 
$commentable=app($request->get('commentable_type'))->where('id'$commentable_id)->firstOrFail;
 
****************省略
 
$commentable->comments->save($comment);

保存评论的时候并不知道是谁的评论,而是使用容器根据commentable_type生成一个模型实例,这样也就和具体的模型解耦了,你可以让任何东西可以评论,而不需要修改代码。

6.缓存优化相关

如果你想要在.env文件中添加自己的配置,记住一定要在config文件夹下某个配置文件的数组中添加对应的。记住,除了config文件夹下的配置文件,永远不要在其它地方使用env函数,因为部署到线上时,配置文件缓存(php artisan config:cache)后,env函数无法获得正确的值。

另外注意的是,路由文件中尽量不使用闭包函数,统一使用控制器,因为缓存路由的时候php artisan route:cache,无法缓存闭包函数。

7.Redis

如果你缓存使用Redis,session也使用了Redis,队列已使用了Redis,这样没问题,速度很快。但是,当你运行php artisan cache:clear清除缓存时,会把你的登录信息清除,也会把队列清除……这就不优雅了。解决办法很简单,为它们分配不同的连接即可。

首先在configdatabase.php中增加连接,注意database序号:

'redis'=>[
 
'cluster'=>false
 
'default'=>[
 
'host'=>env('REDIS_HOST''localhost'),
 
'password'=>env('REDIS_PASSWORD'null),
 
'port'=>env('REDIS_PORT'6379),
 
'database'=>0
 
],
 
'session'=>[
 
'database'=>1
 
],
 
'queue'=>[
 
'database'=>2
 
],
 
],
 
//queue.php中的connections数组中:
 
'redis'=>[
 
'driver'=>'redis'
 
'connection'=>'queue'
 
'queue'=>'default'
 
'retry_after'=>90
 
],
 
//session.php中的connection选项:
 
'connection'=>'session'
 

这样它们就互不相干了~~

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的官方群点击此处。

参考

  1. ^内容不错的话希望大家支持鼓励下点个赞/喜欢,欢迎一起来交流;另外如果有什么问题和想看的内容可以在评论提出
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在laravel中合并路由_一些实用的 Laravel 小技巧 的相关文章

  • SpringBoot配置默认Json解析工具以及空值处理方式

    SerializeConfig config new SerializeConfig 设置序列化为下划线 config propertyNamingStrategy PropertyNamingStrategy SnakeCase Stri
  • Android UI架构(十三)--App请求切换帧率(4)之SurfaceFlinger切换帧率.md

    文章目录 参考资料 简述 一 SurfaceFlinger接受帧率变化 1 1 SurfaceFlinger setDesiredActiveConfig 1 2 SurfaceFlinger repaintEverythingForHWC
  • 用C语言编写简化版银行系统:ATM取款机

    1 问题描述 用c语言编写一个简化的银行自动存款系统 适合刚接触C语言 尝试编写100多行代码的初学者作为参考 该代码编写围绕着银行ATM机器的4个业务 分别是查询 取款 存款 修改密码 其中需要两个文件 一个为DrawMoney txt文
  • 阿里巴巴开源限流系统 Sentinel 全解析

    今年下半年阿里开源了自研的限流系统 Sentinel 官方对 Sentinel 的介绍中用到了一系列高大山的名词诸如 限流 熔断降级 流量塑形 系统负载保护等 还有漂亮的形容词诸如 轻巧 专业 实时等 作为技术消费者看到这样的广告词之后禁不
  • 掌握GDB调试工具,轻松排除bug!

    一 什么是GDB gdb是GNU debugger的缩写 是编程调试工具 GDB官网 https www gnu org software gdb GDB适用的编程语言 Ada C C objective c Pascal 等 GDB的工作
  • Python-第三方库requests详解

    Requests 是用Python语言编写 基于 urllib 采用 Apache2 Licensed 开源协议的 HTTP 库 它比 urllib 更加方便 可以节约我们大量的工作 完全满足 HTTP 测试需求 Requests 的哲学是
  • C++中的namespace(using namespace)的详细理解

    在C 语言编写的程序中 变量和函数等的作用范围是有一定限制的 比如 在函数体中定义的一个临时变量就不可以在函数体外使用 为了解决变量和函数等的作用范围 在C 语言中引入了名空间的概念 并增加了关键字namespace和using 在一个名空
  • 《STL源码剖析》(四)——序列式容器

    1 序列式容器 所谓序列式容器 其中的元素都可序 但未必有序 C 本身提供了一个序列式容器array STL另外提供了vector list deque stack queue priority queue等序列式容器 其中stack和qu
  • C++知识总结(内附超详细知识框架图)

    C 知识总结 由于在学习C 的同时博主也在学习Linux系统编程 Linux网络编程以及数据库 所以从开始学习C 到现在结束已经有一年多时间了 C 是博主学习的第一个面向对象的语言 在学习过程中也是逐渐体会到了面向对象编程的种种好处 但C
  • 第十二章 YOLO的部署实战篇(下篇)

    文章目录 前言 专栏概括 1 cuda教程目录 2 cuda教程背景 3 cuda教程内容 一 yolov5部署整体逻辑 1 yolov5的main函数 2 yolo h头文件 3 整体架构显示 二 yolov5模型的onnx转engne代
  • oracle tmp表空间不足,临时表空间不足引起的ORA-01114错误

    数据库程序突遇ORA 01114错误 提示内容如下 错误原因 Select error ORA 01114 将块写入文件 时出现 IO 错误 块 ORA 27069 skgfdisp 尝试在文件范围外执行 I O OSD 04026 无效的
  • Unity + vuforia 开发虚拟按钮

    首先在创建虚拟按钮之前 还是要首先了解imageTarget的创建方式 我自己时参考dzyi的博客弄的 推荐大家 写的很详细 地址 http blog csdn net dzyi article details 22898929 创建虚拟按
  • 有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?

    Apple 算是最重视应用开发体验的公司了 从Xib到StoryBoard 从Auto Layout到Size Class 每一次的更新 都会给iOS应用的开发带来不小的便利 但是 对于绝对多数iOS攻城狮来说 我们依然还是很害怕写UITa
  • 解决docker pull 很慢的问题

    再docker拉取镜像时 花费时间太长 用如下方法可以解决 root localhost mkdir p etc docker root localhost cat etc docker daemon json registry mirro
  • mysql Undo Tablespaces

    分离 undo 表空间相关的参数 innodb undo directory 指定单独存放 undo 表空间的目录 默认为 即 datadir 可以设置相对路径或者绝对路径 该参数实例初始化之后虽然不可直接改动 但是可 以通过先停库 修改配
  • 联想工作站光盘或WinPE重装Win7找不到SSD和另外一个2T磁盘

    工作站比较老了 苏州重启系统修了 应该是原来的SSD硬盘损坏 修复工具无法修复 只能重装了 由于某一应用软件要求 只能装Win7系统 使用老毛桃制作的WinPE进去看了分区 安装系统时无法找到新的SSD盘和之前的2T磁盘
  • PLC的通信模式

    说到PLC的通讯模式 主要有两种 一种是并行通讯模式 一种是串行通讯模式 这两种通信模式有什么区别呢 PLC串行通信 串行通信一般是用二进制的位 BIT 为单位的数据传输方式 每次都只传送一位 然后除了地线之外 在一个数据传输方向上面只要一
  • element tree树形结构接口不支持搜索、懒加载情况下实现搜索

    目前项目中 element tree树形结构由于数据太多使用了懒加载 并且接口不支持搜索 只能由前端实现搜索功能 暂时按照自己思路实现功能 思路为 输入搜索内容后 直接遍历树形结构的数据 通过filter筛选出结果之后再赋值给树形结构 de
  • matlab径向分布函数作图_分子动力学的径向分布函数绘制

    这是过冷水之前在工作中的一张图片 这张图片的实际含义是以坐标原点为参考点 距离原点距离x处的小球个数f x 分布图 这个问题理解起来好容易 统计距离和小球个数的关系 but实际问题是过冷水要处理的是这样的问题 请问请告诉我随意找一个小球为原

随机推荐

  • 小团队管理核心(一)

    主管应该投身具体业务还是专注于管理 投身业务 or 专注管理 主管应该投身具体业务还是专注于管理 一 主管的定位 二 如何实现老板目标 三 主管应当专注管理 一 主管的定位 定位简述 通过下属实现经营者目标的人 定位解析 由此看来我们的目标
  • ThreeJS第一人称视角处理

    简介 第一人称控件指针锁定API允许您在游戏界面中锁定鼠标或其他指针设备 以便您不用绝对定位光标就可以获得坐标变化值 从而准确地判断用户正在做什么 并且还可以防止用户意外地进入另一块屏幕或别的什么地方 从而导致误操作 在ThreeJs中实现
  • Python 查看数据类型与格式

    一般我们拿到一个数据 会先看一下这个数据有多少行多少列 各个字段是什么 数据格式类型是什么 在开始讲数据格式前 需要先梳理一下各个数据类型 我们常使用的库一般是numpy和pandas Numpy下的核心是数组 array ndarray
  • Redis支持哪几种数据类型?

    Redis支持哪几种数据类型 1 什么是Redis 2 优缺点 3 Redis相比Memcached有哪些优势 4 Redis支持的数据类型 4 1 String 字符串 4 2 List 列表 4 3 Set 集合 4 4 Sorted
  • HTTPS原理(证书验证+数据传输)

    HTTPS协议相关的概念有SSL 非对称加密 CA证书等 为什么用了HTTPS就是安全的 HTTPS底层原理如何实现 用了HTTPS就一定安全吗 HTTPS实现原理 HTTPS在内容传输上的加密使用的是对称加密 证书验证阶段使用非对称加密
  • 图像评价指标(python)

    图像评价指标的综合记录 一 信息熵 熵是衡量图像中所包含的信息量的大小 熵越大说明包含的信息越多 意味着可以从处理后的图像中获取更多的信息 用信息熵来计算图像的熵值 代码 import cv2 import numpy as np impo
  • C 标准库 - 《stdio.h》

    原文链接 https www runoob com cprogramming c standard library stdio h html 简介 stdio h 头文件定义了三个变量类型 一些宏和各种函数来执行输入和输出 库变量 下面是头
  • 前端页面间数据传递常用的几种方式

    1 常用方式 url页面路径携带参数传递 localStorage方式传递 sessionStorage方式传递 cookie的方式传递 2 方式对比 url字节限制可以参考这一篇文章 HTTP中的URL长度限制 其中cookie的setC
  • 开关电源的时钟倍频 辐射发射超标RE+ 噪声源+干扰原因

    1 收藏 史上最全开关电源传导与辐射超标整改方案 医疗设备低频30 50Mhz超标 2 https bbs elecfans com m jishu 941580 1 1 html 3 辐射噪声的产生机理 知乎 1 电流源 噪声源 2 天线
  • 【华为OD机试】叠积木(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 语言限定 C clang11 C clang 11 Pascal fpc 3 0 2 Java jav
  • 傅里叶变换快速入门

    网上关于傅里叶变换的解释特别多 但大部分都比较偏理论 导致我看来N多教程也还是懵懵懂懂 在某本书 信号完整性分析 中看到一句震耳发聩的话 每个工程师都应该亲自动手计算一遍傅里叶变换 我知道很多工具可以直接给出傅里叶变换结果 但不清不楚一直是
  • 修改UGF官方的starForce为自己所用

    第一步 修改Launcher的名字 比如我这里是修改成SpaceShoot 第二步修改命名空间名字 重新命名为SpaceShoot 第三步 重新设置Launcher场景中丢失的脚本 Builtin下JsonLite Localization
  • 设计模式-工厂方法模式

    文章目录 前言 工厂方法模式概述 使用场景 工厂方法模式优缺点 Java代码示例 前言 当我们面临需要创建不同类型对象的需求时 通常会使用工厂方法模式 工厂方法模式是一种创建型设计模式 它提供了一种将对象的创建与使用分离的方法 允许我们在不
  • VMware Workstation安装

    VMware Workstation安装 1 安装步骤 双击运行安装包程序 接受许可证协议 关键不接受不让安装啊 选择安装位置 建议非中文无空格 增强型键盘驱动程序可选 按照自身使用习惯勾选产品更新和客户体验提升计划 快捷方式 开始安装 稍
  • MD5加密

    1 md5是什么 md信息摘要算法 一种被广泛使用的密码散列函数 2 md5的特征 一 长度固定 任意长度的数据都会输出长度相等的md5值 二 不可逆 三 对原密码进行改动改变成一个字节输出数据 四 很少碰到两个不同的数据产生相同的md5值
  • 算法该不该刷?如何高效刷算法?

    一 算法该不该刷 最近有小伙伴向我咨询一个问题 就是算法该不该刷 该如何刷算法呢 这个问题可谓太大众化了 只要你去某乎 某度搜索一下相关的解答 会有无数种回答 可见这个问题困扰了多少学习计算机的同学们 但不管回答有多少种 总结一句话就是 算
  • 科大奥锐密立根油滴实验数据_密立根油滴实验数据表格

    静态法 平衡法 第1粒油滴数据 序数 U V t g s v g m s 1 q i C n i 个 e C 10 19 u e e 0 1 235 9 98 1 50E 04 1 12E 18 7 1 61 0 62 2 235 9 88
  • chatglm-6b模型在windows的详细安装教程

    1 先是看了github的文章 如果打不开这篇文章 可能需要科学上网 即访问外网的VPN https github com THUDM ChatGLM 6B 2 准备 台式机 GPU是8G 关于是否可以在笔记本运行 我后面测试下 等我下一篇
  • 什么是频谱仪的RBW带宽和VBW带宽

    1 RBW Resolution Bandwidth 代表两个不同频率的信号能够被清楚的分辨出来的最低频宽差异 两个不同频率的信号频宽如低于频谱分析仪的RBW 此时该两信号将重叠 难以分辨 RBW 分辨率带宽 有人也叫参考带宽 表示测试的是
  • 在laravel中合并路由_一些实用的 Laravel 小技巧

    Laravel 中一些常用的小技巧 说不定你就用上了 1 侧栏 1 网站一般都有侧栏 用来显示分类 标签 热门文章 热门评论啥的 但是这些侧栏都是相对独立的模块 如果在每一个引入侧栏的视图中都单独导入与视图有关的数据的话 未免太冗余了 所以