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;