Como você usa vários controladores no CodeIgniter?

Eu sou novo no CodeIgniter e acabei de passar por algum guia do usuário para me ajudar a entender como fazer vários controladores.

Eu descobri como carregar várias páginas usando um de seus exemplos. Este é meu controlador padrão, chamado Site.php:

class Site extends CI_Controller { public function index($page = 'home') { if ( ! file_exists(APPPATH.'/views/'.$page.'.php')) { // Whoops, we don't have a page for that! show_404(); } $data['title'] = ucfirst($page); $this->load->view('header', $data); $this->load->view($page, $data); $this->load->view('footer', $data); } } 

Isso funciona bem e bom com as minhas rotas.php:

 $route['default_controller'] = 'site'; $route['(:any)'] = 'site/index/$1'; 

Eu tenho algumas visualizações que carregam corretamente quando eu vou para o localhost/website/index.php/about , por exemplo.


Agora, para saber mais sobre os controladores e o roteamento URI. Eu criei um novo controlador, application/controllers/MyController.php e está codificado como tal:

 class MyController extends CI_Controller { public function index() { $this->load->view('header'); $this->load->view('my_controller'); $this->load->view('footer'); } } 

A coisa é que eu não sei como acessar esta página. Eu entendo que o padrão URI padrão é example.com/class/function/id/ mas tentei localhost/website/mycontroller e isso não funciona. Apache retorna 404. Eu tentei muitas manipulações disso, mesmo indo tão estúpido como digitar localhost/website/index.php/mycontroller mas claro que isso não funciona.

Qual é a maneira correta de usar vários controladores? O que eu fiz de errado aqui? Por favor, ajude-me na minha aprendizagem, obrigado!

(Além disso, esta é a minha primeira pergunta adequada sobre StackOverflow, se eu fiz algo errado ou formatou algo incorretamente, por favor me avise!)

O problema é que esta regra:

 $route['(:any)'] = 'site/index/$1'; 

intercepta tudo … e passa para o controlador do Site , como um argumento para o método do index . Então, se você ligar:

 /mycontroller 

ele será realmente mapeado para:

 /site/index/mycontroller 

O roteamento acontece antes que o aplicativo olhe mesmo para os controladores e as regras de roteamento são consideradas para que estejam escritas.

Assim, você precisa colocar esta regra na parte inferior da sua lista de regras para permitir que as outras regras funcionem. Então, adicionando isso na frente:

 $route['mycontroller'] = 'mycontroller'; $route['(:any)'] = 'site/index/$1'; 

ele deve funcionar bem (embora uma abordagem discreta, mas também é a sua global any regra), pois primeiro verificará se o URL solicitado foi /mycontroller e, em caso afirmativo, ele chamará myController ; Caso contrário, ele se comportará como costumava com o seu controlador de Site .

Você está roteando tudo para seu controlador de site com a regra de roteamento:

$route['(:any)'] = 'site/index/$1';

Com essa regra de roteamento, você nunca alcançará outros controladores como, por exemplo, o Mycontroller.

O problema é o seu método de chamada No seu caso se você não tiver mod_rewrite, você deve tentar

 localhost/website/index.php/mycontroller 

se você puder ativar o mod_rewrite, você pode adicionar no seu .htaccess as seguintes linhas:

 RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 

Depois disso, você pode ligar para o seu controlador como você tentou antes