Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá bom dia,
Estou iniciando em O.O e mvc usando php, estou tentando realizar um trabalho usando mvc, até entendi o conceito já li bastante sobre, minha dúvida é a seguinte...
Tenho a seguinte estrutura, uma pasta model (que possui uma pasta dao com a parte de acesso a dados, e uma entidade, onde tenho a classe de fato), view (onde estão meus formulários, tabelas para listagem, etc), e controller (onde vai estar os arquivos de controlador).
Meu problema é o seguinte, como eu posso criar uma classe controller e essa classe receber os dados vindos de uma view por exemplo, um formulário no seu método action eu devo chamar um método lá do meu controlador para inserir correto ? qual a melhor forma pra se fazer isso, eu a principio estava passando no action do formulário isso aqui:
../controller/controllerEvento.php?action=inserir
só que meu controller era um arquivo .php simples onde eu só recuperava por get ess informação e chamava o método correspondente, agora eu fiz desse arquivo uma classe e não estou sabendo como posso informar pra ele que a ação é inserir, e nem como recuperar esses dados por post dentro da classe controller que eu criei.....
Alguém ae poderia me ajudar???
eu vi alguns exemplos na internet desse jeito, mas sei que não é a melhor forma pra isso...
<?php
require __DIR__.'/../model/dao/EventoDao.php';
require __DIR__.'/../model/entidades/Evento.php';
class ControllerEvento
{
public function __construct(){
$action = $_GET['action'];
switch ($action){
case 'inserir':
$this->insere();
break;
case 'atualizar':
break;
}
}
public function insere(){
$e = new Evento;
$dao = new EventoDao;
$e->setNomeEvento($_POST['nomeEvento']);
$e->setDataEvento($_POST['data_6']);
$e->setLocalEvento($_POST['localEvento']);
$e->setEntradaEvento($_POST['entradaEvento']);
$e->setSobreEvento($_POST['sobreEvento']);
try{
$dao->insereEvento($e);
header("Location: ../view/cadastrar.php?op=evento");
}
catch (Exception $e){
header("Location: ../view/cadastrar.php?op=evento");
}
}
}
new ControllerEvento();Gostei do seu esquema de criar o MVC e estar pensando nessa arquitetura tabem gostei de você já está separando DAO e Entities gostei tbm é assim que tem que ser =)
Agora a sua arquitetura está só um pouco equivocado.
Eu aconsolho você abstratir mais ela tornando ela mais acessível e expansível. Abaixo segue um exemplo do que estou falando
Não cheguei a testar fui só escrevendo aqui mesmo, mais assim o seu sistema se torna mais espancivel e de várias camadas.
Esse modelo que desenhei abaixo é só um exemplo basico claro que isso pode evolir bastante mais já é um caminho para você poder abrir a mente.
Estrutura Pasta
/root
app
modules
Product
Controller // armazena os controller
IndexController.php // controller padrão de acesso
namespace Product\Controller;
use Core\Controller\AbstractController;
class IndexController extends AbstractController {
public function indexAction() {
echo "Chego!";
}
}
Business // armazena as regras de negocios
ProductBean.php
Dao // armazena os manipuladores das entities
ProductDao.php
Entity // armazena o mapeamento das entities
Product.php
view // armazena as suas views
index
index.phtml
library
Core
Controller
namespace Core\Controller;
AbastractController.php {
// função responsável por dispachar a action
public function dispatch($action) {
$actionName = $action . 'Action';
if(!method_exists($this, $actionName))
throw BadMethodCallException(sprintf("O method %s não foi encontrado", $actionName));
$this->$actionName();
}
}
Application.php // kraio que irá iniciar sua APP
namespace Core;
class Application {
// mantem a instancia do objeto
private $_instance;
// padrão singleton
// somente podemos ter 1 instancia do objeto Application no sistema todo
private function __construct() {}
private function __clone() {}
public static function getInstance() {
if(!self::$_instance instanteof Application)
self::$_instance = new self;
return self::$_instance;
}
public function run() {
$this->getInstance()->dispatch();
}
private function dispatch() {
//montando algo simples
//na verdade aqui você teria que criar um esquema
//melhor de leitura de request como uma classe Request que trata as requests
$module = isset($_GET["m"])? strip_tags($_GET["m"]) : null;
$controller = isset($_GET["c"])? strip_tags($_GET["c"]) : null;
$action = isset($_GET["a"])? strip_tags($_GET["a"]) : null;
$clsControllerName = sprintf('%s\Controller\%sController', ucfirst($module), ucfirst($controller));
$clsControllerI = new $clsControllerName();
$clsControllerI->dispatch($action);
}
} require 'init.php';
try {
Application::getInstance()->run();
}catch(Exception $e) {
echo $e->getMessage();
} define("DS", DIRECTORY_SEPARATOR);
define("SYS_PATH", realpath(__DIR__));
define("SYS_PATH_MODULES", SYS_PATH . DS . "app" . DS . "modules");
define("SYS_PATH_LIBRAY", SYS_PATH . DS . "app" . DS . "library");
// configurando os includes paths
set_include_path(
SYS_PATH_MODULES . PATH_SEPARATOR .
SYS_PATH_LIBRAY . PATH_SEPARATOR .
get_include_path()
);
// um autoload simples
spl_autoload_register(function($clsName) {
$fileURI = clsName . '.php';
if(!file_exists($fileURI))
throw new RuntimeException(sprintf("O arquivo %s não foi encotnrado", $fileURI));
require_once $fileURI;
});
Bem com isso você já consegue chegar no seu Controller acessando a URL da seguinte forma:
site.com.br?m=product&c=index&a=index
m = modulo
c = controller
a = action
Então nesse caso a URL está tentando achar o seguinte:
Ação "index"Action dentro do Controller "Index"Controller do Módulo "Product"
mostre o código da classe "controllerEvento"