Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bem pessoal, eu tenho aqui uma estrutura MVC, que é orientada pela url, então por exemplo, se eu tenho a seguinte url "www.meusite.com.br/cadastro/add", ele irá acessar o controlador(classe) "cadastro" e a action(metodo) "add", chamando pelo o controlador o arquivo da view "cadastro.phtml", enfim, quem conhece o zend deve estar familiarizado com isso, a minha dúvida é o seguinte, e se no controlador eu quiser criar uma variavel que seria printada(ECHO) na tela pelo arquivo "cadastro.phtml"??
Um pouco de codigo, um exemplo da classe do controlador Cadastro:
class Cadastro{
public function add(){
...
//Vamo dizer que eu queira personalizar o title do html, como jogar isso no arquivo "cadastro.phtml"??
$title = "Cadastro - Adicionar Usuário";
}
}
E agora um mini exemplo do cadastro.phtml
<html>
<head>
<title>(Variavel criada pela classe controlador Cadastro, ficaria aqui. Como eu faria isso???)</title>
</head>
<body>
...
</body>
</html>
Como eu faria isso?
abraço!
Oi Igor, desculpa a demora em responder. Então, eu não estou usando o zend, to fazendo na mão mesmo, até por aprendizado e não estou conseguindo usar a variavel que eu criei na classe, no arquivo phtml...
entao você tem q postar sua estrutura, nao da pra atirar no escuro....
>
entao você tem q postar sua estrutura, nao da pra atirar no escuro....
ok, quando chegar em casa eu posto toda a estrutura.
¬¬", agora entendo seu avatar....ok, mas deixa de postar nao....
Então, a aplicação é simples, em MVC, então temos o Model, Controller e o View, através do autoload são chamados o controlador e o model como mostrado no código abaixo:
Sim, eu sei que deve colocar o set_include_path, mas é que ainda estou na fase de implementação.
function __autoload_files($file){
require_once(CONTROLLERS . $file . 'Controller.php');
require_once(MODELS . $file . 'Model.php');
}
spl_autoload_register('__autoload_files');
O autoload chama os respectivos model e controlador, então se for digitado na url isso: www.site.com.br/teste/teste, ele irá chamar o modelo "TesteModel" o controlador "TesteController" e a action "testeAction", dentro do controlador eu chamo a respectiva view(teste.phtml). Segue abaixo o TesteController:
class TesteController extends Controller{
testeAction{
//Aqui chama a view pela classe Controller, mostro abaixo o codigo do Controller
$this->view('teste', 'teste');
//Aqui a variavel que eu quero que funcione na view teste.phtml e que nao funciona, pois diz que a variavel $title nao existe
$title = "Teste";
}
}
Agora a classe Controller, como se pode observar, ele recebe o nome e a pasta e chama a respectiva view através do require_once
class Controller{
protected function view($nome,$pasta){
if(empty($pasta))
return require_once(VIEWS . $nome.'.phtml');
else
return require_once(VIEWS . $pasta.'/'.$nome.'.phtml');
}
}
Pronto, é isso ae, a minha duvida, como dita anteriormente, é como fazer com que a variavel inicializada no controlador possa ser usada na View. E podem meter o pau no código, me xingarem o que for, o que eu quero antes de td é sempre aprender.
abraço!
isto nao esta em mvc...preste bem atencao...o papel do controller eh aplicar a logica do negocio, o model as regras do negocio, o view eh mostrar e receber dados, você esta fazendo o papel do view no controller
class[b] Controller[/b]{
protected function [b]view/b{
if(empty($pasta))
return require_once(VIEWS . $nome.'.phtml');
else
return require_once(VIEWS . $pasta.'/'.$nome.'.phtml');
}
}
uma ideia? usa o smarty como view, vai t poupar muito tempo....digamos q 1/3 do seu trabalho, ja que você ainda tera 2/3 pra fazer (controlls, e models)...
Eu não conheco nada de smarty pra falar a verdade, só uma dúvida entao, o view seria chamado onde se nao fosse pelo proprio controlador? O controlador nao é o responsavel pelo intermedio entre Model e View?
se não me engano você consegue isso com a função extract
>
se não me engano você consegue isso com a função extract
extract? não conhecia essa função, irei dar uma lida.
isto nao esta em mvc...preste bem atencao...o papel do controller eh aplicar a logica do negocio, o model as regras do negocio, o view eh mostrar e receber dados, você esta fazendo o papel do view no controller
Sua definição de MVC está um tando equivocada quanto às responsabilidades do Model e do Controller.
O Controller cuida das REQUISIÇÕES feitas pelo usuário, não da lógica do negócio.
O Model cuida das regras e da lógica do negócio.
Leitura
:seta: http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model
Galera, ainda não resolvi, alguem poderia me dar uma luz?
O title deve ser global para a classe .. ou seja, se você setar dentro do método, somente o escopo do método vai poder acessar a variável, pra isso use uma propriedade ..
<?php
class Test {
public $title ;
public function doSomething ( ) {
$this->title = 'hello world !' ;
}
}
Então .. no html você faz
<html>
<head>
<title><?php echo $testController->title ?></title>
</head>
</html>
Lembrando que não é responsabilidade do Controller exibir esse tipo de coisa .. alias, sua view que tinha que ter um método para recuperar o titulo da aplicação ..
>
O title deve ser global para a classe .. ou seja, se você setar dentro do método, somente o escopo do método vai poder acessar a variável, pra isso use uma propriedade ..
<?php
class Test {
public $title ;
public function doSomething ( ) {
$this->title = 'hello world !' ;
}
}
Então .. no html você faz
<html>
<head>
<title><?php echo $testController->title ?></title>
</head>
</html>
Ok.
>
Lembrando que não é responsabilidade do Controller exibir esse tipo de coisa .. alias, sua view que tinha que ter um método para recuperar o titulo da aplicação ..
Eu sei que não é responsabilidade do controlador fazer isso, mas é que eu preciso mudar o titulo e algum lugar teria q fazer essa mudança dinamicamente de acordo com a pagina... A view teria que ter um metodo na classe view, é isso? É bom lembrar que não é somente o titulo, mas tb por exemplo os dados obtidos no banco de dados pra jogar na view, então não é somente o titulo, mas basicamente qualquer informação retirada do BD para a pagina.
Cara, view é pra isso .. tudo que entra no controller como requisição e TEM que ser exibido um resultado , é bom que passe na view.
beleza, deu pra implementar legal... Andrey, tu pode me falar por alto como funciona a função "set_include_path"?? Li sobre ela, mas ainda fiquei sem entender algumas coisas...
Toda vez que você inclui um arquivo, o construtor de linguagem escolhido (require/include), dá uma espiada no include_path, que é uma diretiva do PHP.INI, pra tentar incluir a partir de algum lugar conhecido.
set_include_path() permite incorporar outros diretórios à essa instrução padrão, permitindo que você "diminua" os paths quando for fazer um include/require.
Por exemplo. Se você der um require em MinhaClasse.php, assim, sem nenhum path, o require vai dar uma olhada no diretório do PEAR, por exemplo, que é um dos paths presentes por padrão nessa diretiva.
Obviamente, a menos que esse seu arquivo esteja jogado lá, não vai funcionar. Suponhamos, então, que ele esteja dentro de um diretório Libraries, na raiz da sua aplicação.
Ao fazer:
set_include_path( '.'
. PATH_SEPARATOR . realpath( './Libraries' ) . DIRECTORY_SEPARATOR
. PATH_SEPARATOR . get_include_path() )
No arquivo index.php, ou outro que também esteja na raiz da aplicação, já que nesse caso há um ./ junto de um realpath(), esse diretório Libraries será incluído na diretiva em tempo de execução e o seu require vai funcionar.
Perceba que normalmente set_include_path() vêm acompanhada de get_include_path(), que retorna o valor do include_path atual, para que você apenas complemente a instrução, ao invcés de alterá-la por completo.
Cada novo path a ser incluído na diretiva deve ser separado pela constante PATH_SEPARATOR, por padrão um ponto-e-vírgula, e todos eles numa única string, daí a concatenação entre eles.
Mas cuidado, se você fizer um include_path muito grande. Justamente pelo fato de antes de incluir/requerir aquilo que você solicitou a partir do path que você definiu o construtor da linguagem buscar no include_path, um muito grande fará sua inclusões ficarem mais lentas.
Ok Bruno, mt boa essa explicação deu pra entender bem, só mais uma duvida, eu tenho essa classe abaixo em que eu faço um require dentro dela, funciona td certo, mas é correto fazer esse require DENTRO da classe??
No caso ae ele retorna um require, mas quem chamou a função view, foi uma outra classe.
class Controller{
public $title = 'Ofertandos';
protected function view($nome,$pasta){ return require_once(VIEWS . $pasta.'/'.$nome.'.phtml');
}
}
Classe que chama a view:
class Cadastro extends Controller{
public $teste;
// public function __construct(){
//// parent::setTitle('Cadastro');
//// $this->teste = 'hello sdasd'; public function indexAction(){
parent::setTitle('Cadastro');
$this->teste = 'fdf';
$this->view('cadastro', 'cadastro');
}
public function testeAction(){
...
}
}Eu vejo que, à parte de tudo aquilo que OOP significa, só de trabalhar com as classes, já implica num autoloader por praticidade.
Sendo assim, requie/include só devem ser usados em quatro casos:
>
Sua definição de MVC está um tando equivocada quanto às responsabilidades do Model e do Controller.
Henrique, desculpe, eu tb achava q eu tava equivocado ate ter aulas com um desenvolvedor da petrobras em meu curso na faculdade..
>
Isso, no caso eu estaria chamando um template, a pergunta é, será que chamar, fazer uma requisição(require) de um view (tipo, um formulario de cadastro, cadastro.phtml por exemplo)dentro de uma classe é normal?? Pois eu fico imaginando que tu irá abrir o view, o arquivo dentro da propria classe... O esquem é esse abaixo:
A classe cadastro faz uma requisição da view:
class Cadastro extends Controller{
public $teste;
public function indexAction(){
parent::setTitle('Cadastro');
$this->teste = 'fdf';
//AQUI CHAMA O VIEW
$this->view('cadastro', 'cadastro');
}
public function testeAction(){
...
}
}
È aqui que ele retorna o tal require, só que ele irá fazer esse require dentro da classe Cadastro, não é estranho tu abrir um arquivo dentro da classe não???
class Controller{
public $title = 'Ofertandos';
protected function view($nome,$pasta){ return require_once(VIEWS . $pasta.'/'.$nome.'.phtml');
}
}Não é errado.
Veja, em sistemas ainda mais Orientados a Objetos, a última coisa a ser feita numa Action (método da classe de Controller) é uma chamada à:
$this -> view -> render( 'template.phtml' );
Sendo render() o nome do método que vai incluir, com include, e não requerer, com require, o template a ser mostrado, presente no contexto do objeto atribuído à propriedade $view, por sua vez definida no contexto da classe do Controller (normalmente numa abstrata, pai de todos os Controllers).
O errado nesse fragmento de código, é você ter um método view() DENTRO da classe Controller. Não é responsabilidade dos Controllers, concretos ou o abstrato, fazer algo tão intimamente ligado ao HTML a ser enviado para o usuário.
Assim como, depois de muito estudar sobre o assunto, percebi que também NÃO É responsabilidade da classe correspondente à View de ecoar o HTML incluído. Esta deve apenas informar à classe que manipula a Resposta (Response) aquilo que fará parte do output.
Não que seja assim tãããão errado a View ecoar o HTML, mas é mais correto que a Response o faça.
Infelizmente, quanto à esse último detalhe não tenho ainda muitas informações pra passar. O pouco que sei você pode acompanhar nos meus tópicos na sala de Metodologias de Desenvolvimento.
Ok, o View nesse caso seria uma outra classe?
Isso mesmo.
A propósito, use o botão Responder Azul ou a Resposta Rápida nas próximas respostas, daí você evitar citar (QUOTE) desnecessáriamente as mensagens anteriores. :thumbsup:
Henrique, desculpe, eu tb achava q eu tava equivocado ate ter aulas com um desenvolvedor da petrobras em meu curso na faculdade..
Cara, não sei quem é esse desenvolvedor, mas os gurus da área, como Martin Fowler, Trygve Reenskaug (o "inventor" do MVC), etc, etc, etc definem muito bem o que é cada camada.
Model: tudo que se diz respeito à regras e lógica de negócio.
Controler: trata as requisições do usuário, como um clique em um botão, em uma GUI, uma requisição HTTP em uma aplicação web.
View: aquilo que é visto pelo usuário, botões, páginas html, etc.
Porque a lógica do negócio não deve estar no Controller?
Muito simples. Imagine que você possui uma aplicação desktop e queira transformá-la em uma aplicação web. NADA MUDA NA LÓGICA NEM NAS REGRAS DA APLICAÇÃO.
A princípio, você teria quem mexer apenas com a camada Controller e com a camada View.
Mas o que acontece se você tem lógica do negócio espalhada pelo Controller?
Uma hora você vai alterar alguma coisa que também influencia no Model aí lá vai você também querer mexer no Model e isso vira uma reação em cadeia.
Então se o cara da petrobras, da apple, do google, de onde for falar que Controller trata da lógica da aplicação, ou ele se confundiu, ou não sabe do que está falando...
você ta usando zend?
no controlador
... resto do controlador
//colocaria assim
$this->view->title='seu titulo';
... resto do controlador
e no .phtml assim
... resto do .phtml
//colocaria assim
... resto do controlador...