rename engine to renderer, solves #15
This commit is contained in:
parent
521b4025c0
commit
a99778b049
2 changed files with 22 additions and 20 deletions
|
@ -24,20 +24,20 @@ First let's define the interface that we want. Remember the [interface segregati
|
||||||
|
|
||||||
So what does our template engine actually need to do? For now we really just need a simple `render` method. Create a new folder in your `src/` folder with the name `Template` where you can put all the template related things.
|
So what does our template engine actually need to do? For now we really just need a simple `render` method. Create a new folder in your `src/` folder with the name `Template` where you can put all the template related things.
|
||||||
|
|
||||||
In there create a new interface `Engine.php` that looks like this:
|
In there create a new interface `Renderer.php` that looks like this:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace Example\Template;
|
namespace Example\Template;
|
||||||
|
|
||||||
interface Engine
|
interface Renderer
|
||||||
{
|
{
|
||||||
public function render($template, $data = []);
|
public function render($template, $data = []);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Now that this is sorted out, let's create the mustache adapter class. In the same folder, create the file `MustacheEngineAdapter.php` with the following content:
|
Now that this is sorted out, let's create the implementation for mustache. In the same folder, create the file `MustacheRenderer.php` with the following content:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
|
@ -46,7 +46,7 @@ namespace Example\Template;
|
||||||
|
|
||||||
use Mustache_Engine;
|
use Mustache_Engine;
|
||||||
|
|
||||||
class MustacheEngineAdapter implements Engine
|
class MustacheRenderer implements Renderer
|
||||||
{
|
{
|
||||||
private $engine;
|
private $engine;
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ As you can see the adapter is really simple. While the original class had a lot
|
||||||
|
|
||||||
Of course we also have to add a definition in our `Dependencies.php` file because otherwise the injector won't know which implementation he has to inject when you hint for the interface. Add this line:
|
Of course we also have to add a definition in our `Dependencies.php` file because otherwise the injector won't know which implementation he has to inject when you hint for the interface. Add this line:
|
||||||
|
|
||||||
`$injector->alias('Example\Template\Engine', 'Example\Template\MustacheEngineAdapter');`
|
`$injector->alias('Example\Template\Renderer', 'Example\Template\MustacheRenderer');`
|
||||||
|
|
||||||
Now in your `Homepage` controller, add the new dependency like this:
|
Now in your `Homepage` controller, add the new dependency like this:
|
||||||
|
|
||||||
|
@ -77,29 +77,27 @@ namespace Example\Controllers;
|
||||||
|
|
||||||
use Http\Request;
|
use Http\Request;
|
||||||
use Http\Response;
|
use Http\Response;
|
||||||
use Example\Template\Engine as TemplateEngine;
|
use Example\Template\Renderer;
|
||||||
|
|
||||||
class Homepage
|
class Homepage
|
||||||
{
|
{
|
||||||
private $request;
|
private $request;
|
||||||
private $response;
|
private $response;
|
||||||
private $templateEngine;
|
private $renderer;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
Request $request,
|
Request $request,
|
||||||
Response $response,
|
Response $response,
|
||||||
TemplateEngine $templateEngine
|
Renderer $renderer
|
||||||
) {
|
) {
|
||||||
$this->request = $request;
|
$this->request = $request;
|
||||||
$this->response = $response;
|
$this->response = $response;
|
||||||
$this->templateEngine = $templateEngine;
|
$this->renderer = $renderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
As you can see I imported the engine with an alias. Without the full namespace it would be relatively unclear what a class does if it is just referenced by `Engine`. Also, another part of the application might also have a class with the name `Engine`. So to avoid that I give it a short and descriptive alias.
|
|
||||||
|
|
||||||
We also have to rewrite the `show` method. Please note that while we are just passing in a simple array, Mustache also gives you the option to pass in a view context object. We will go over this later, for now let's keep it as simple as possible.
|
We also have to rewrite the `show` method. Please note that while we are just passing in a simple array, Mustache also gives you the option to pass in a view context object. We will go over this later, for now let's keep it as simple as possible.
|
||||||
|
|
||||||
```php
|
```php
|
||||||
|
@ -108,7 +106,7 @@ We also have to rewrite the `show` method. Please note that while we are just pa
|
||||||
$data = [
|
$data = [
|
||||||
'name' => $this->request->getParameter('name', 'stranger'),
|
'name' => $this->request->getParameter('name', 'stranger'),
|
||||||
];
|
];
|
||||||
$html = $this->templateEngine->render('Hello {{name}}', $data);
|
$html = $this->renderer->render('Hello {{name}}', $data);
|
||||||
$this->response->setContent($html);
|
$this->response->setContent($html);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -132,7 +130,11 @@ In your project root folder, create a `templates` folder. In there, create a fil
|
||||||
Hello {{ name }}
|
Hello {{ name }}
|
||||||
```
|
```
|
||||||
|
|
||||||
Now you can go back to your `Homepage` controller and change the render line to `$content = $this->templateEngine->render('Homepage', $data);`
|
Now you can go back to your `Homepage` controller and change the render line to `$content = $this->renderer
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
->render('Homepage', $data);`
|
||||||
|
|
||||||
Navigate to the hello page in your browser to make sure everything works. And as always, don't forget to commit your changes.
|
Navigate to the hello page in your browser to make sure everything works. And as always, don't forget to commit your changes.
|
||||||
|
|
||||||
|
|
|
@ -107,12 +107,12 @@ public function show($params)
|
||||||
{
|
{
|
||||||
$slug = $params['slug'];
|
$slug = $params['slug'];
|
||||||
$data['content'] = $this->pageReader->getContentBySlug($slug);
|
$data['content'] = $this->pageReader->getContentBySlug($slug);
|
||||||
$html = $this->templateEngine->render('Page', $data);
|
$html = $this->renderer->render('Page', $data);
|
||||||
$this->response->setContent($html);
|
$this->response->setContent($html);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
To make this work, we will need to inject a `Response`, `TemplateEngine` and a `PageReader`. I will leave this to you as an exercise. Remember to `use` all the proper namespaces. Use the `Homepage` controller as a reference.
|
To make this work, we will need to inject a `Response`, `Renderer` and a `PageReader`. I will leave this to you as an exercise. Remember to `use` all the proper namespaces. Use the `Homepage` controller as a reference.
|
||||||
|
|
||||||
Did you get everything to work?
|
Did you get everything to work?
|
||||||
|
|
||||||
|
@ -124,22 +124,22 @@ If not, this is how the beginning of your controller should look now:
|
||||||
namespace Example\Controllers;
|
namespace Example\Controllers;
|
||||||
|
|
||||||
use Http\Response;
|
use Http\Response;
|
||||||
use Example\Template\Engine as TemplateEngine;
|
use Example\Template\Renderer;
|
||||||
use Example\Page\PageReader;
|
use Example\Page\PageReader;
|
||||||
|
|
||||||
class Page
|
class Page
|
||||||
{
|
{
|
||||||
private $response;
|
private $response;
|
||||||
private $templateEngine;
|
private $renderer;
|
||||||
private $pageReader;
|
private $pageReader;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
Response $response,
|
Response $response,
|
||||||
TemplateEngine $templateEngine,
|
Renderer $renderer,
|
||||||
PageReader $pageReader
|
PageReader $pageReader
|
||||||
) {
|
) {
|
||||||
$this->response = $response;
|
$this->response = $response;
|
||||||
$this->templateEngine = $templateEngine;
|
$this->renderer = $renderer;
|
||||||
$this->pageReader = $pageReader;
|
$this->pageReader = $pageReader;
|
||||||
}
|
}
|
||||||
...
|
...
|
||||||
|
@ -207,7 +207,7 @@ public function show($params)
|
||||||
return $this->response->setContent('404 - Page not found');
|
return $this->response->setContent('404 - Page not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
$html = $this->templateEngine->render('Page', $data);
|
$html = $this->renderer->render('Page', $data);
|
||||||
$this->response->setContent($html);
|
$this->response->setContent($html);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
Loading…
Reference in a new issue