2016-10-30 14 views
1

はほとんどあまりにも明白ようだが、どのように私はクラスプロパティをプライベートにするか:Laravel Eloquent Modelでプロパティを非公開にするにはどうすればよいですか?

class User extends Model 
{ 
    private $name; // or protected 

} 

$user = new User(); 
$user->name = "Mrs. Miggins";  // <- I want this to generate an error 
echo $user->name; // Mrs. Miggins, (this too) 

これはLaravel 5.1

+1

ご存知のとおり、あなたの例で使用されているLaravelモデルのプロパティは、物理的なプロパティではありません。 **モデル属性**です.Laravel Eloquentがプロパティとしてのみ使用できるようになっています。これらの属性は、* attributes *というModelプロパティで定義されています。 –

答えて

3

それはそのような何かになりますので、__get(){}__set(){}魔法のメソッドをオーバーライドしてみます:

class User extends Model 
{ 
    protected $privateProperties = ['name']; 

    public function __get($varName) { 
     $this->isPrivate($varName); 

     return parent::__get($varName); 
    } 

    public function __set($varName, $value) { 
     $this->isPrivate($varName); 

     return parent::__set($varName, $value); 
    } 

    protected function isPrivate($varName) { 
     if (in_array($varName, $this->privateProperties)) { 
      throw new \Exception('The ' . $varName. ' property is private'); 
     } 
    } 
} 
+2

いいです。実際にこのメソッドを** Trait **に変えました。これを必要なモデルで実装することができます。いいオプションかもしれません。 –

+1

はい、ほんのちょっと便利ですが、ちょっと前の 'trait'について書きたいと思っていました:) – Roman

+0

私はセッターとゲッターについてここに関連する質問を追加しました: http://stackoverflow.com/questions/40337400/adding- setters-and-getters-to-laravel-model – Gazzer

関連する問題