PHP Redbean, Custom model & Custom Properties (non-saving)

You might want custom properties on your beans in redbean, such as if you want to do $bean->url but you don't save a url in the databse. perhaps you save a slug, and the url ends up being https://taeluf.com/funny-cats/THE_SLUG/. Or something like the example below that concatenates first name & last name.

Note that I use RDB instead of R. This was a quick change to the redbean source code. R caused conflicts in my project.

  1. Write a CustomProps class to modify built-in behavior
  2. Write a model that uses the custom property feature
  3. Enable your Custom Props class & Your model namespace
  4. Use it!

Step 1 - Extend Redbean

namespace RDBBean;
class CustomProps extends \RedBeanPHP\OODBBean {
    //With how redbean works, the `&` for return-by-reference is required (I think)
    public function &__get($prop){
        $model = $this->box();
        if (method_exists($model,$method='get'.ucfirst($prop)))return $model->$method();
        return parent::__get($prop);
    }
}

Step 2 - Create a Model

namespace RDBModel;
class Person extends \Redbean_SimpleModel {

    public function &getFullName(){
        $name = $this->bean->firstName.' '.$this->bean->lastName;
        return $name;
    }
}

Step 3 - Tell Redbean about your extensions

define('REDBEAN_MODEL_PREFIX', '\\RDBModel\\');
define('REDBEAN_OODBBEAN_CLASS', '\\RDBBean\\CustomProps');

Step 4 - Use the bean's custom prop!

$person = \RDB::findOne('person','id=?',[1]);
$fullName = $person->fullName;
echo $fullname;