add small typo and wording improvements to chapters 9 and 10, update name of time service
This commit is contained in:
parent
6920ea390d
commit
d880aeb9a6
2 changed files with 21 additions and 23 deletions
|
@ -121,7 +121,6 @@ the container-interface.
|
||||||
In this class we will configure all services required for our application and make them accessible via the get($id)
|
In this class we will configure all services required for our application and make them accessible via the get($id)
|
||||||
method.
|
method.
|
||||||
|
|
||||||
p
|
|
||||||
Before we can implement the interface we need to install its definition with composer `composer require "psr/container:^1.0"`.
|
Before we can implement the interface we need to install its definition with composer `composer require "psr/container:^1.0"`.
|
||||||
now we can create a file with a Class that implements that interface.
|
now we can create a file with a Class that implements that interface.
|
||||||
|
|
||||||
|
|
|
@ -2,13 +2,13 @@
|
||||||
|
|
||||||
### Invoker
|
### Invoker
|
||||||
|
|
||||||
Currently all our Actions need to implement the RequestHandlerInterface, which forces us to accept the Request as the
|
Currently, all our Actions need to implement the RequestHandlerInterface, which forces us to accept the Request as the
|
||||||
one and only argument to our handle function, but most of the time we only need a few attributes in our Action a long
|
one and only argument to our handle function, but most of the time we only need a few attributes in our Action a long
|
||||||
with some services and not the whole Requestobject with all its various properties.
|
with some services and not the whole Request object with all its various properties.
|
||||||
|
|
||||||
If we take our Hello action for example we only need a response object, the time service and the 'name' information from
|
If we take our Hello action for example we only need a response object, the clock service and the 'name' information from
|
||||||
the request-uri. And as that class only provides one simple method we could easily make that invokable as we alreay named
|
the request-uri. And as that class only provides one simple method we could easily make that invokable as we already named
|
||||||
the class hello and it would be redundant to also call the the method hello. So an updated version of that class could
|
the class hello, and it would be redundant to also call the method hello. So an updated version of that class could
|
||||||
look like this:
|
look like this:
|
||||||
|
|
||||||
```php
|
```php
|
||||||
|
@ -16,17 +16,16 @@ final class Hello
|
||||||
{
|
{
|
||||||
public function __invoke(
|
public function __invoke(
|
||||||
ResponseInterface $response,
|
ResponseInterface $response,
|
||||||
Now $now,
|
Clock $clock,
|
||||||
string $name = 'Stranger',
|
string $name = 'Stranger'
|
||||||
): ResponseInterface
|
): ResponseInterface
|
||||||
{
|
{
|
||||||
$body = $this->response->getBody();
|
$body = $response->getBody();
|
||||||
$nowString = $now->get()->format('H:i:s');
|
|
||||||
|
|
||||||
$body->write('Hello ' . $name . '!');
|
$body->write('Hello ' . $name . '!<br />');
|
||||||
$body->write(' The Time is ' . $nowString);
|
$body->write('The time is: ' . $clock->now()->format('H:i:s'));
|
||||||
return $response
|
|
||||||
->withBody($body)
|
return $response->withBody($body)
|
||||||
->withStatus(200);
|
->withStatus(200);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,17 +33,17 @@ final class Hello
|
||||||
|
|
||||||
It would also be neat if we could define a classname plus a method as target handler in our routes, or even a short
|
It would also be neat if we could define a classname plus a method as target handler in our routes, or even a short
|
||||||
closure function if we want to redirect all requests from '/' to '/hello' because we have not defined a handler for the
|
closure function if we want to redirect all requests from '/' to '/hello' because we have not defined a handler for the
|
||||||
rootpath of our application yet.
|
root path of our application yet.
|
||||||
|
|
||||||
```php
|
```php
|
||||||
$r->addRoute('GET', '/hello[/{name}]', Hello::class);
|
$r->addRoute('GET', '/hello[/{name}]', Hello::class);
|
||||||
$r->addRoute('GET', '/other-route', [Other::class, 'someFunctionName']);
|
$r->addRoute('GET', '/other-route', [Other::class, 'handle']);
|
||||||
$r->addRoute('GET', '/', fn (Response $r) => $r->withStatus(302)->withHeader('Location', '/hello'));
|
$r->addRoute('GET', '/', fn (Response $r) => $r->withStatus(302)->withHeader('Location', '/hello'));
|
||||||
```
|
```
|
||||||
|
|
||||||
In order to support this crazy route definitions we would need to write a lot of for actually calling the result of the
|
In order to support this crazy route definitions we would need to write a lot of code for actually calling the result of
|
||||||
route dispatcher. If the result is a name of an invokable class we would use the container to create an instance of that
|
the route dispatcher. If the result is a name of an invokable class we would use the container to create an instance of
|
||||||
class for us and then use the [reflection api](https://www.php.net/manual/en/book.reflection.php) to figure out what
|
that class for us and then use the [reflection api](https://www.php.net/manual/en/book.reflection.php) to figure out what
|
||||||
arguments the __invoke function has, try to fetch all arguments from the container and then add some more from the router
|
arguments the __invoke function has, try to fetch all arguments from the container and then add some more from the router
|
||||||
if they are needed and available. The same if we have an array of a class name with a function to call, and for a simple
|
if they are needed and available. The same if we have an array of a class name with a function to call, and for a simple
|
||||||
callable we would need to manually use reflection as well to resolve all the arguments.
|
callable we would need to manually use reflection as well to resolve all the arguments.
|
||||||
|
@ -68,13 +67,13 @@ $response = $container->call($handler, $args);
|
||||||
Try to open [localhost:1235/](http://localhost:1235/) in your browser and check if you are getting redirected to '/hello'.
|
Try to open [localhost:1235/](http://localhost:1235/) in your browser and check if you are getting redirected to '/hello'.
|
||||||
|
|
||||||
But by now you should know that I do not like to depend on specific implementations and the call method is not defined in
|
But by now you should know that I do not like to depend on specific implementations and the call method is not defined in
|
||||||
the psr/container interface. Therefore we would not be able to use that if we are ever switching to the symfony container
|
the psr/container interface. Therefore, we would not be able to use that if we are ever switching to the symfony container
|
||||||
or any other implementation.
|
or any other implementation.
|
||||||
|
|
||||||
Fortunately for us (or me) the PHP-CI container ships that function as its own class that is independent of the specific
|
Fortunately for us (or me) the PHP-CI container ships that function as its own class that is independent of the specific
|
||||||
container implementation so we could use it with any container that implements the ContainerInterface. And best of all
|
container implementation, so we could use it with any container that implements the ContainerInterface. And best of all
|
||||||
the class ships with its own [Interface](https://github.com/PHP-DI/Invoker/blob/master/src/InvokerInterface.php) that
|
the class ships with its own [Interface](https://github.com/PHP-DI/Invoker/blob/master/src/InvokerInterface.php) that
|
||||||
we could implement if we ever want to write our own implementation or we could write an adapter that uses a different
|
we could implement if we ever want to write our own implementation, or we could write an adapter that uses a different
|
||||||
class that solves the same problem.
|
class that solves the same problem.
|
||||||
|
|
||||||
But for now we are using the solution provided by PHP-DI.
|
But for now we are using the solution provided by PHP-DI.
|
||||||
|
|
Loading…
Reference in a new issue