php - trait - Où mettre/comment gérer les énumérations à Laravel?




relations eloquent laravel (4)

En plus de la réponse de @ Banford:

J'ai récemment mis en place un package qui rend le travail avec les enums à Laravel beaucoup plus agréable. C'est une combinaison de diverses implémentations que j'ai trouvées en recherchant comment faire exactement la même chose (donc pourquoi je suis ici).

https://github.com/BenSampo/laravel-enum

Dans ce cas, vous pourriez faire quelque chose comme ceci:

final class PhoneTypes extends Enum
{
    const Cellular = 0;
    const Work = 1;
    const Home = 2;
}

On peut alors accéder aux valeurs en utilisant:

PhoneTypes::Work // 1

Je recommanderais de toujours définir les valeurs sur des nombres entiers et de les stocker ensuite dans le DB sous forme d'ints.

La classe de base Enum a des méthodes pour obtenir toutes les clés et valeurs en tant que tableaux. Le package présente également quelques autres avantages qui peuvent être utiles dans ce cas, tels que la validation, afin que l'utilisateur ne puisse pas ajouter une valeur inexistante à la base de données.

Il y a aussi un générateur qui est très pratique.

J'espère que cela sera utile pour quelqu'un.

Laravel a un assistant de <select> qui prend en entrée un dictionnaire. J'aime garder les valeurs pour tous dans un endroit central. Par exemple, je pourrais avoir une énumération qui ressemble à ceci:

$phoneTypes = [
    'CELL' => "Cellular",
    'HOME' => "Home",
    'WORK' => "Work",
];

Ce que je veux utiliser à la fois dans ma vue / mon modèle et dans la base de données:

Schema::create('customers', function (Blueprint $table) {
    $table->increments('id');
    $table->enum('pri_phone_type',array_keys($phoneTypes));
    ...
});
  1. Y a-t-il un endroit recommandé pour les mettre?
  2. Puis-je les rendre globales pour pouvoir y accéder facilement dans toutes mes vues?

En s'appuyant sur la réponse de @Banfords, les constantes PHP7 peuvent désormais être des tableaux:

class User extends Authenticatable
{
    /**
     * The possible genders a user can be.
     */
    const GENDER = [
        'Male',
        'Female',
        'Unspecified'
    ];

...

Juste eu le même problème, pour moi Eloquent Accessors et les mutateurs ont fonctionné le mieux. Pour cette question ça irait comme:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Customer extends Model
{
    /**
    * @var array
    */
    protected $phoneTypes = [
        'Cellular',
        'Home',
        'Work'
    ];

   /**
    * @param int $value
    * @return string|null
    */
    public function getPhoneTypeAttribute($value)
    {
        return Arr::get($this->phoneTypes, $value);
    }
}

S'il vous plaît noter que dans la base de données, vous devriez enregistrer des valeurs numériques, où 0 est la cellule, 1 est la maison et 2 est le travail. Deuxièmement, il serait judicieux d'utiliser des traductions ici plutôt que des propriétés protégées.


Personnellement, enum complètement un type de colonne enum DB. Les types de colonnes enum base de données peuvent être problématiques, voir ici pour un article sur ce sujet.

Gestion des énumérations dans la base de données via des relations

Si vous voulez vraiment gérer votre liste dans la base de données, je phone_types table de base de données phone_types distincte et phone_types une relation avec la table de vos customers .

Gestion des énumérations dans votre code via config Laravel

Il est également très facile de gérer vos énumérations en code et d’éviter complètement la base de données.

Puisque vous utilisez Laravel, je pense que la mise en place d’un fichier de configuration serait une option viable.

Supposons que vous créez un nouveau fichier config/enums.php avec les éléments suivants:

return [
    'phone_types' => [
        'CELL' => "Cellular",
        'HOME' => "Home",
        'WORK' => "Work",
    ]
];

Vous pouvez maintenant le remettre à l'aide-formateur assez facilement:

Form::select('phone', Config::get('enums.phone_types'));




enums