【问题标题】:Make Laravel 8 slug variable case insensitive使 Laravel 8 slug 变量不区分大小写
【发布时间】:2020-11-20 07:47:50
【问题描述】:

我有动态 URL 结构,具有以下页面表,其中页面 URL 设置为页面类型。 我有 Apache 服务器,其中 URL 区分大小写。我想强制路由变量为小写,以防用户输入大写 URL 或抛出 404 错误。

目前,当 URL 以大写形式输入时,它会显示 View [About] not found。找不到视图/目录时,如何强制路由变量为小写或抛出 Fail 错误?

页表

id |     name      |     type     | slug
1  |     About     |      about   | about
2  |    Contact    |    contact   | contact-us
3  | Events & Blog | event_blog | events-blog

web.php

Route::get('/{page}', 'Controller@page')->name('view_page')->where(['page' => Str::lower('[\w\d\-]+(.*)')]);

控制器

public function page($page)
{
  $page = Page::where('slug' => $page)->firstOrFail();
  return  view($page,  compact('page'));
}

我在资源文件夹中有aboutcontactevent_blog 目录,它对小写 URL 正常工作,但对大写 URL 显示错误。

【问题讨论】:

标签: php laravel error-handling routes controller


【解决方案1】:

您收到此错误不是来自 model数据库,您收到此行 view($page, compact('page')); 的错误,因为 ****.blade.php 文件不存在. 您可以将其更改为:

return  view(strtolower($page),  compact('page'));

或者,您可以使用whereRaw() 子句检查数据库中区分大小写的字符:

Page::whereRaw('BINARY slug=?', $page)->firstOrFail();

或者,

Page::where(DB::raw('BINARY slug'), $page)->firstOrFail();

【讨论】:

  • 强制视图为小写 Str::lower($page) 有效,但 Str::lower 检查“slug”不起作用。当用户输入的 slug 不是小写时,它应该抛出 Fail。 URL不是小写时如何抛出错误?
  • @deep strtolower 模型查询上的方法不起作用,导致 laravel 模型 where() 子句不区分大小写,在这种情况下你需要使用 whereRaw() 或 DB::raw,我已经在我的回答中提到过
  • DB::raw() 似乎工作。据说,raw 容易受到 SQL 注入的影响。如何将 whereRaw 用于多个条件,例如Page::whereRaw(['BINARY slug=?'=> $page, ['status'=>true])->firstOrFail();。目前显示Array to String conversion.
【解决方案2】:

如果我理解,也许 Str::lower() / strtolower() 会帮助你解决问题。

$page = Page::where('slug' => \Illuminate\Support\Str::lower($page))->firstOrFail();

【讨论】:

  • Str::lower 检查 'slug' 不起作用。当用户输入的 slug 不是小写但不是小写时,它应该抛出 Fail。 URL不是小写时如何抛出错误?
  • 您的意思是在 web.php 中吗?如果你想在 slug 不是小写的时候拒绝请求,你的路由应该是这样的: ->where(['page' => '[a-z0-9\-]+']);
猜你喜欢
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 2013-04-01
相关资源
最近更新 更多