CodeIgniter: Como obter informações sobre Controller, Action, URL


124

Eu tenho estes URLs:

Como obter o nome do controlador, o nome da ação desses URLs. Sou novato no CodeIgniter. Existe alguma função auxiliar para obter essas informações

Ex:

$params = helper_function( current_url() )

Onde $paramsse torna algo como

array (
  'controller' => 'system/settings', 
  'action' => 'edit', 
  '...'=>'...'
)

Respostas:


217

Você poderia usar a classe URI :

$this->uri->segment(n); // n=1 for controller, n=2 for method, etc

Também me disseram que o seguinte trabalho, mas atualmente não consigo testar:

$this->router->fetch_class();
$this->router->fetch_method();

porque meu controlador tem uma subpasta, então $ this-> uri-> segment (1) retorna o nome do controlador talvez incorreto. Obrigado pela sua ajuda, eu uso $ this-> router para obter as informações.
Noname.cs

2
Para obter o diretório corretamente, você também pode usar: $ this-> router-> fetch_directory ();
jmserra

6
Ei, se você estiver usando o Codeigniter 3, para o Controller use: $ this-> router-> class; para o método: $ this-> router-> method; para Diretório: $ this-> router-> directory; Documentation: codeigniter.com/user_guide/installation/…
cartalot

$ this-> router-> fetch_class (); $ this-> router-> fetch_method (); funciona.
Dinesh Patra

133

Em vez de usar segmentos de URI, você deve fazer o seguinte:

$this->router->fetch_class(); // class = controller
$this->router->fetch_method();

Dessa forma, você sabe que está sempre usando os valores corretos, mesmo que esteja atrás de um URL roteado, de um subdomínio etc.


Acabei de descobrir que, usando esse método, você não pode obter o nome correto do método da classe ao chamar uma visualização como modules::run('module/controller/action'). Apenas mostra as informações do roteador da página carregada. Existe alguma maneira de superar isso?
Starx

Impressionante! Alguma palavra sobre como isso é seguro? Ou seja, isso pode ser falsificado?
HellaMad

Esta deve ser a resposta aceita - ou usando o atalho: $ this-> router-> class
ChristoKiwi

1
Não se você alterar as rotas em routes.php, $this->routerretornará a classe na qual o código é executado, mas não o roteador real mascarado com a substituição. Ambas as respostas são bastante úteis com base no que você deseja fazer.
Tibor Szasz

Esses métodos foram privados, use $this->router->classe, em $this->router->methodvez disso,
Richard

30

Os métodos estão obsoletos.

$this->router->fetch_class();
$this->router->fetch_method();

Você pode acessar as propriedades.

$this->router->class;
$this->router->method;

Consulte o manual do usuário do codeigniter

Métodos de roteamento de URI fetch_directory (), fetch_class (), fetch_method ()

Com propriedades CI_Router::$directory, CI_Router::$classe CI_Router::$methodestar público e seu respectivofetch_*() não fazem mais nada para apenas devolver as propriedades - não faz sentido mantê-las.

Esses são métodos internos e não documentados, mas optamos por substituí-los por enquanto, a fim de manter a compatibilidade com versões anteriores. Se alguns de vocês os utilizaram, agora é possível acessar as propriedades:

$this->router->directory;
$this->router->class;
$this->router->method;


11

Como complemento

$this -> router -> fetch_module(); //Module Name if you are using HMVC Component

Essa fetch_module()chamada não funciona para mim no IC 2.1.2. Não foi possível encontrá-lo no arquivo /system/router.php.
tim Peterson

1
@timpeterson, está disponível apenas no componente HMVC, conforme informado na resposta.
Starx 27/08/13

obrigado, você me salvou
Barbz_YHOOL

7

Atualizar

A resposta foi adicionada em 2015 e os seguintes métodos estão obsoletos agora

$this->router->fetch_class();  in favour of  $this->router->class; 
$this->router->fetch_method(); in favour of  $this->router->method;

Oi, você deve usar a seguinte abordagem

$this->router->fetch_class(); // class = controller
$this->router->fetch_method(); // action

para esse fim, mas para usá-lo, você precisa estender seu gancho CI_Controllere funciona como um encanto, não use segmentos de uri


3

Se você usar $ this-> uri-> segment, se as regras de reescrita de URLs mudarem, a correspondência de nome dos segmentos será perdida.


3

Use este código em qualquer lugar da classe ou das bibliotecas

    $current_url =& get_instance(); //  get a reference to CodeIgniter
    $current_url->router->fetch_class(); // for Class name or controller
    $current_url->router->fetch_method(); // for method name

1

O último segmento do URL sempre será a ação. Por favor, fique assim:

$this->uri->segment('last_segment');

-1
$this->router->fetch_class(); 

// classe fecth a classe no controlador $ this-> router-> fetch_method ();

// método


-4

classe de controlador não está funcionando nenhuma função.

então eu recomendo que você use os seguintes scripts

global $argv;

if(is_array($argv)){
    $action = $argv[1];
    $method = $argv[2];
}else{
    $request_uri = $_SERVER['REQUEST_URI'];
    $pattern = "/.*?\/index\.php\/(.*?)\/(.*?)$/";
    preg_match($pattern, $request_uri, $params);
    $action = $params[1];
    $method = $params[2];
}

Existem funções predefinidas disponíveis como $ this-> router-> fetch_class () e fetch_method (), então não precisamos fazer isso manualmente.
Naveed Ramzan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.