如果你想防止不僅填充使用fill()
方法不被允許的屬性還可以直接設置它們,就像$model->foo = 'bar'
,那麼你一定要覆蓋Model::setAttribute()
方法。
最好在定製基礎模型中擴展Eloquent。因此,在app/Model.php
:
namespace App;
use Exception;
use Illuminate\Database\Eloquent\Model as Eloquent;
class Model extends Eloquent
{
// this should be actually defined in each sub-model
protected $allowed = ['firstname', 'lastname'];
public function setAttribute($key, $value)
{
// this way we can allow some attributes by default
$allowed = array_merge($this->allowed, ['id']);
if (! in_array($key, $allowed)) {
throw new Exception("Not allowed attribute '$key'.");
}
return parent::setAttribute($key, $value);
}
}
然後在模型不應該允許無效的屬性,你可以擴展這個基本模型:
use App\Model;
class User extends Model
@SteffenBrem,我強烈建議你使用口才,而不是教條的Laravel項目。 ) –
@AlexeyMezenin對於演示或原型,Eloquent是可以的,但對於任何其他情況,原則是優越的。雄辯違反了很多編程原則,他們這樣做是爲了讓它「更容易」(我們可以爭論)來協同工作。我只是給初學者提供建議,所以他們不必在編程之旅中走很長的路。 –
@SteffenBrem Laravel本身違反了很多編程原則。這就是爲什麼它對於真正的項目非常方便。 )Symfony是那些喜歡以便利和更高的發行速度滿足所有已知編程原則的人的另一個偉大框架。 –