rougin / basilisk
Slytherin的项目骨架。
Requires
- php: >=5.4.0
- illuminate/database: ~5.0|~6.0|~7.0|~8.0|~9.0|~10.0|~11.0
- illuminate/events: ~5.0|~6.0|~7.0|~8.0|~9.0|~10.0|~11.0
- illuminate/view: ~5.0|~6.0|~7.0|~8.0|~9.0|~10.0|~11.0
- robmorgan/phinx: ~0.8
- rougin/weasley: ~0.6
- vlucas/phpdotenv: ~2.0
Requires (Dev)
- phpunit/phpunit: ~4.2|~5.7|~6.0|~7.0|~8.0|~9.0
- sanmai/phpunit-legacy-adapter: ~6.1|~8.0
This package is auto-updated.
Last update: 2024-09-09 07:27:51 UTC
README
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/
此目录包含用于验证的类。这些类可以扩展到Weasley的Check
类。
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; } }
注意
在仓库之前使用,或者可能更广为人知的是仓库模式,我将在Routes
或Models
目录中实现大部分逻辑。然而,这给我在组织代码方面带来了挑战。使用仓库,我可以在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)。请参阅许可证获取更多信息。