【问题标题】:Custom setters and getters in LaravelLaravel 中的自定义 setter 和 getter
【发布时间】:2014-03-12 17:29:29
【问题描述】:

这是一个棘手的问题。

我正在 Laravel 中构建一个框架,我希望我的对象以透明的方式与 Rackspace 交互。 从现在开始,我可以在不考虑 Rackspace 的情况下上传/删除对象

$model->file = Input::file('thing'); // and it uploads to Rackspace.

我想要实现的下一步是使用我的配置文件获取路由。行为类似于$route = $file->source(例如,在数据库中使用带有 hello.jpg 的源代码)并以 rackspace.com/WHATEVER/hello.jpg 形式获取 $route。 rackspace.com/WHATEVER 部分在我的配置文件中,所以我唯一需要的是如何做出这种行为。

我一直在广泛搜索,但我只找到了__call() 方法。 我想要这样表现的字段是动态的,并且是从数组中设置的,例如:

public static $rackspaceable = array('source' => 'images-demo');

其中 images-demo 是一个 Rackspace 容器。

有没有人知道实现这一点,如果它甚至可能?

【问题讨论】:

    标签: php frameworks laravel laravel-4 call


    【解决方案1】:

    这可能是您正在寻找的:

    class Model extends Eloquent {
    
        public static $rackspaceable = array('source' => 'images-demo');
    
        public function __get($key)
        {
            if (isset(static::$rackspaceable[$key]))
            {
                return static::$rackspaceable[$key];
            }
    
            return parent::__get($key);
        }
    
        public function __set($key, $value)
        {
            if (isset(static::$rackspaceable[$key]))
            {
                static::$rackspaceable[$key] = $value;
            }
            else
            {
                parent::__set($key, $value);
            }
        }
    }
    

    使用它:

    $model = new Model;
    
    var_dump( $model->source );
    
    $model->source = 'new value';
    
    var_dump( $model->source );
    

    【讨论】:

    • 哇,安东尼奥这是一个很好的答案!它工作得很好!另外,您知道从 __get($key) 方法访问 $model->source 的方法吗?如果我这样做 $this->{$key} 我会收到 code ErrorException: Undefined property: RackFile::$source 错误。
    • 我不认为你可以,因为它会导致递归调用。
    • 你好!在用头撞屏幕 4 小时后,我找到了一个很酷的使用特征的解决方案。在 trait 中,我实现了 code __get($name) 方法,并检查 getter 是否属于我要监视的某些字段。结构类似于:code public function __get($name) { if($name == variableOfInterest) { return doSomethingSpecial } else return parent::__get($name) } 这样可以避免无限递归。也许它对其他人有帮助! :D 再次感谢安东尼奥!
    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2023-03-12
    • 2012-11-17
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    相关资源
    最近更新 更多