I’m looking for a way to run functions in composers but only once like this:
class Post extends \Roots\Acorn\View\Composer
{
protected static $views = [
'*'
];
public function with()
{
return [
'functionA' => $this->functionA(),
'functionB' => $this->functionB(),
];
}
private function functionA()
{
$functionAReturn = [];
$functionAReturn['varA1'] = 'var 1';
$functionAReturn['varA2'] = 'var 2';
return $functionAReturn;
}
private function functionB()
{
$functionBReturn = [];
if ($this->functionA()['VarA1'] === 'var 1') {
$functionBReturn['varB1'] = 'var 1';
} else {
$functionBReturn['varB1'] = 'var A';
}
$functionBReturn['varB2'] = 'var B';
return $functionBReturn;
}
}
i want to output functionA in blade template, like {{ $functionA }} but also set functionB based on variables in functionA. Doing it like this means that functionA will be called twice though.
My closest solution for this is checking/setting $this->data or perhaps a private variable in functionA. It works, but it gets a little bloated and really not sure that data should be set like this.
An example:
class Post extends \Roots\Acorn\View\Composer
{
protected static $views = [
'*'
];
public function with()
{
return [
'functionA' => $this->functionA(),
'functionB' => $this->functionB(),
];
}
private function functionA()
{
if ($this->data->functionA) {
return $this->data->functionA;
}
$functionAReturn = [];
$functionAReturn['varA1'] = 'var 1';
$functionAReturn['varA2'] = 'var 2';
$this->data->functionA = $functionAReturn;
return $functionAReturn;
}
private function functionB()
{
$functionBReturn = [];
if ($this->functionA()['VarA1'] === 'var 1') {
$functionBReturn['varB1'] = 'var 1';
} else {
$functionBReturn['varB1'] = 'var A';
}
$functionBReturn['varB2'] = 'var B';
return $functionBReturn;
}
}
Is this the way to go, or any other suggestions?