【问题标题】:Change Laravel Pluralizer Rules更改 Laravel Pluralizer 规则
【发布时间】:2020-09-29 16:46:43
【问题描述】:

我在 Laravel 有一个项目,其中包含西班牙语的模型名称、字段和消息,我目前使用 laravel-shift/blueprint 从 yaml 文件生成应用程序的所有基本代码,在 Laravel 的那一刻推断迁移,控制器,变量等名称的复数形式,这使得它们将单词视为英文单词,例如:

+--------------+----------------------------+--------------------------+
| Word         | English Plural (incorrect) | Spanish Plural (correct) |
+==============+============================+==========================+
| Animal       | Animals                    | Animales                 |
+--------------+----------------------------+--------------------------+
| Organizacion | Organizacions              | Organizaciones           |
+--------------+----------------------------+--------------------------+
| Estacion     | Estacions                  | Estaciones               |
+--------------+----------------------------+--------------------------+
| Regulador    | Reguladors                 | Reguladores              |
+--------------+----------------------------+--------------------------+

查看框架,我意识到在文件 vendor/laravel/framework/src/Illuminate/Support/Pluralizer.php 中使用英语语言的 Doctrine Inflector 规则来创建 Laravel 使用的变形器实例:

use Doctrine\Inflector\Rules\English;
public static function inflector()
    {
        static $inflector;

        if (is_null($inflector)) {
            $inflector = new Inflector(
                new CachedWordInflector(new RulesetInflector(
                    English\Rules::getSingularRuleset()
                )),
                new CachedWordInflector(new RulesetInflector(
                    English\Rules::getPluralRuleset()
                ))
            );
        }

        return $inflector;
    }

我编辑了文件以使用西班牙规则:

use Doctrine\Inflector\Rules\Spanish;
public static function inflector()
    {
        static $inflector;

        if (is_null($inflector)) {
            $inflector = new Inflector(
                new CachedWordInflector(new RulesetInflector(
                    Spanish\Rules::getSingularRuleset()
                )),
                new CachedWordInflector(new RulesetInflector(
                    Spanish\Rules::getPluralRuleset()
                ))
            );
        }

        return $inflector;
    }

所以西班牙语单词的复数形式正如我所期望的那样。

有没有办法告诉 laravel 使用西班牙语规则,而不必更改供应商文件夹中的代码?

附言

之前我使用了一个服务提供者,它扩展了变形器中复数规则中不规则单词的数组:

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Doctrine\Common\Inflector\Inflector;

class SpanishPluralizerServiceProvider extends ServiceProvider
{
  
  public function register()
  {
      
    Inflector::rules('plural', [
      'irregular' => [
        "organizacion" => "organizaciones",
        "proovedor" => "proovedores",
        "ubicacion" => "ubicaciones",
        "estacion" => "estaciones",
        "operador" => "operadores",
        "sucursal" => "sucursales",
        "entidad" => "entidades",
        "ciudad" => "ciudades",
        "legal" => "legales",
        "pais" => "paises"
      ]
    ]);
  }

  public function boot()
  {
    //
  }
}

但这似乎不再适用于 Laravel 7 和 Laravel 8

提前感谢您的时间和帮助。

【问题讨论】:

    标签: php laravel doctrine inflector


    【解决方案1】:

    查看Illuminate\Support\Pluralizer 类,我看到的唯一选择是将该类复制到您的应用并使用composer 重载原始类:

     "autoload": {
         "files": ["/custom/path/Pluralizer.php"]
      }
    

    “正确的方法”是在 Laravel 中使用某种配置选项来更改它,但正如您所见,这个选项现在不存在。确保还保留复制版本中的名称空间。用您的自定义版本重载整个类可能是您目前最简单的解决方案。

    【讨论】:

    • 当然,您可以随意创建 Laravel 的拉取请求并尝试实现该配置选项或其他方法作为新功能;)
    • 感谢您的回答,我创建了一个相同的类并保持相同的命名空间并使用composer上传它,它工作正常,它只会在找到具有相同命名空间的两个类时给我一个警报但是使用第一个。
    • 奇怪,我无法想象您在运行时可能会遇到什么样的错误,而它仍然可以同时工作而无需停止您的应用程序。如果在重载类时缺少转折,也许可以更深入地研究作曲家文档,但对我来说,这在过去很有效。
    猜你喜欢
    • 2020-11-03
    • 2020-09-06
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    相关资源
    最近更新 更多