laton/framework

一个Web框架

安装: 10

依赖: 0

建议: 0

安全: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:项目

1.2 2021-05-06 21:49 UTC

This package is not auto-updated.

Last update: 2024-09-20 14:40:30 UTC


README

需要PHP 8

下载

git clone https://github.com/mbrianp05/Laton.git 然后进入项目文件夹,并执行 composer install 或也使用 composer create-project laton/framework <项目名>,两者效果相同。

使用方法

打开xampp的控制台或其他可以访问php命令的地方,在项目文件夹中执行 php --server localhost:90 -t public,然后在浏览器中打开 https://:90

开始使用

控制器在map.php中注册

控制器在 src/controller 中创建,看起来是这样的

namespace App\Controller;

use Mbrianp\FuncCollection\Logic\AbstractController;
use Mbrianp\FuncCollection\Routing\Routing;
use Mbrianp\FuncCollection\Http\{Response, Request};
use Mbrianp\FuncCollection\Routing\Attribute\Route;

class ControllerName extends AbstractController
{
    #[Route('/', name: 'index')]
    public function method(): Response
    {
        // La vista se buscara en la carpeta que se defina en el .ini
        return $this->render('vista.php', ['param1' => 'hola']);
    }
    
    /**
     * Puedes injectar los parametros de la URL al metodo
     * Es obligartorio tiparlo como string y ponerle al parametro 
     * el mismo nombre del parametro de la ruta
     * 
     * Tambien por ejemplo puede injectar un objeto Request
     * para obtener lo enviado por POST o GET, etc 
     * 
     * O un objeto routing para generar rutas
     * 
     * No importa el orden de los parametros, puedes alternarlos como quieras 
     */
    #[Route('/{parametro}', name: 'index_con_parametro')]
    public function metodo2(string $parametro, Request $request, Routing $routing): Response
    {
        // Response here
    }
    
    /**
     * Si se indica una expresion regular dentro de <> en el parametro de la ruta
     * significa que ese parametro debe cumplir con la expresion regular para que la ruta se active
     * si no cumple se dara un error 404
     */
    #[Route('/{nick<@\w+>}', name: 'profile')]
    public function rutaFiltrada(string $nick): Response
    {
    
    }
}

在视图中,你可以访问控制器中传递的变量

<?php use Mbrianp\FuncCollection\View\ViewHelper; ?>
<html>
    <body>
        <?php echo $param1 ?>
        <!-- Generar rutas -->
        <?php echo ViewHelper::generateUrl('index_con_parametro', ['parametro' => '1']) ?>
    </body>
</html>

命名空间对应于src目录 = App,其他保持不变(src/Entity,在命名空间中为:App\Entity)

数据库(尚未完成)

为数据库创建一个实体在src/Entity(命名空间为App\Entity),并创建公共属性并应用Column属性,只有具有Column属性的属性才会被解释为数据库中的列。

namespace App\Entity;

use Mbrianp\FuncCollection\ORM\Attributes\Column;
use Mbrianp\FuncCollection\ORM\Attributes\FilledValue;
use Mbrianp\FuncCollection\ORM\Attributes\Id;

class User
{
    #[Id]
    #[Column]    
    public ?int $id = null;

    #[Column]
    public string $name;
    
    #[Column]
    public string $lastname;
    
    #[FilledValue(['name', 'lastname'])]
    #[Column]
    public string $fullname;
    
    #[Column(unique: true)]
    public string $email;
    
    #[Column]
    public string $password;
    
    #[Column(type: 'json')]
    public array $roles;
}

使用Column属性定义列的类型,是否接受null,是否唯一(如email),列名等。如果未定义这些数据,则从PHP中获取,例如,列名将是属性的名称,类型是属性的类型。 每个实体的ID必须使用ID属性定义,每个实体必须有一个,默认值为NULL

从该实体可以创建数据库中的表,通过将SchemaGenerator注入到控制器的某个方法中(将来我会添加从控制台执行的功能)

首先更改数据库连接的配置.ini(默认未配置数据库)

namespace App\Controller;

use App\Entity\User;
use Mbrianp\FuncCollection\Http\Response;
use Mbrianp\FuncCollection\ORM\ORM;
use Mbrianp\FuncCollection\ORM\SchemaGenerator;

class Controller
{
    // Aqui se configura la ruta con #[Route]
    public function createDatabase(ORM $orm, SchemaGenerator $schemaGenerator): Response
    {
        $schemaGenerator->createEntityTable(User::class);
        
        // Lo mismo de arriba
        //$orm->getSchemaGenerator()->createEntityTable(User::class);
        
        return new Response('Content');
    }
}

也可以使用SchemaGenerator通过createDatabase(nombredelabasededatos)创建数据库,但好的,你已经手动创建了数据库以测试前面的代码。

插入数据

要在数据库中插入数据,需要在控制器中要求EntityManager。

namespace App\Controller;

use App\Entity\User;

class AppController
{
    public function register(EntityManager $manager): Response
    {
        $user = new User();
        
        $user->name = 'Name';
        $user->lastname = 'Lastname';
        $user->email = 'email@email.email';
        $user->password = 'password';
        
        // Insertar
        $manager->persist($user);
        
        // Response here.
    }
}

查询

最后,使用存储库对数据库进行查询。为实体定义一个存储库,将repository属性应用于实体。

namespace App\Entity;

use App\Repository\UserRepository;
use Mbrianp\FuncCollection\ORM\Attributes\Repository;

#[Repository(UserRepository::class)]
class User
{
    // El mismo contenido de antes
}

UserRepository类位于src/Repository中,并从AbstractRepository继承以获取基本查询方法。

namespace App\Repository;

use App\Entity\User;
use Mbrianp\FuncCollection\ORM\AbstractRepository;

class UserRepository extends AbstractRepository
{
    public static function getRefEntity(): string
    {
        return User::class;
    }
}

AbstractRepository唯一要求是创建一个getRefEntity方法,返回与存储库相关的实体。要执行查询,可以在控制器中注入EntityManager,并通过getRepository(entityclass)方法获取存储库以及一些查询方法。然而,您也可以直接注入存储库(顺便解释一下如何更新和删除记录)。

namespace App\Controller;

use App\Entity\User;
use App\Repository\UserRepository;
use Mbrianp\FuncCollection\Http\Response;
use Mbrianp\FuncCollection\ORM\EntityManager;
use Mbrianp\FuncCollection\Routing\Attribute\Route;

class AppController
{
    // Aqui va la ruta
    public function index(EntityManager $manager, UserRepository $repository): Response
    {
        // Lo mismo que injectar UserRepository 
        $repository = $manager->getRepository(User::class);
        
        // Metodos
        // Encontrar por el ID
        $repository->find(1);
        
        // Todos los registros de la base de datos
        $repository->findAll();
        
        // Filtrar la busqueda
        $repository->findBy(['country' => 'Cuba']);
        
        // Filtrar la busqueda pero con un solo resultado
        $user = $repository->findOneBy(['country' => 'Cuba']);
        
        // Cambiar de valor la propiedad que se quiere actualizar
        // Todas las demas propiedades tendran de valor el resultado de
        // la base de datos con el metodo findOneBy
        $user->country = 'Italy';
        
        // Va a actualizar dado que el Id esta definido
        // Si el Id no esta definido pues insertara el registro
        // Tambien puedes actualizar un registro sin buscarlo en la base de datos
        // Solamente crear el objeto y asegurar que el ID sea del registro que se va a actualizar
        $manager->persist($user);
        
        // Para eliminar
        $manager->remove($user);
        
        // Response here
    }
    
    /**
     * Otra forma de hacer consultas es exigiendo la entidad como parametro
     * Esto funcionara siempre y cuando en la ruta haya un parametro que coincida con una propiedad (que sea columna) en la entidad
     * Por ej, aqui, en la ruta, hay parametro, id por lo tanto se va a buscar un usuario con el id que se pase en la URL
     *
     * El parametro es obligado tiparlo para asi saber en que tabla buscar
     * y tambien debe aceptar null como valor en case de que no se encuentre ningun resultado 
     */
    #[Route('/profile/{id<\d+>}', name: 'profile')]
    public function profile(?User $user): Response
    {
        return new Response(\var_export($user, true));
    }
}