2016-10-30 36 views
1

似乎是太明顯,但如何使一個類私有財產:如何在Laravel雄辯模型中創建私有財產?

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

不錯的。實際上,我將這些方法轉換爲**特質**,因此您可以在任何需要的模型中實現此功能。可能是一個不錯的選擇。 –

+1

是的,這將是非常方便的,想寫一下關於'trait'只是一秒前:) – Roman

+0

我在這裏添加了一個有關setter和getters的問題: http://stackoverflow.com/questions/40337400/adding- setters-and-getters-to-laravel-model – Gazzer