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', 
  '...'=>'...'
)
noname.cs
fonte

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();
Sampson
fonte
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.

Phil Sturgeon
fonte
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;
lumos0815
fonte
12

Outra maneira

$this->router->class
Luis Chanferoni
fonte
11

Como complemento

$this -> router -> fetch_module(); //Module Name if you are using HMVC Component
Starx
fonte
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

Muhammad Omer Aslam
fonte
3

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

monsterm
fonte
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
Aslam Patel
fonte
1

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

$this->uri->segment('last_segment');
PrakashG
fonte
-1
$this->router->fetch_class(); 

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

// método

Fel
fonte
-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];
}
Jun Takeshita
fonte
Existem funções predefinidas disponíveis como $ this-> router-> fetch_class () e fetch_method (), então não precisamos fazer isso manualmente.
Naveed Ramzan