codecat/nin

一个基于 Yii 1 和 2 的一些思想的极简主义 PHP 框架。

维护者

详细信息

github.com/codecat/Nin

源代码

问题

资助包维护!
Patreon

安装: 30

依赖: 0

建议者: 0

安全: 0

星星: 10

观察者: 6

分支: 1

开放问题: 3

类型:项目

2.1.0 2022-04-08 18:51 UTC

README

Nin 是一个基于 Yii 的一些思想的极简主义 PHP 框架,它代表 "No It's Not",是 Yii 的 "Yes It Is" 的双关语。

它是如何工作的?

Nin 是一个 MVC 系统,其中 Nin\ModelNin\Controller 是关键类,视图是包含 PHP 文件的。

入门

通过 Composer 安装依赖项,可以快速开始使用 Nin。您可以在 Packagist 上找到此包(https://packagist.org.cn/packages/codecat/nin)。运行以下命令进行安装:

$ composer require codecat/nin

然后创建 index.php

include 'vendor/autoload.php';
nf_begin();

详细安装

还有一个方便的 Docker 镜像,您可以使用它,其中已经预配置了 web 服务器和 PHP。滚动到 README 的底部以了解更多信息。

您还可以从 Github(或 master 分支)下载版本,并从其他地方包含 Nin。根据您的 web 服务器,您可能还需要配置重写规则,以便所有内容都指向 index.php。可以在 server-configs 中找到流行 web 服务器的示例配置和基本说明。我建议使用 Caddy 和 php-fpm,因为它工作得很好,并且默认情况下已经正确路由到 index.php

最简化的示例

在调用 nf_begin 之后,您自动拥有 1 个路由:/。默认情况下,它指向 IndexController.Index。这意味着它将寻找一个名为 IndexController 的类和该类中名为 actionIndex 的方法。

要创建控制器类,在 index.php 所在目录中创建一个名为 controllers 的文件夹。在这个文件夹内,我们可以创建一个名为 IndexController.php 的文件。

class IndexController extends \Nin\Controller {
  public function actionIndex() {
    echo 'This is the index page!';
  }
}

路由以 controller.action 的形式工作,其中 controller 是类名,action 是对应于类中前缀为 action 的方法的动作名称。例如,FooController.Bar 将实例化 FooController 并调用其上的 actionBar

使用 nf_route 函数定义路由

nf_route('/', 'IndexController.Home');
nf_route('/info', 'IndexController.Info');
nf_route('/user/:username', 'UserController.Profile');

上面示例中的最后一个 nf_route 调用在其路径中有一个特殊参数,:username。这将成为您的动作方法中的一个参数。所以在这个示例中,第三个路由将使用这个控制器类

class UserController extends \Nin\Controller {
  public function actionProfile(string $username) {
    // Do something with $username
  }
}

注意,您还可以指定方法的参数类型,以便自动转换为正确的类型。例如,int $id 将确保您确实得到一个整数参数。

动作方法参数也可以使用从 $_GET 获取的 URL 参数设置。例如,如果您的路由定义为简单的 /user,那么您仍然可以通过将 URL 设置为 ?username=foo 来设置 string $username。当 URL 中没有提供 username 时,Nin 将抛出一个关于缺少必需参数的错误。您可以通过为方法参数提供一个默认值来使参数可选,例如:string $username = 'admin'

如果控制器接受参数,参数也将传递到控制器构造函数中。它们的行为与方法参数完全相同。例如,如果您有一个指向 UserController.Posts 的路由 /user/:id/posts,您可以使用以下控制器

class UserController extends \Nin\Controller {
  private $user;

  public function __construct(int $id) {
    $this->user = User::findByPk($id);
  }

  public function actionPosts() {
    // Do something with $this->user
  }
}

使用视图

您还可以在控制器的方法内部执行以下操作:

$this->render('foo');

这将渲染位于 views/controller/view.phpfoo 视图。因此,如果上述行位于 IndexController 中,视图将位于 views/index/foo.php

您还可以像这样向 render() 函数传递参数

$this->render('foo', [
  'bar' => 'hello ',
  'foobar' => 'world'
]);

您的视图可以使用这些参数,就像数组中的键是 PHP 变量一样

<p>The controller says: <b><?= $bar . $foobar ?></b></p>

如果您在 views/layout.php 中创建一个布局文件,您可以用它作为视图的包装器。它将为渲染的视图公开 $content 变量。例如,它可以这样看起来

<!doctype html>
<html>
  <head>
    <title>My website</title>
  </head>

  <body>
    <h1>My website</h1>
    <div class="content">
      <?= $content ?>
    </div>
  </body>
</html>

使用数据库

Nin 支持 PostgreSQL、MySQL 和 SQLite。要开始使用 PostgreSQL 等数据库,请将数据库连接信息作为 nf_begin 的参数指定

nf_begin([
  'postgres' => [
    'hostname' => 'localhost',
    'password' => 'password',
  ],
]);

一旦设置此配置,您就可以创建并使用模型。

注意,上面的 postgres 键是更详细的数据库配置的快捷方式

nf_begin([
  'db' => [
    'class' => 'Postgres',
    'options' => [
      'hostname' => 'localhost',
      'password' => 'password',
    ],
  ],
]);

更详细的配置允许您在需要时实现其他第三方数据库上下文和查询构建器。

使用模型

模型定义为类。静态函数用于配置模型的行为。例如,用户模型看起来像这样

class User extends \Nin\Model {
  public static function tablename() { return 'users'; }
}

默认情况下,模型的主键定义为 ID,但可以通过定义静态函数 primarykey 来更改

public static function primarykey() { return 'id'; }

这告诉 Nin,包含该模型行数据的数据库表名为 users

现在您可以使用新的 User 类执行所有种类的操作。要创建新用户

$user = new User();
$user->Username = 'admin';
$user->Password = 'hunter2';
$user->Age = 24;
$user->save();

// Nin will automatically set the ID of the model after inserting it
echo 'New user ID: ' . $user->ID;

(备注:确保在数据库中强烈散列密码,上面的示例只是为了演示目的!)

通过 ID 查找用户

$user = User::findByPk(1);
if (!$user) {
  die('No user found!');
}
echo 'Hello, ' . $user->Username;

通过属性(列值)查找用户

$user = User::findByAttributes([ 'Username' => 'admin' ]);
if (!$user) {
  die('No user found!');
}
echo 'Hello, ' . $user->Username;

您还可以使用 findAllfindAllByAttributes 来获取多个模型。它们返回数组,并按预期工作

$users = User::findAll();
$users = User::findAllByAttributes([ 'Age' => 24 ]);

您可以选择向 findAllfindAllByAttributes 的第二个参数传递一个数组形式的选项。接受的键有

  • group 使用其值执行分组查询
  • order 对象排序的顺序(默认为 ASC
  • orderby 按哪个列排序对象(默认为主键)
  • limit 您希望获取的最大项目数(整数),或项目范围的数组

模型也可以有 关系 属性。例如,如果用户可以有多个帖子,您将定义 User 类如下

class User extends \Nin\Model {
  public static function tablename() { return 'users'; }

  public function relations() {
    return [
      'posts' => [ HAS_MANY, 'Post', 'Author' ],
    ];
  }
}

然后您可以直接使用 $user->posts 来获取模型 Post 的对象数组,使用帖子列 Author。您可以定义 3 种关系类型

  • BELONGS_TO 使用 他们的类名我的列 来查找一个对象
  • HAS_MANY 使用 他们的类名他们的列 来查找多个对象
  • HAS_ONE 使用 他们的类名他们的列 来查找一个对象

中间件

您可以为特定路由设置中间件。为此,请使用函数 nf_route_middleware_beginnf_route_middleware_end 将您的 nf_route 调用包装起来。例如,要要求用户登录才能访问某些路由,您可以这样做

nf_route_middleware_begin(new Nin\Middleware\AuthSession());
nf_route('/posts', 'PostsController.Index');
nf_route('/users', 'UsersController.Index');
nf_route_middleware_end();

当用户导航到/posts/users并且未登录(通过Nin\Nin::setuid()提供的用户会话管理)时,请求将停止,永远不会到达控制器。此外,默认情况下,AuthSession还会将用户重定向到/login,以便用户登录。

可以通过多次调用nf_route_middleware_begin来堆叠中间件。请注意,您还必须以相同次数调用nf_route_middleware_end,否则Nin会抛出错误。

Docker

Nin还提供基于caddy:alpineDocker镜像。以下是如何在Dockerfile中使用Nin的快速示例

FROM codecatt/nin:2.0
COPY . /var/www/html

然后,在您的index.php中,您可以这样包含Nin

include('../nin/nf.php');

请注意,您无需进行任何手动配置,因为Docker镜像会自动处理。

有多个标签可供选择

  • latest:最新版本。
  • 2.0:最新2.0.x版本。
  • 1.6:最新1.6.x版本。
  • 1.3:最新1.3.x版本。
  • 1.2:最新1.2.x版本。