0

我在 Laravel 有一个项目,其中包含西班牙语的模型名称、字段和消息,我目前正在使用laravel-shift/blueprintyaml文件生成应用程序的所有基本代码,在 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

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

4

1 回答 1

1

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

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

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

于 2020-09-29T19:38:20.847 回答