Como chamar um controller a partir de outro controller?? [CodeIgniter]

  • Autor Autor padawanluke
  • Data de início Data de início
Este tópico foi traduzido automaticamente do espanhol. Ver original
P

padawanluke

Beta
Usuário com poucas negociações! Use sempre o saldo do ForoBeta!
Estou aprendendo CodeIgniter e o paradigma MVC, mas estou com problemas para a navegação entre páginas.

Antes, quando programava em PHP puro, se eu quisesse redirecionar para outra página, fazia simplesmente:

PHP:
header('Location: destino.php');

Se quisesse passar algum parâmetro além disso:

PHP:
header('Location: destino.php?id=1');

No modelo MVC, o Controller é quem carrega o model e a view (pode não carregar um model se o controller não interagir com o banco de dados), mas obrigatoriamente existe um controller principal e uma view.
Do tipo

-controller: nome.php
-view: nome_view.php

Onde nome.php carrega nome_view.php.

Bem, suponhamos que o controller nome.php seja de acesso restrito mediante usuário e senha, então, no momento de carregar o controller, verifico se existe a session que indica que o usuário está logado; se estiver logado, deixo executar o restante do controller, caso contrário, tenho que redirecionar para o controller de login.

Eu até agora estava usando redirect(); do helper URL, mas não me serve porque ele apenas cria um link, não carrega um controller como deveria ser.

Não sei como fazer, alguém pode me dar uma mão?.

obrigado.
 
Foi útil? Participe da conversa

Com sua conta grátis você pode responder, mandar mensagem privada ao autor e comprar com Saldo retido: o pagamento é liberado quando você recebe o combinado.

Leva 30 segundos · você volta a este tópico ao terminar
Me parece que você está fazendo algo errado ou interpretando algo errado.

Fazer o redirect está perfeito, agora não entendo ao que você se refere com "não carregar o controller".
Ao fazer o redirect, é como se essa página fosse visitada e o framework vai carregar o controller que corresponde a essa requisição.

Se você faz o redirect para endereco/controller, ele vai executar (além do init do controller, se existir) o index action. Por outro lado, se você faz o redirect para endereco/controller/action, ele vai executar (novamente o init, se existir), mas agora, em vez do index action, vai executar o action para o qual você enviou o request.
 
Acho que estou me confundindo, ou o erro é outro.

Mas então, para navegar de controller para controller, faz-se simplesmente com um redirect() né? Que é uma função do helper URL, certo? Você me confirma? Desculpe a pergunta, talvez seja bem básica, mas estou começando com este framework.
 
Sim, você usa o redirect.

Vamos falar claro, em MVC (este framework incluído) você não pode, a partir de um controller, chamar diretamente um action de outro controller.
Com "chamar diretamente", refiro-me a que você não pode invocar um action de outro controller como se fosse uma função de uma classe qualquer.

O que você pode fazer é redirecionar o usuário para outra parte conforme achar conveniente; quando você usa o redirect, o controller e o action para os quais você o enviou serão chamados e isso será executado. Algo óbvio que talvez eu não esteja esclarecendo é que, quando você faz um redirect, todo o código que está depois do redirect é descartado, passando a ser executado o novo controller.

Agora, você está usando o redirect para enviar usuários não logados para a página de login, certo?

Esse redirect deveria ser feito pela função genérica que controla o login dos usuários e que você tem no base controller, como eu comentava no outro post.

Por exemplo, no base controller você poderia ter uma função da seguinte forma:

Inserir CODE, HTML ou PHP:
protected function isLoguedIn() {
    checkeas si esta logueado
    if (logueado) {
        return true;
    } else {
        redirect_to(login);
    }
}

depois, em qualquer um dos seus controllers (que têm que estender do base controller), você faz algo como:

Inserir CODE, HTML ou PHP:
if (isLoguedIn()) {
    haces lo que tengas que hacer;
}

Não estava com vontade de ver as funções exatas do CI, então fiz com uma espécie de pseudocódigo 😛
 
Sim, você usa o redirect.

Vamos falar claro, em MVC (este framework incluído) você não pode, a partir de um controller, chamar diretamente um action de outro controller.
Com "chamar diretamente", refiro-me a que você não pode invocar um action de outro controller como se fosse uma função de uma classe qualquer.

O que você pode fazer é redirecionar o usuário para outra parte conforme achar conveniente; quando você usa o redirect, o controller e o action para os quais você o enviou serão chamados e isso será executado. Algo óbvio que talvez eu não esteja esclarecendo é que, quando você faz um redirect, todo o código que está depois do redirect é descartado, passando a ser executado o novo controller.

Agora, você está usando o redirect para enviar usuários não logados para a página de login, certo?

Esse redirect deveria ser feito pela função genérica que controla o login dos usuários e que você tem no base controller, como eu comentava no outro post.

Por exemplo, no base controller você poderia ter uma função da seguinte forma:

Inserir CODE, HTML ou PHP:
protected function isLoguedIn() {
    checkeas si esta logueado
    if (logueado) {
        return true;
    } else {
        redirect_to(login);
    }
}

depois, em qualquer um dos seus controllers (que têm que estender do base controller), você faz algo como:

Inserir CODE, HTML ou PHP:
if (isLoguedIn()) {
    haces lo que tengas que hacer;
}

Não estava com vontade de ver as funções exatas do CI, então fiz com uma espécie de pseudocódigo 😛

Ok, entendi perfeitamente, menos a parte do base controller que tenho que ver em detalhes. Mas já entendi, obrigado.
 
Não há de quê.

Sobre o base controller, é criar uma classe pai de todos os seus controllers onde você coloca código comum e que seja útil em todos os seus controllers.

Talvez você tenha que ler um pouco sobre programação orientada a objetos.
 
Não, não entendo o que você quer dizer sobre um base controller, ou seja, teoricamente eu entendo, tenho que ver como implementá-lo.

---------- Post adicionado em 13-ago-2013 hora: 03:58 ----------

O que você me propõe é fazer uma classe abstrata ou tipo interface, né? Abraços.


Não há de quê.

Sobre o base controller, é criar uma classe pai de todos os seus controllers onde você coloca código comum e que seja útil em todos os seus controllers.

Talvez você tenha que ler um pouco sobre programação orientada a objetos.
 
Para que uma classe estenda de outra, não é necessário que a classe pai seja abstrata.
Interface não tem nenhum sentido, em uma interface você não pode implementar métodos. A ideia de um controller pai de todos os seus controllers é que, nele, você tenha funcionalidade comum para todos os seus controllers.

No outro post, coloquei um link onde se dá um exemplo disso mesmo:

Favrik: A base controller for CodeIgniter
 
Voltar
Topo