jenyus/class-base-php

该包提供了一个基类,用于动态处理一些模型查询。此外,还带来了 MVC 项目的基础结构。

dev-main 2024-09-06 17:26 UTC

This package is auto-updated.

Last update: 2024-09-06 17:26:27 UTC


README

此包提供了一个用于使用 PHP 和 PDO 在数据库上执行动态查询的基类。

安装

您可以通过 Composer 安装此包。

  1. 在项目根目录创建 'composer.json' 文件
   // Puedes dejarlo en blanco
}```


1. Instalar composer en su proyecto
``` composer install ```

2. Permitir la compatibilidad con el paquete agregando la siguiente linea en el archivo composer.json 
   
      ``` "minimum-stability": "dev" ```

3. Ejecuta el siguiente comando en tu terminal:
   
    ```composer require jenyus/class-base-php```

## Uso básico

Para comenzar a utilizar la clase `DynamicModel` proporcionada por este paquete, sigue estos pasos:

### 1. Configuración de la conexión a la base de datos

Asegúrate de tener una instancia de PDO configurada correctamente para tu base de datos. Aquí tienes un ejemplo básico de cómo configurar la conexión usando el patron de diseño singleton:

```php
namespace DataBase\Config;

class DB{
    private $schema;
    private $host;
    private $password;
    private $user;
    private static $instance = null;
    private $pdo;

    private function __construct()
    {
        $this->schema = 'nombre_de_la_bd';
        $this->host = 'localhost';
        $this->password = 'password';
        $this->user = 'user';

        try {
            $this->pdo = new \PDO("mysql:host=$this->host;dbname=$this->schema", $this->user, $this->password);
            $this->pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
        } catch (\PDOException $e) {
            throw new \Exception("No se pudo conectar a la base de datos: " . $e->getMessage());
        }
    }

    public static function getConnection()
    {
        if (!self::$instance) {
            self::$instance = new DB();
        }
        return self::$instance->pdo;
    }
}

2. 从包类(DynamicModel)扩展

namespace App\Model;

use DataBase\Config\DB;
use Jenyus\Base\DynamicModel;

class User extends DynamicModel
{

    protected $table = 'users';
    public function __construct()
    {
        $this->connection = DB::getConnection();
         // Llama al constructor del padre (DynamicModel) pasando la conexion a tu base de datos
        parent::__construct($this->connection);  
    }
}

执行查询

使用 DynamicModel 提供的方法在数据库上执行查询。以下是一些示例

// Crear una instancia del modelo
  $userModel = new User();

// Obtener todos los usuarios
$users = $userModel->all();
 
// Obtener un usuario por ID
$user = $userModel->find(1);

DynamicModel 中可用的方法和用法示例

- SetTable($table)

设置要操作的表。

- query($sql)

执行自定义 SQL 查询。

- all($columns = ['*'])

执行查询以获取所有记录,并可选地接收一个数组,其中包含所需的列。

$users = $userModel->all(
   ['id', 'nombre', 'email']
);

- where($column, $value, $operator, $columns = ['*'])

执行带有 WHERE 子句的查询。

$users = $userModel->where('estado', 'activo')->get();

$users = $userModel->where('estado', 'activo', '!=',
   ['user_name', 'role']
)->get();

//Tambien puedes resumir las consultas con varios where
$users = $userModel->where('estado', 'activo'
)->where('role_id' , 2)
->orWhere('role_id' , 1)
->get();

- find($value, $columns = ['*'], $operator = '=', $column = 'id')

执行查询以通过 ID 或其他列查找记录。

$user = $userModel->find(2)->first(); //Este es el uso mas simple, si se desea realizar otros metodos de busqueda se recomienda usar el metodo where ( aunque este metodo tambien permite algunos)

- insert($columns = [])

在数据库上执行插入查询。接收一个关联数组作为参数,包含要插入的列和值。

$id = $userModel->insert([
               'nombre' => 'Manuel', 
               'email' => 'Suarez', 
               'role' => 1
           ]);

- update($columns = [], $value, $operator = '=', $column = 'id')

在数据库上执行更新查询。

$id = $userModel->update([
               'nombre' => 'Manuel', 
               'email' => 'Anaya', 
               'role' => 2
           ], 44);

- delete($value, $operator = '=', $column = 'id')

在数据库上执行删除查询。

$bolean = $userModel->delete(44);

- login($columns = [])

用于加密密码的登录方法

   $response = $user->login([
       'email' => 'example.admin@gmail.com',
       'password' => 'admin'
   ]);

- generate($abilities, $name = 'auth_token', $columns, $table) 和 revokarTokens($columns = [])

无效化会话令牌

   $token = $user->login([])
       ->generateToken(['admin', 'user'], 'mi_token');

   $boolean = $user->revokarToken($token);
   $boolean = $user->revokarTokens($token);

异常处理

DynamicModel 的方法可以抛出多种异常,对于保证您的应用程序能够适当地响应不同类型的错误非常重要。以下是一些常见的异常及其处理方法

常见异常

  • InvalidArgumentException:当提供给方法的方法参数无效时抛出。
  • PDOException:当发生与数据库相关的错误时抛出。
  • Exception:当发生内部非特定错误时抛出。

异常处理示例

try {
    $userModel = new User();
    $users = $userModel->all();
} catch (InvalidArgumentException $e) {
    echo "Argumento inválido: " . $e->getMessage();
} catch (PDOException $e) {
    echo "Error en la base de datos: " . $e->getMessage();
} catch (Exception $e) {
    echo "Error interno: " . $e->getMessage();
}

注意

created_at 列

  • 您的数据库表需要有一个名为 created_at 的列。DynamicModel 类自动处理,在创建记录时记录当前日期。
  • 如果您没有使用此列,可以在插入方法中传递 'false' 作为第二个参数。
user->insert([] , false);

更简单的使用方法

  • 在从 DynamicModel 类扩展您的模型类之后,您可以使用相同的实例进行不同的查询。
namespace App\Model;

use DataBase\Config\DB;
use Jenyus\Base\DynamicModel;

class Model extends DynamicModel
{
   public function __construct($table)
   {
       $this->connection = DB::getConnection();
        // Llama al constructor del padre (DynamicModel) pasando la conexion a tu base de datos
       parent::__construct($this->connection);
       parent::setTable($this->table);  
   }
}


$model = new Model('users')
$users = $model->all();

// Y luego podrias cambiar facilmente la tabla
$model->SetTable('students');
$students = $model->all();

where 方法

  • 在调用 orWhere 方法之前,您必须先调用 where 方法。
  • 如果您想选择查询中要返回的列,建议在第一个 where 调用中这样做。
$users = $userModel->where('estado', 'activo'
)->where('role_id' , 2, ['id', 'user_name'])
->orWhere('role_id' , 1)
->get();

认证

login() 方法使用加密密码验证(bcrypt 哈希),要使用它,您必须。

  • create() 方法:在密码字段中传递已加密的值,使用 PHP 提供的相同加密方法
password_hash($password, PASSWORD_BCRYPT);

更新

https://github.com/Jimmy2004S/jenyus-class-base-php/blob/main/变更日志.md