Ir para conteúdo
Fórum Script Brasil
  • 0

Classe: o método get não funciona?


Frank K Hosaka

Pergunta

arquivo index.php
<?php
class Teste
{
    public function teste()
    {
        echo "olá mundo";
    }
    
    public function nada(){}
}
$rota='Teste_nada';
if($_GET)
{
    if(strpos(key($_GET),"_")==0)
    {
        exit;
    }
    $rota=isset($_GET) ? key($_GET) : $rota;
}
$segmentos=explode('_',$rota);
$nomeControle=$segmentos[0] ?? 'Teste';
$metodo=$segmentos[1] ?? 'nada';
$parametro=$segmentos[2] ?? null;
$controle=new $nomeControle();
$controle->$metodo($parametro);
?>
<form action=?Teste.teste><input type=submit></form>

O formulário acima não funciona, eu só consegui fazer funcionar, quando alterei o formulário:

<form method=post action=?Teste.teste><input type=submit></form>

 

Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0
9 horas atrás, Frank K Hosaka disse:
action=?Teste.teste

o sr. está passando Teste.teste
 

 

9 horas atrás, Frank K Hosaka disse:
$segmentos=explode('_',$rota);

Mas tenta explodir um underline

Não deveria usar o mesmo caractere?

Editado por lowys
Link para o comentário
Compartilhar em outros sites

  • 0

Você tem razão, o correto é usar "_" no action do <form> para ser mais consistente com o código do roteador, mas eu queria usar o "." para definir o parâmetro como "classe.metodo.argumento".

O HTML é um papel em branco, ele permite usar o ".", logo eu usei o "."

O chato é o $_GET que transforma o ponto em underline.

A melhor solução é escrever assim: <form action="?classe_metodo_argumento"> para dar consistência ao código do roteador, mas eu preferi usar o estilo <form action="?classe.metodo.argumento"> para mostrar ao mundo que o HTML e o PHP não respeitam a lei do Wyswyg What You See What You Get

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

  • 0

Entendi.
O sr. pretende criar rotas automáticas.
Não sei se é uma boa idéia.
Peguemos por exemplo o Laravel(o mais renomado framework da comunidade)
Seu router associa um endpoint qualquer a um controller, method, param
É um exemplo que gosto bastante.
Já tentou seguí-lo?

você define um endpoint qualquer:
.../produtos/xpto-16/edit

e associa a uma rota +- assim:

Router::get('/produtos/{id}/edit', ['controller', 'method']);
// Ou
Router::get('/produtos/{id}/edit', 'Controller@method');
// Veja essa:
Router::get('/produtos/{id}', ['Produtos', 'show'])

Dessa forma não fica exposto que seu sistema usa roteamento automático.
Talvez seja até mais seguro.

Peça a sua A.I. preferida para te ajudar a construir um router like a laravel router

Link para o comentário
Compartilhar em outros sites

  • 0

De acordo com a Gemini, existem roteadores para o PHP que simulam mais ou menos a funcionalidade do roteador do Laravel que são instalados através do Composer. Eu testei isso, mas eu não consegui chegar no conceito de classe. Para quem está começando a estudar a classe como é o meu caso, o melhor caminho é pegar um autoload e um roteador o mais simples possível:

arquivo index.php
<?php
spl_autoload_register(fn ($class)
     => require str_replace('\\', DIRECTORY_SEPARATOR, $class) . '.php'); // requer php 8.2
$rota='Login_login';
if($_GET)
{
    if(strpos(key($_GET),"_")==0)
    {
        exit;
    }
    $rota=isset($_GET) ? key($_GET) : $rota;
}
$segmentos=explode('_',$rota);
$nomeClasse=$segmentos[0] ?? 'Login';
$metodo=$segmentos[1] ?? 'login';
$parametro=$segmentos[2] ?? null;
$classe=new $nomeClasse();
$classe->$metodo($parametro);

Apesar de ter poucas linhas, só agora é que eu começo a entender o que é classe. O código é bem abstrato, mas já dá para ver como associar um <form> do html com as classes do PHP. Para quem está começando a estudar as classes, ele precisa entender como as classes são chamadas. O programador pode chamar a classe dentro do código através do comando (new Classe) graças ao autoload ou dentro do <form method=post action="?classe.metodo.argumento"> graças ao roteador.

O ponto de interrogação definido no action vai garantir que o fluxo do programa passe pelo arquivo index.php. 

Já o Laravel é bem obscuro, não dá para ver como <form action="teste"> chega no router::get('teste',[testeController::class,'teste').

Outro problema bem obscuro é a tal da vulnerabilidade, todo mundo recomenda migrar para o Laravel porque ele tem um colete a prova de bala. Certamente o meu código não tem colete a prova de bala, mas eu sou incapaz de enxergar a possibilidade de ser baleado ou ter a carteira de dados roubado.

O máximo que eu consegui fazer foi isso:

arquivo index.php
<?php
session_start();
if(!isset($_SESSION['nome'])
{
	header("location:?Login_login");
} else {
	header("location:?Menu_inicio");
}

Ou seja, o bandido precisa estar logado para poder ver alguma coisa, isso na minha cabeça. Isso não é um colete a prova de bala, mas como vou medir a vulnerabilidade dele? Usar o composer para instalar o Laravel não ajuda muito, pois eu sou incapaz de enxergar o colete a prova de bala, se bem que a pasta Vendor do Laravel assusta qualquer bandido, e principalmente o programador de PHP que quer usar as classes como estilo de codificação.

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...