我想让我的Laravel 4应用程序具有只读模式。因此,对数据库的任何更新/写入都将被忽略。
这样做的正确方法是倾听雄辩的事件并返回false吗?
监听事件并返回false是不起作用的——Laravel的事件只是通知,它们本身并不能控制操作。也就是说,你在听呼喊,但你无法阻止呼喊的发生。从事件中返回false只会阻止在侦听器之后激发的其他侦听器。
回复:"只读"模式在很大程度上取决于您的应用程序如何写入数据库,但我会从重写DB
facade开始重写您自己的对象(扩展原始数据库对象),然后重新定义任何插入/更新等。方法在站点处于只读模式时不执行任何操作。您需要确保这些方法仍然返回正常情况下的结果(数组、空DB资源等)。
更新值得注意的是,某些组件(如Eloquent)将使用事件中的return false
来表示某些事件不应发生。
#File: vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
public function save(array $options = array())
{
$query = $this->newQueryWithoutScopes();
// If the "saving" event returns false we'll bail out of the save and return
// false, indicating that the save failed. This gives an opportunities to
// listeners to cancel save operations if validations fail or whatever.
if ($this->fireModelEvent('saving') === false)
{
return false;
}
//... rest of save code here
fireModelEvent
方法触发事件——如果返回false,则Eloquent将不会执行保存。这就是我所说的的意思,这在很大程度上取决于你的应用程序如何写入数据库——上面描述的事件行为是Eloquent开发的一个选择——并不是所有的事件都会这样,也不是所有从数据库添加/删除数据的操作都会触发事件。