Codeigniter

CodeIgniter 4: Controller or its method is not found — arrumando a rota

No seu XAMPP a URL abre; você sobe pro Linux e vem Controller or its method is not found: AppControllersProdutos::index. Em nove de cada dez vezes é uma dessas três coisas: o arquivo em app/Controllers/ está com a caixa diferente da classe, o namespace no topo do controller não é AppControllers, ou você contava com o auto-routing, que vem desligado no CodeIgniter 4.

Primeiro, veja o que o framework enxerga

php spark routes
ls -l app/Controllers/

O spark routes lista tudo que está de fato registrado. Se a sua rota não aparece ali, o problema é no Routes.php. Se aparece e mesmo assim dá 404, o problema é o arquivo da classe. O ext4 diferencia maiúscula de minúscula e o NTFS não: produtos.php funciona no seu notebook e some no servidor. O nome do arquivo tem que ser idêntico ao da classe, com a inicial maiúscula.

Se no servidor aparecer só a página 404 genérica em vez da mensagem, é o CI_ENVIRONMENT em production no .env — o texto detalhado do erro só sai em development.

Declare a rota em vez de confiar no auto-routing

<?php
// app/Controllers/Produtos.php

namespace AppControllers;

class Produtos extends BaseController
{
    public function index()
    {
        return view('produtos/lista');
    }

    public function ver($id)
    {
        return view('produtos/detalhe', ['id' => (int) $id]);
    }
}

Com o arquivo e o namespace certos, declare a rota na mão:

// app/Config/Routes.php
$routes->get('produtos', 'Produtos::index');
$routes->get('produtos/(:num)', 'Produtos::ver/$1');

Desde o 4.2 o auto-routing legado vem desligado nos projetos novos, então bater direto em /produtos/ver/7 sem ter declarado a rota devolve exatamente essa mensagem. No 4.4 pra cima a chave fica em app/Config/Routing.php, na propriedade public bool $autoRoute = false;, junto com $defaultNamespace = 'AppControllers';. Nas versões anteriores é $routes->setAutoRoute(false) dentro do próprio Routes.php.

Se ainda persistir, rode php spark cache:clear e confira se o método é público. Método protegido ou privado cai no mesmo erro, porque o roteador não consegue invocá-lo.

Se travou nisso e precisa de ajuda, me chama aqui.

Post Recentes

Criar swapfile no Ubuntu: parar o OOM killer de matar o MySQL

VPS de 2 GB onde o mysqld morre de madrugada e o site volta com erro de conexão. Como confirmar…

9 horas atrás

Grupos nomeados no preg_match: pare de contar índice de $matches

Regex com cinco parênteses e ninguém lembra se a data é $matches[2] ou $matches[3]. Nomeie os grupos e leia o…

23 horas atrás

Token de integração da API do Magento 2: gerar e usar no header Bearer

Erro The consumer isn't authorized to access resources ao chamar a REST do Magento 2.4.8? Ative a integração, libere os…

1 dia atrás

Rate limit no wp-login.php com nginx: barrar força bruta antes do PHP

Bots batendo centenas de POST por minuto no login derrubam a CPU. Configure limit_req_zone no nginx e devolva 429 antes…

2 dias atrás

Anonimizar IP no nginx: mascarar o último octeto do log para a LGPD

Seu access.log guarda o IP inteiro dos visitantes há meses sem necessidade. Mascare o último octeto com map e log_format…

3 dias atrás

Prompt injection em campo de usuário: isole a observação do pedido

A observação do pedido chegou com ordem embutida para gerar cupom. Delimite o texto do cliente e trate a resposta…

3 dias atrás