2017-09-23 12 views
0

他のフレームワーク、またはpure-PHPで作業する場合、モデルのプロパティを保護します。次に、必要に応じてパブリックゲッターとセッターを作成し、__get()__set()を使用してプロキシをプロキシします。これは私が夜に眠るのに役立ちます。Laravelモデルのプロパティを保護する方法

最近私はLaravelを使い始めました。私はEloquentモデルがどのように「保護されていない」かに驚いています。 $guarded$fillableプロパティを使用して一括割り当てを制御することはできますが、それでも偶発的なアクセスには余裕があります。

たとえば、私のモデルにはstatusというプロパティがあります。モデル作成時にデフォルト値が設定されており、$model->activate()または$model->deactivate()が呼び出された場合にのみ変更する必要があります。しかし、デフォルトでは、開発者はLaravelを使って直接変更することができます。私が見る限り、これを防ぐ唯一の方法はセッターを作成し、それが呼び出されると例外をスローすることです。

何か不足していますか?多分私はリラックスする必要がありますか?デフォルトで安全なEloquentモデルを構築する最善の方法は何ですか?

答えて

1

__getメソッドと__setメソッドをオーバーライドできます。モデルフィールドを制御できるように、protectedProperties配列とboolean変数protectedChecksを定義する必要があります。

protected $protectedChecks = true; 

protected $protectedProperties = [ 'status' ]; 

protected $fillable = ['status']; 

public function __get($key) 
{ 
    return (in_array($key, $this->fillable) && !in_array($key, $this->protectedProperties)) ? $this->attributes[$key] : null; 
} 

public function __set($key, $value) 
{ 
    if(!$this->protectedChecks || !in_array($key, $this->protectedProperties)) 
      return parent::__set($key, $value); 
     trigger_error('Protected Field'); 
} 

public function activate() 
{ 
    $this->protectedChecks = false; 
    $this->status = 1; 
    $this->save(); // this is optional if you want to save the model immediately 
    $this->protectedChecks = true; 
} 

すべてのモデルを使用する場合は、上記のようなものをBaseModelに記述する必要があります。

0

あなたは試みることがあります。

<?php 

class User extends Eloquent { 

    protected $hidden = array('password', 'token'); 

} 
関連する問題