“Conjunto” PHP Fat Free com Closure
-
15-11-2019 - |
Pergunta
Alguém sabe como atribuir e usar um fechamento em um modelo/visualização usando F3::set?Ou oferecer uma solução para o seguinte cenário?
Estou usando a versão 1.4.4
Aqui está o que estou tentando fazer:
//In Model - Loaded from controller w/ F3::call
F3::set('getPrice', function($tax, $profile){
//return price
});
//In View - Inside an F3:repeat of @products
{@getPrice(@product.tax, @product.profile)}
Mas os fechamentos não parecem ser suportados...Se eu carregar o modelo usando require/include, definir a função sem F3::set e habilitar funções definidas pelo usuário na visualização, posso fazê-lo funcionar.Mas eu esperava manter o nível de separação proporcionado pelo uso de F3::call/F3::set.
Obrigado!
Solução 2
Ok, então a versão 1.4.4 não suportava isso, mas a versão 2.0 sim.Obrigado pelas ótimas atualizações no 2.0!Aqui está o suporte à função anônima:
Controlador-
F3::set('func',
function($a,$b) {
return $a.', '.$b;
}
);
Modelo-
{{@func('hello','world')}}
E aqui está o suporte ao objeto:
$foo=new stdClass;
$foo->phrase='99 bottles of beer';
F3::set('myvar',$foo);
{{@myvar->phrase}}
Outras dicas
Talvez não seja a resposta que você gostaria de ouvir, mas:O mecanismo de template do F3 é horrivelmente restritivo, então eu recomendo não usá-lo.O próprio F3 é adequado para projetos simples e, felizmente, você pode escolher quais componentes deseja usar.Modelos PHP simples ainda superam qualquer mecanismo de modelo e com um pequeno wrapper você pode acessar facilmente variáveis F3 neles.Seu modelo então poderia ser assim:
<?= $this->getPrice($this->product->tax, $this->product->profile) ?>
O wrapper só precisa incluir o modelo e implementar __get e __call apropriadamente.