Vamos agora criar os containers da aplicação. Para isso criamos os
containers para a connexão e para a listagem de produtos:
$container['conn'] = function () {
return new
\Source\Conn('mysql:host=localhost;dbname=php_avanc_oo', "root",
"");
};
$container['product'] = function ($c) {
return new \Source\Product($c['conn']);
};
Note que para chamar outro container utilizamos um parametro
qualquer na função e chamamos ele com o nome do parametro do
container.
Aqui tivemos um erro pois precisamos passar o
namespace completo no arquivo do autoload do
composer.json. Após corrigir o arquivo .json devemos
recarregar o Composer com o comando:
$ composer update
Vamos separar agora os serviços e as configurações em arquivos
separados. Primeiro criamos um arquivo service com os
containers de conexão e de produtos. Em seguida criamos um arquivo
config que passará a instanciar os containers e armazenar as
variáveis de conexão (também em containers).
Para seguir com as abstrações criamos uma interface e uma
class para o ServiceProducts, ou seja, criamos a
inteface com os métodos necessários e a classe implementando o
método de listagem e os futuros métodos de save,
update e delete. Com isso a classe
Product passa a receber apenas os atributos (os campos do
DB). Criamos nessa classe os métodos getters/setters.
Criamos uma interface para a classe Product para
enviar os dados para a classe ServiceProduct (pelo que pude
entender enviamos as interfaces para não ter que enviar a classe
inteira).
No arquivo de service passamos a fazer a conexão com o DB a
partir do container serviceProduct e não mais pelo container
product (esse container só será utilizado para as opções de
set e get nos atributos que não serão implementadas).
As variáveis $product utilizadas no service não são
necessárias para a listagem de dados.