php from Wohin mit Enums in Laravel?




php enum (4)

Ich stimme hier nicht mit der akzeptierten Antwort überein. Ich denke, dass Enums für diese Art von Dingen sehr nützlich sein können. Ich bevorzuge, enums als Typen zu behandeln, und die Methoden zu implementieren, die Sie für die Enum-Basisklasse benötigen, um Ihnen die Funktionalität zu geben, die Sie benötigen, beispielsweise das Abrufen eines Wörterbuchs.

Mein einfaches Beispiel unten:

abstract class PhoneType extends Enum {
    const Cell = "Cellular";
    const Home = "Home";
    const Work = "Work";
}

abstract class Enum {
    static function getKeys(){
        $class = new ReflectionClass(get_called_class());
        return array_keys($class->getConstants());
    }
}

Beispielverwendung:

PhoneType::getKeys();

Weitere Details und ein ausführlicheres Beispiel finden Sie unter PHP und Enumerations .

Laravel hat einen <select> -Formularhelfer, der als Eingabe ein Wörterbuch verwendet. Ich halte die Werte für alle an einem zentralen Ort. Zum Beispiel könnte ich ein Enum haben, das so aussieht:

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

Was ich sowohl in meiner Ansicht / Vorlage als auch in der Datenbank verwenden möchte:

Schema::create('customers', function (Blueprint $table) {
    $table->increments('id');
    $table->enum('pri_phone_type',array_keys($phoneTypes));
    ...
});
  1. Gibt es einen empfohlenen Platz für diese?
  2. Kann ich sie global machen, damit ich sie in all meinen Ansichten leicht aufrufen kann?

Hatten eben ähnliche Probleme , für mich funktionierten Eloquent Accessors und Mutators am besten. Für diese Frage würde es wie folgt aussehen:

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);
    }
}

Bitte beachten Sie, dass Sie in der Datenbank numerische Werte speichern sollten, wobei 0 für Zelle, 1 für Zuhause und 2 für Arbeit steht. Zweitens wäre es ratsam, hier Übersetzungen anstelle von geschütztem Eigentum zu verwenden.


Aufbauend auf @Banfords Antwort, mit PHP7 können Konstanten nun Arrays sein:

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

...

Persönlich würde ich einen enum DB-Spaltentyp überhaupt vermeiden. Database enum können problematisch sein, siehe hier für einen Artikel zu diesem Thema.

Abwicklung von enums in der DB über Beziehungen

Wenn Sie Ihre Liste wirklich in der Datenbank verwalten möchten, würde ich eine separate phone_types Datenbanktabelle erstellen und eine Beziehung mit Ihrer customers Tabelle erstellen.

Abrufen von Enums in Ihrem Code über die Laravel-Konfiguration

Es ist auch ganz einfach, Ihre Enums in Code zu verwalten und die DB vollständig zu vermeiden.

Da Sie Laravel verwenden, wäre die Einrichtung einer Konfigurationsdatei eine praktikable Option.

config/enums.php Sie erstellen eine neue Datei config/enums.php mit folgendem config/enums.php :

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

Sie können das nun ganz einfach an den Formularhelfer übergeben:

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




enums