laton / framework
一个Web框架
Requires
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)); } }