-
-
Save cambiata/1289251 to your computer and use it in GitHub Desktop.
<?php | |
/** | |
* | |
* Simplistic View_Model attempt for Kohana 3 | |
* @author Cambiata | |
*/ | |
class View_Model { | |
public function render($viewfile=FALSE) | |
{ | |
$viewfile = $viewfile ?: $this->get_viewfile(); | |
$modeldata = $this->render_modeldata(); | |
return View::factory($viewfile, $modeldata)->render(); | |
} | |
public function __toString() | |
{ | |
return $this->render(); | |
} | |
//------------------------------------------------------------ | |
private function get_viewfile() | |
{ | |
$segments = explode('_', strtolower(get_class($this))); | |
if (count($segments) > 1) array_shift($segments); | |
return implode('/', $segments); | |
} | |
private function render_modeldata() | |
{ | |
$modeldata = array(); | |
$reflection = new ReflectionClass(get_class($this)); | |
$public_properties = $reflection->getProperties(ReflectionProperty::IS_PUBLIC); | |
foreach ($public_properties as $property) | |
{ | |
$datakey = $property->name; | |
$modeldata[$datakey] = $this->$datakey; | |
} | |
$protected_properties = $reflection->getProperties(ReflectionProperty::IS_PROTECTED); | |
foreach ($protected_properties as $property) | |
{ | |
$datakey = $property->name; | |
$modeldata[$datakey] = $this->$datakey; | |
} | |
$protected_methods = $reflection->getMethods(ReflectionProperty::IS_PROTECTED); | |
foreach ($protected_methods as $protected_method) | |
{ | |
$datakey = $protected_method->name; | |
$modeldata[$datakey] = $this->$datakey(); | |
} | |
// dump all data to $modeldata parameter - for easy debugging | |
$modeldata['modeldata'] = $modeldata; | |
return $modeldata; | |
} | |
} |
Hmmm, just feels "hacky" to me. Kostache simply provides Kostache::set()
for setting data. Surely that isn't too bad, I mean you already have ViewModel::render()
which is public. Sure you could go down the magic route of PHPDoc style stuff, but again it feels like too much magic.
In ViewModel::render_modeldata()
you could easily just skip a few predefined methods, and this way you could provide classes that extend ViewModel
a way to exclude methods too!
In other news I will be releasing a cleaner, less convoluted update to Beautiful View that I would love you to take a look at if you have some spare time.
Thank you for your input! As I said, the purpose of creating this was fun and learning! :-)
I had an array with some methodnames to exclude, but took it away - wanted to keep it as minimalistic as possible.
I'm looking forward to the Beautiful view update! I'll check it out!
Hi Luke!
The reason is that I want to be able to use public methods as getters/setters accessable from the controller, without risking that they would interfere with the template model data. From a traditional OO view that's not ideal, but I couldn't figure out something better without the use of PhpDoc comment directives. Haven't tried that, but it's a bit more complicated and might take some microseconds to parse...