如何使Laravel 4应用程序与“;只读”;数据库模式


How to make Laravel 4 application with "read only" database mode

我想让我的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开发的一个选择——并不是所有的事件都会这样,也不是所有从数据库添加/删除数据的操作都会触发事件。