> If we could get 2-3 of the major engines on board with a ViewModel
approach, using the class as the template indicator, I would absolutely
support that.  That seems like a large lift, however, especially as the two
biggest engines (Twig and Blade) > are part of projects that seem to not be
interested in FIG. :-(  We might be able to get someone from Twig involved,
but Blade feels unlikely.  (I've no idea about Smarty or Latte.)

Hi. Blade kind of supports view models when using components. In the
internal framework of my organization I developed a wrapper around the
views, which is a View class partially based on the
spatie/laravel-views-models package (
https://packagist.org/packages/spatie/laravel-view-models). My controller
methods usually return views like this: *"return new
RandomView(pieceOfInfo: $info, contentTitle:'My page');"*. But this view
class is entirely optional. In our team, when it's overkill to create a
view model to render just one small stuff, one can still call the template
rendering function directly. The ViewModel class can guess the template
file name or you can set one yourself.

About adoption of this possible PSR: If we look at the usage of this spatie
package, it has almost 2 million downloads, but I think Laravel does not
want to integrate it in the framework because as it did with the
spatie/laravel-blade-x components package (
https://packagist.org/packages/spatie/laravel-blade-x). I feel they don't
want to spend lots of time with the template engine because of the JS FE
libs/frameworks and their Inertia lib.

But if we think of interoperability, maybe think on a higher level, like a
Renderable or something like that, it could have a higher acceptance among
the community.

Best regards,
Erick

Em seg., 18 de dez. de 2023 às 15:32, Larry Garfield <la...@garfieldtech.com>
escreveu:

> On Sun, Dec 17, 2023, at 3:08 PM, Rasmus Schultz wrote:
> > Hi Alex,
> >
> > I was wondering how my very simple template locator would fit with this:
> >
> > https://github.com/mindplay-dk/kisstpl
> >
> > As you can see, the interface for this is radically different - there
> > is no string for the template name, and no array for the data.
> >
> > After some thinking though, I realized this locator could actually use
> > this PSR internally - meaning, my library, which currently uses plain
> > PHP templates only, would be able to internally dispatch this
> > interface, which means you could use the view-model approach (no
> > string, no array) to dispatch any standard template engine. Pretty
> > cool. :-)
> >
> > The one area where this proposal falls short (as, from the discussion,
> > you already know) is with its inability to stream. As you can see here,
> > my library addresses this by having two methods, render() and capture()
> >
> >
> https://github.com/mindplay-dk/kisstpl/blob/7d59e10da48b2a86f14244c490231a56f78c2611/src/Renderer.php#L10-L41
> >
> > What I would suggest, is to do the same for this proposal - rename
> > render() to capture() and just have a second method with return-type
> > void:
> >
> > /**
> >  * Render the template with the given context data, directly to output.
> >  *
> >  * @param string $template
> >  * @param array<string, mixed> $context
> >  *
> >  * @return void
> >  *
> >  * @throw TemplateNotFoundExceptionInterface
> >  */
> > public function render(string $template, array $context = []): void;
> >
> > /**
> >  * Render the template with the given context data.
> >  *
> >  * @param string $template
> >  * @param array<string, mixed> $context
> >  *
> >  * @return void
> >  *
> >  * @throw TemplateNotFoundExceptionInterface
> >  */
> > public function capture(string $template, array $context = []): string;
> >
> > Now, I'm sure there will be some engines that are incapable of
> > rendering directly to output - in those cases, render() would simply be
> > implemented as e.g. echo $this->capture() and, of course, you wouldn't
> > get the performance or memory advantage of streaming here.
> >
> > But the proposal also wouldn't *stand in the way* of getting this
> > advantage from template engines that *are* capable of streaming.
> >
> > Looks like a good proposal, but addressing this issue seems easy enough
> > and worth while, since it doesn't add any real complexity for
> > implementors.
> >
> > - Rasmus Schultz
>
> I like View Models as a conceptual design.  It does side-step the "file
> name" problem, provides structure, etc.  It's also consistent with how
> PSR-14 works, by using the PHP type itself as the branching/matching
> factor.  There's two problems.
>
> 1. Virtually all frameworks today use response objects (whether PSR-7,
> HttpFoundation, or otherwise).  The "streaming by default" templating
> approach is not compatible with that model.  Basically everyone would need
> to switch from the common `render()` method to `capture()`, if done this
> way, and that's definitely not going to fly.  While you could stream the
> template inside a streaming response object, I don't think anyone does, and
> that's rarely necessary or even a good idea.
>
> 2.  While I'd love it if ViewModels were more common, as far as I know not
> a single major template engine that does that.  Blade, Twig, and Smarty are
> all array-based.  Latte supports view models, but still requires a template
> name.  (https://latte.nette.org/en/develop#toc-parameters-as-a-class)
> Adopting a ViewModel-centric spec would require figuring out a way to allow
> the major engines to adopt it in a BC-compatible way (as PSR-14 was able to
> do).
>
> If we could get 2-3 of the major engines on board with a ViewModel
> approach, using the class as the template indicator, I would absolutely
> support that.  That seems like a large lift, however, especially as the two
> biggest engines (Twig and Blade) are part of projects that seem to not be
> interested in FIG. :-(  We might be able to get someone from Twig involved,
> but Blade feels unlikely.  (I've no idea about Smarty or Latte.)
>
> (There would almost certainly be other things that would need to be
> standardized, like how to mark a given property as being already escaped so
> no further escaping is needed, but those discussions aren't relevant until
> the above are addressed.)
>
> --Larry Garfield
>
> --
> You received this message because you are subscribed to the Google Groups
> "PHP Framework Interoperability Group" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to php-fig+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/php-fig/cabbfab5-11ff-48d8-9fa7-5979ebfbb775%40app.fastmail.com
> .
>

-- 
You received this message because you are subscribed to the Google Groups "PHP 
Framework Interoperability Group" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to php-fig+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/php-fig/CAGS0MVA-HT%2Bb0fuQ7qD%2BV0Kdj9VMTG-MDoi072L4S-KYhpZr%3DA%40mail.gmail.com.

Reply via email to