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

Tentando imitar o Laravel no PHP


Frank K Hosaka

Pergunta

O que eu mais gostei no Laravel foi o Eloquent (ele usa a sintaxe tbdiario::where('lcto',12)->get( )) e o roteador.

O problema do roteador web.php é que você precisa criar uma nova rota para cada novo comando. O roteador que inventei não trabalha com um monte de rota, mas trabalha com a sintaxe classeMetodo, assim:
 

arquivo .htaccess
RewriteEngine On

# Redirecionar tudo para index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]


arquivo bd.php
<?php
class BD {
    public static $pdo;
    private static $initialized = false;

    public static function initialize() {
        if (!self::$initialized) {
            $host = 'localhost';
            $dbname = 'diario';
            $username = 'root';
            $password = '';

            $dsn = 'mysql:host=' . $host . ';dbname=' . $dbname;
            self::$pdo = new PDO($dsn, $username, $password);
            self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            self::$initialized = true;
        }
    }
}
?>

arquivo diario.php
<?php
class Diario extends BD {

    public static function getValor($lcto) {
        self::initialize(); // Certificando que a inicialização está sendo feita
        $sql = 'SELECT valor FROM tbdiario WHERE lcto = :lcto';
        $stmt = self::$pdo->prepare($sql);
        $stmt->bindParam(':lcto', $lcto);
        $stmt->execute();

        return $stmt->fetchColumn();
    }

    public static function inicio() {
        self::initialize(); // Certificando que a inicialização está sendo feita
        echo "olá mundo<br>";
        echo self::getValor(12);
    }
}
?>

arquivo index.php
<?php
spl_autoload_register(fn ($class) => 
require str_replace('\\', DIRECTORY_SEPARATOR, strtolower($class)) . '.php');

$requestUri = $_SERVER['REQUEST_URI'];
$basePath = '/astudy/';
$path = substr($requestUri, strlen($basePath));
if($path=="") {
    header('location:teste.php');
    exit;
}
if (preg_match('/^([a-z]+)([A-Z].*)$/', $path, $matches)) {
    $classe = $matches[1];
    $metodo = $matches[2];
}
$classe::$metodo();

arquivo teste.php
<a href=diarioInicio>teste</a>

 

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

Fiz alguns testes, e tive que mudar algumas coisas:

arquivo .htaccess
RewriteEngine On

# Redirecionar tudo para index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]

arquivo appView.php
<!DOCTYPE html>
<html lang="en">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, 
    maximum-scale=1.0, user-scalable=no">
</script>
<script src="https://cdn.tailwindcss.com"></script>
<style>
  @media (min-width: 768px) { .geral {width: 700px; margin: auto; font-size: 16px; background-color: #f7fafc} }
  @media (max-width: 767px) { body {width: 630px; margin: auto; font-size: 16px; background-color: #f7fafc}  }
  @media (min-width: 768px) and (max-width:1024px) { body {width:700px;margin: auto; font-size: 16px; background-color: #f7fafc}}
  input[type="date"]::-webkit-calendar-picker-indicator {display: none}
  summary { list-style:none }
</style>
<title>Projeto Classe</title>
<body class=geral>

arquivo config.php
<?php
session_start();
error_reporting(E_ALL);
ini_set('display_errors', 1);
date_default_timezone_set('America/Sao_Paulo');

$baseDir = $_SERVER['SERVER_NAME'] === 'frank.com' ? 
    $_SERVER['DOCUMENT_ROOT'] : $_SERVER['DOCUMENT_ROOT'].'/Frank/';

defined('HOST') || define('HOST', 'localhost');
defined('DBNAME') || define('DBNAME', $baseDir === $_SERVER['DOCUMENT_ROOT'] ? 'Diario' : 'diario');
defined('USER') || define('USER', $baseDir === $_SERVER['DOCUMENT_ROOT'] ? 'Root' : 'root');
defined('PASSWORD') || define('PASSWORD', $baseDir === $_SERVER['DOCUMENT_ROOT'] ? '14061406' : '');
defined('lctoBaixaEstoque') || define('lctoBaixaEstoque',14421);
defined('lctoAcertoMais') || define('lctoAcertoMais',14742);
defined('lctoAcertoMenos') || define('lctoAcertoMenos',14743);
defined('diaAcerto') || define('diaAcerto','2025-01-31');

spl_autoload_register(fn ($class) => 
    require str_replace('\\', DIRECTORY_SEPARATOR, strtolower($class)) . '.php');

function view($arquivo, $array = null){
    if (!is_null($array)){
        foreach ($array as $var => $value){
            ${$var} = $value;
        }
    }
    ob_start();
    include $arquivo . ".php";
    ob_flush();
}

class bd {
    private static $pdo;
    private static $initialized = false;

    public static function initialize() {
        if (!self::$initialized) {
            $dsn = 'mysql:host=' . HOST . ';dbname=' . DBNAME;
            self::$pdo = new PDO($dsn, USER, PASSWORD);
            self::$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            self::$initialized = true;
        }
    }

    protected static function getPdo() {
        self::initialize();
        return self::$pdo;
    }

    protected static function getTableName() {
        return ''; // Será implementado na classe filha
    }

    public static function select($columns = '*', $conditions = []) {
        self::initialize();
        $table = static::getTableName();

        // Construindo a cláusula SELECT
        if (is_array($columns)) {
            $columns = implode(', ', $columns);
        }

        // Construindo a cláusula WHERE, se houver condições
        $whereClause = '';
        if (!empty($conditions)) {
            foreach ($conditions as $field => $value) {
                $whereClause .= "$field = :$field AND ";
            }
            $whereClause = 'WHERE ' . rtrim($whereClause, ' AND ');
        }

        $sql = "SELECT $columns FROM $table $whereClause";
        $stmt = self::getPdo()->prepare($sql);

        // Vinculando os valores para a cláusula WHERE
        if (!empty($conditions)) {
            foreach ($conditions as $field => $value) {
                $stmt->bindValue(":$field", $value);
            }
        }

        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_OBJ);
    }

    public static function update($conditions, $data) {
        self::initialize();
        $table = static::getTableName();

        // Construindo a cláusula SET
        $setClause = '';
        foreach ($data as $field => $value) {
            $setClause .= "$field = :$field, ";
        }
        $setClause = rtrim($setClause, ', ');

        // Construindo a cláusula WHERE
        $whereClause = '';
        foreach ($conditions as $field => $value) {
            $whereClause .= "$field = :where_$field AND ";
        }
        $whereClause = rtrim($whereClause, ' AND ');

        $sql = "UPDATE $table SET $setClause WHERE $whereClause";
        $stmt = self::getPdo()->prepare($sql);

        // Vinculando os valores para a cláusula SET
        foreach ($data as $field => $value) {
            $stmt->bindValue(":$field", $value);
        }

        // Vinculando os valores para a cláusula WHERE
        foreach ($conditions as $field => $value) {
            $stmt->bindValue(":where_$field", $value);
        }

        $stmt->execute();
    }

    public static function where($field, $operator, $value) {
        self::initialize();
        $table = static::getTableName();
        $sql = "SELECT * FROM $table WHERE $field $operator :value";
        $stmt = self::getPdo()->prepare($sql);
        $stmt->bindParam(':value', $value);
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_OBJ);
    }
}

class tbusuarios extends bd {
    protected static function getTableName() {
        return 'tbusuarios';
    }
}
?>

arquivo index.php
<?php
require('config.php');
$requestUri = $_SERVER['REQUEST_URI'];
$basePath = '/astudy/';
$path = substr($requestUri, strlen($basePath));
$path = $path ? $path : "loginLogin";
if (preg_match('/^([a-z]+)([A-Z].*)$/', $path, $matches)) {
    $classe = $matches[1];
    $metodo = $matches[2];
}
$classe::$metodo();

arquivo login.php
<?php
class Login { 

    public static function alterarSenha() {
        $mensagem="";
      	$id=$_SESSION['id'];
      	$email=tbusuarios::select('email',['id'=>$id])[0]->email;
        return view('loginAlterarSenha',['mensagem'=>$mensagem,'email'=>$email]);
    }

    public static function login() {
        $mensagem="";
        $email="";
        return view('loginView',['mensagem'=>$mensagem,'email'=>$email]);
    }

    public static function menu() {
        $email=$_POST['email'];
        $senha=$_POST['password'];
        $usuario=tbusuarios::where('email','=',$email);
        if(!$usuario) {
            $_SESSION['mensagem']="Dados inválidos!";
            return view('loginView');
        }
        $confirmar=$usuario[0]->senha;
        $validaSenha=password_verify($senha,$confirmar);
        if(!$validaSenha) 
        {
            $_SESSION['mensagem']="Dados inválidos!";
            return view('loginView');
        }
        unset($_SESSION['mensagem']);
        $_SESSION['id']=$usuario[0]->id;
        $_SESSION['nome']=$usuario[0]->nome;
        return view('menuView');
    }

    public static function sair()
    {
        session_destroy();
        view('loginView',['mensagem'=>""]);
    }

    public static function senhaAlterada()
    {
		$senhaAlterada=$_POST['senhaAlterada'];
        $hash=password_hash($senhaAlterada,PASSWORD_BCRYPT,['cost'=>12]);
        $id=$_SESSION['id'];
        tbusuarios::update(['id'=>$id],['senha'=>$hash]);
        return self::login();
    }
    
}

arquivo loginView.php
<?php require('appView.php'); ?>
<script>document.title="Login"</script>
<div class="mt-[150px] flex justify-center items-center">
    <div>
        <div class="text-2xl">Projeto Classe</div>
        <div class="w-[630px] sm:max-w-md mt-6 px-6 py-4 bg-white shadow-md 
            overflow-hidden sm:rounded-lg">
        <!-- Session Status -->
            <form method="POST" action="loginMenu">
                <div>
                    <label class="block font-medium text-sm text-gray-700" for="email">
                        Email
                    </label>
                    <input  class="w-full px-2 py-2 border rounded-md shadow-sm  mt-2 focus:outline-blue-700"
                        id="email" type="email" name="email" required="required" 
                        autofocus autocomplete="username">
                </div>
                <!-- Password -->
                <div class="mt-4">
                    <label class="block font-medium text-sm text-gray-700" for="password">
                        Senha
                    </label>
                    <input  class="px-2 py-2 border rounded-md shadow-sm block mt-1 w-full
                        focus:outline-blue-700" 
                        id="password" type="password" name="password" required="required" 
                        autocomplete="current-password">
                </div>
                <button type="submit" class="px-2 mt-4 rounded-lg text-gray-500 font-semibold hover:bg-gray-200">
                    Entrar
                </button>
            </form>
        </div>
    </div>
</div>

arquivo menuView.php
<?php 
include('appView.php');
if (!isset($_SESSION['id']) || !isset($_SESSION['nome'])) {
    header('Location: loginLogin');
    exit(); 
}
?>
<script>
window.onload = function() {
    btDiv.addEventListener('click', function() {
        dropdownMenu.classList.toggle('hidden');
    });

    btLogin.addEventListener('click', function() {
        menuLogin.classList.toggle('hidden');
    });

    document.addEventListener('click', function(event) {
        if (!btDiv.contains(event.target) && !btDiv.contains(event.target)) {
            dropdownMenu.classList.add('hidden'); 
        }
        if (!btLogin.contains(event.target) && !btLogin.contains(event.target)) {
            menuLogin.classList.add('hidden'); 
        }
    });
}
</script>
<header id="cabecalho" class="bg-white shadow-sm flex p-1 items-center justify-between mb-2">
    <div class="flex items-center flex-grow">
        <div class="w-[170px] font-semibold">Classe</div>
        <div class="flex-grow flex justify-center">
            <button type="button" id="btDiv" class="inline-flex justify-center w-full px-4 py-1 hover:bg-gray-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 font-semibold rounded text-gray-500">
                <div id="btMenu">Menu</div>
                <svg class="-mr-1 ml-2 h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
                    <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a 1 1 0 111.414 1.414l-4 4a 1 1 0 01-1.414 0l-4-4a 1 1 0 010-1.414z" clip-rule="evenodd" />
                </svg>
            </button>
            <div id="dropdownMenu" class="hidden origin-top-left absolute left-0 mt-2 w-auto rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5">
                <?php if ($_SESSION['id'] == 1): ?>
                <div class="py-1" role="menu" aria-orientation="vertical" aria-labelledby="btMenu">
                    <a class="block text-gray-500 font-semibold px-4 py-2 hover:bg-gray-200" href="diarioInicio">Diário</a>
                    <a class="block text-gray-500 font-semibold px-4 py-2 hover:bg-gray-200" href="balanceteInicio">Balancete</a>
                    <a class="block text-gray-500 font-semibold px-4 py-2 hover:bg-gray-200" href="pagarInicio">Pagar</a>
                    <a class="block text-gray-500 font-semibold px-4 py-2 hover:bg-gray-200" href="outrosInicio">Outros</a>
                <?php endif; ?>
                <a class="block text-gray-500 font-semibold px-4 py-2 hover:bg-gray-200" href="orcamentoMenu">Orçamento</a>
                <a class="block text-gray-500 font-semibold px-4 py-2 hover:bg-gray-200" href="pessoaInicio">Pessoa</a>
                <a class="block text-gray-500 font-semibold px-4 py-2 hover:bg-gray-200" href="produtoInicio">Produto</a>
                <a class="block text-gray-500 font-semibold px-4 py-2 hover:bg-gray-200 whitespace-nowrap" href="vendaInicio">Relatório de Venda</a>
                <a class="block text-gray-500 font-semibold px-4 py-2 hover:bg-gray-200" href="nfVerxml">Ver XML</a>    
            </div>
        </div>
    </div>
    <div class="flex items-center">
        <div class="relative">
            <button type="button" id="btLogin" class="inline-flex justify-center w-full px-4 py-1 hover:bg-gray-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 font-semibold rounded text-gray-500">
                <div id="teste"><?=$_SESSION['nome']?></div>
                <svg class="-mr-1 ml-2 h-5 w-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
                    <path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a 1 1 0 111.414 1.414l-4 4a 1 1 0 01-1.414 0l-4-4a 1 1 0 010-1.414z" clip-rule="evenodd" />
                </svg>
            </button>
            <div id="menuLogin" class="hidden origin-top-right absolute right-0 mt-2 w-auto rounded-md shadow-lg bg-white ring-1 ring-black ring-opacity-5">
                <a class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-200" href="loginSair">Sair</a>
                <a class="block px-4 py-2 text-sm text-gray-700 hover:bg-gray-200" href="loginAlterSenha">Mudar Senha</a>
            </div>
        </div>
    </div>
</header>

 

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,4k
    • Posts
      652,2k
×
×
  • Criar Novo...