
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.
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.
<?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.
O primeiro POST via AJAX passa e o segundo estoura 403 porque o token foi regenerado. Envie o hash no…
O certbot diz que renovou, o navegador insiste que o certificado expirou. Compare as datas com openssl e crie o…
O campo aparece cinza no painel avisando que o valor vem de arquivo? Descubra o caminho da chave, remova do…
Chamar array_filter sem callback descarta 0, '0' e false junto com os vazios. Veja o callback certo, o ARRAY_FILTER_USE_BOTH e…
O upload do tema ou do vídeo morre com 413 e o php.ini não resolve? Quem corta é o nginx:…
O cliente pediu exclusão pela LGPD mas a nota fiscal precisa ficar guardada. A saída é anonimizar o pedido, não…