首页 > 解决方案 > 跨多个视图的持久 Laravel 数据过滤器

问题描述

我正在编写一个多语言词典应用程序。当用户选择一种语言来使用数据时,该语言应该应用于每个页面,直到他们选择不同的语言。理想情况下,语言应该是 URL 的一部分,以便英语单词“double”和法语单词“double”的地址不同。也应该可以不指定语言,这样“double”将同时显示英语和法语单词。我还想同时过滤多个字段的数据,例如单词本身和语言。

我试图将其融入 Laravel 资源概念。的index视图Word应显示按语言过滤的所有单词,如果未指定语言,则不过滤。create应该保持语言从index. store应该只使用表单数据。如果指定了语言,则可以将其作为隐藏字段包含在create视图中。show严格来说不需要语言过滤器,但是如果用户然后返回index,仍然需要应用过滤器。

我开始使用路由,但这意味着我必须为每个过滤器硬编码一个路由。我也考虑过使用会话数据,但这意味着 URL 不会包含过滤器。如果过滤器作为查询字符串附加,Laravel 将如何访问它们?这是一个好的解决方案吗?

我正在使用 Laravel 5.8。在视图中持久保存这种类型的数据过滤器的最佳 Laravel 方法是什么?

标签: laravel-5filteringlaravel-5.8

解决方案


我在我们的应用程序的许多领域都有类似的问题。我们偶尔会Session为此使用,但通常发现解决此问题的最有效和最简单的方法是将数据库字段附加到user对象。

如果您使用任何类型的身份验证,Laravel已经user在每个页面视图上启动对象,因此可以在不额外调用数据库的情况下提取过滤器。如果未指定语言,\Auth::user()->current_lang_id则将是null,因此不会应用过滤器。我们通常使用一种关系(例如' currentLang()'),它使用户可以轻松查看语言并可以自动绑定表单。

我们发现,这样做的好处是它可以为每个用户个性化它,并且它以一种简单的方式“记住”用户在会话之间的偏好 - 无需在多个路由上创建数十条路由或特殊变量 + 逻辑因为这些路线包括您的过滤器。相反,您可以将您的逻辑放在基本控制器的顶部并完成它。

最后 - 当它是用户的 db 字段时更改语言只是标准的、简单的 CRUD。

HTH


推荐阅读