1 <?php
2
3 namespace Balance\Model;
4
5 use Balance\Model\Persistence\PersistenceInterface;
6 use Zend\Form\Form;
7 use Zend\Stdlib\Parameters;
8
9 /**
10 * Camada de Modelo
11 *
12 * Estrutura utilizada como padrão para processamento de informações apresentadas pela camada de controle durante o
13 * fluxo de processamento do aplicativo. Centraliza a configuração de objetos de formulário e persistência de dados.
14 */
15 class Model
16 {
17 /**
18 * Formulário
19 * @type Form
20 */
21 private $form;
22
23 /**
24 * Formulário de Pesquisa
25 * @type Form
26 */
27 private $formSearch;
28
29 /**
30 * Persistência de Dados
31 * @type PersistenceInterface
32 */
33 private $persistence;
34
35 /**
36 * Construtor Padrão
37 *
38 * @param Form $form Formulário
39 * @param Form $formSearch Formulário de Pesquisa
40 * @param PersistenceInterface $persistence Persistência de Dados
41 */
42 public function __construct(Form $form, Form $formSearch, PersistenceInterface $persistence)
43 {
44 $this
45 ->setForm($form)
46 ->setFormSearch($formSearch)
47 ->setPersistence($persistence);
48 }
49
50 /**
51 * Configuração de Formulário
52 *
53 * @param Form $form Elemento para Configuração
54 * @return Model Próprio Objeto para Encadeamento
55 */
56 protected function setForm(Form $form)
57 {
58 $this->form = $form;
59 return $this;
60 }
61
62 /**
63 * Apresentação de Formulário
64 *
65 * @return Form Elemento Solicitado
66 */
67 public function getForm()
68 {
69 return $this->form;
70 }
71
72 /**
73 * Configuração de Formulário de Pesquisa
74 *
75 * @param Form $formSearch Elemento para Configuração
76 * @return Model Próprio Objeto para Encadeamento
77 */
78 protected function setFormSearch(Form $formSearch)
79 {
80 $this->formSearch = $formSearch;
81 return $this;
82 }
83
84 /**
85 * Apresentação de Formulário de Pesquisa
86 *
87 * @return Form Elemento Solicitado
88 */
89 public function getFormSearch()
90 {
91 return $this->formSearch;
92 }
93
94 /**
95 * Configuração de Persistência de Dados
96 *
97 * @param PersistenceInterface $persistence Elemento para Configuração
98 * @return Model Próprio Objeto para Encadeamento
99 */
100 protected function setPersistence(PersistenceInterface $persistence)
101 {
102 $this->persistence = $persistence;
103 return $this;
104 }
105
106 /**
107 * Apresentação de Persistência de Dados
108 *
109 * @return PersistenceInterface Elemento Solicitado
110 */
111 public function getPersistence()
112 {
113 return $this->persistence;
114 }
115
116 /**
117 * Consulta de Elementos
118 *
119 * @param Parameters $params Parâmetros de Execução
120 * @return array Conjunto de Informações Encontradas
121 */
122 public function fetch(Parameters $params)
123 {
124 // Formulário de Pesquisa
125 $form = $this->getFormSearch();
126 // Preencher Formulário
127 $form->setData($params);
128 // Validação
129 $form->isValid();
130 // Reiniciar Parâmetros
131 $params = new Parameters();
132 // Capturar Valores Válidos
133 foreach ($form->getInputFilter()->getValidInput() as $identifier => $input) {
134 $params[$identifier] = $input->getValue();
135 }
136 // Consulta de Elementos
137 return $this->getPersistence()->fetch($params);
138 }
139
140 /**
141 * Carregar Elemento
142 *
143 * @param Parameters $params Parâmetros de Execução
144 * @return array Conjunto de Informações Encontradas
145 */
146 public function load(Parameters $params)
147 {
148 // Carregar Elementos
149 $element = $this->getPersistence()->find($params);
150 // Encontrado?
151 if (! $element) {
152 throw new ModelException('Unknown Element');
153 }
154 // Preencher Formulário
155 $this->getForm()->setData($element);
156 // Apresentação
157 return $element;
158 }
159
160 /**
161 * Salvar Elemento
162 *
163 * @param Parameters $data Dados para Salvamento
164 * @throws ModelException Dados Inválidos
165 * @return Model Próprio Objeto para Encadeamento
166 */
167 public function save(Parameters $data)
168 {
169 // Formulário
170 $form = $this->getForm();
171 // Configurar Dados
172 $form->setData($data);
173 // Dados Válidos?
174 if (! $form->isValid()) {
175 throw new ModelException('Invalid Data');
176 }
177 // Capturar Valores
178 $values = $form->getData();
179 // Salvar Dados
180 $this->getPersistence()->save(new Parameters($values));
181 // Encadeamento
182 return $this;
183 }
184
185 /**
186 * Remover Elemento
187 *
188 * @param Parameters $params Parâmetros de Execução
189 * @throws ModelException Problema na Remoção do Elemento
190 * @return Model Próprio Objeto para Encadeamento
191 */
192 public function remove(Parameters $params)
193 {
194 // Remover Elemento
195 $this->getPersistence()->remove($params);
196 // Encadeamento
197 return $this;
198 }
199 }
200