rougin/basilisk

Slytherin的项目骨架。

v0.1.0 2024-09-06 01:01 UTC

This package is auto-updated.

Last update: 2024-09-09 07:27:51 UTC


README

Latest Version on Packagist Software License Build Status Coverage Status Total Downloads

Basilisk是为Slytherin创建的骨架项目,它基于使用Slytherin作为框架的经验提供了一个代码结构。该代码结构应该易于理解,并基于SOLID原则。

安装

使用Composer通过Basilisk创建一个新的项目。

$ composer create-project rougin/basilisk "hogwarts"

里面有什么?

目录结构

注意

以下目录名称仅是基于我在Slytherin下构建项目经验的首选名称。但它们可以根据Slytherin不遵守这些首选名称的要求进行轻松扩展或删除。

src/
├─ Checks/
├─ Depots/
├─ Models/
├─ Phinx/
│  ├─ Scripts/
│  ├─ Seeders/
├─ Routes/
├─ Scripts/

检查

src/
├─ Checks/

此目录包含用于验证的类。这些类可以扩展到WeasleyCheck类。

namespace App\Checks;

use Rougin\Weasley\Check;

class UserCheck extends Check
{
    /**
     * @var array<string, string>
     */
    protected $labels =
    [
        'name' => 'Name',
        'email' => 'Email',
    ];

    /**
     * @var array<string, string>
     */
    protected $rules =
    [
        'name' => 'required',
        'email' => 'required|email',
    ];
}

仓库

src/
├─ Depots/

主目录,应包含项目的逻辑。

namespace App\Depots;

use App\Models\User;

class UserDepot
{
    /**
     * @var \App\Models\User
     */
    protected $user;

    /**
     * @param \App\Models\User $user
     */
    public function __construct(User $user)
    {
        $this->user = $user;
    }

    /**
     * @return array<string, mixed>[]
     */
    public function all()
    {
        $result = $this->user->all();

        $items = array();

        foreach ($result as $item)
        {
            $row = ['id' => $item->id];

            $row['name'] = $item->name;

            $row['email'] = $item->email;

            $items[] = $row;
        }

        return (array) $items;
    }
}

注意

在仓库之前使用,或者可能更广为人知的是仓库模式,我将在RoutesModels目录中实现大部分逻辑。然而,这给我在组织代码方面带来了挑战。使用仓库,我可以在Routes(用于接收用户请求)或Scripts目录(用于处理基于终端的操作)中重用相同的逻辑。

模型

src/
├─ Models/

这是存储模型(对于Eloquent)或实体(如果使用Doctrine)的目录。此目录中的类应代表一个数据库表(例如,如果有users表,它应表示为User类)

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * @var string[]
     */
    protected $fillable =
    [
        'name',
        'password',
        'email',
    ];

    /**
     * @var string[]
     */
    protected $hidden =
    [
        'password'
    ];

    /**
     * @var string
     */
    protected $table = 'users';
}

Phinx

src/
├─ Phinx/
│  ├─ Scripts/
│  ├─ Seeders/

此目录用于存储与Phinx相关的文件。Scripts目录包含生成的数据库迁移,而Seeders目录必须包含数据库种子。

// src/Phinx/Scripts/20171012020230_create_users_table.php

use Phinx\Migration\AbstractMigration;

class CreateUsersTable extends AbstractMigration
{
    public function change(): void
    {
        $properties = ['id' => false, 'primary_key' => ['id']];

        $table = $this->table('users', $properties);

        $table->addColumn('id', 'integer', ['limit' => 10, 'identity' => true]);
        $table->addColumn('name', 'string', ['limit' => 200]);
        $table->addColumn('email', 'string', ['limit' => 200]);
        $table->addColumn('password', 'string', ['limit' => 500]);
        $table->addColumn('created_at', 'datetime');
        $table->addColumn('updated_at', 'datetime', ['null' => true]);

        $table->create();
    }
}
// src/Phinx/Seeders/UserSeeder.php

use Phinx\Seed\AbstractSeed;

class UserSeeder extends AbstractSeed
{
    protected $items =
    [
        ['name' => 'Harry Jonathans Potter', 'email' => 'hjpotter@hogwarts.co.uk'],
        ['name' => 'Hermione Jane Granger', 'email' => 'hjgranger@hogwarts.co.uk'],
        ['name' => 'Ronald Bilius Weasley', 'email' => 'rbweasley@hogwarts.co.uk'],
    ];

    public function run(): void
    {
        $data = array();

        foreach ($this->items as $item)
        {
            $item['created_at'] = date('Y-m-d H:i:s');

            $data[] = $item;
        }

        $this->table('users')->insert($data)->save();
    }
}

将使用此目录来运行数据库迁移和种子。要迁移数据库脚本,请运行migrate命令

$ vendor/bin/phinx migrate -c app/config/phinx.php

注意

在运行Phinx脚本之前,请先在.env中更新数据库凭据

$ cp .env.example .env

可以使用seed:run命令在数据库中填充数据

$ vendor/bin/phinx seed:run -c app/config/phinx.php

注意

上面的命令将按字母顺序加载种子

路由

src/
├─ Routes/

存储路由的项目网关。该类可以调用或实例化前面提到的目录中找到的类。

namespace App\Routes;

use Rougin\Slytherin\Template\RendererInterface;

class Hello
{
    /**
     * Returns the "Hello, Muggle!" text.
     *
     * @return string
     */
    public function index(RendererInterface $renderer)
    {
        return $renderer->render('index');
    }
}

注意

在其他框架中,Routes通常被称为Controllers

脚本

src/
├─ Scripts/

存储脚本的目录。这些脚本可以直接在终端中使用php命令执行

// src/Scripts/HelloWorld.php

echo 'Hello world!';
$ php src/Scripts/HelloWorld.php

Hello world!

运行应用程序

可以使用PHP内置的Web服务器在开发期间运行项目

$ php -S localhost:8000 -t app/public

然后打开浏览器并转到https://:8000

更新日志

请参阅变更日志获取关于最近更改的更多信息。

测试

$ vendor/bin/phpunit

许可证

MIT许可证(MIT)。请参阅许可证获取更多信息。