aliasio/swiftlet

此包已被废弃,不再维护。未建议替代包。

可能是你用过的最小的 MVC 框架。

dev-master 2017-05-20 23:49 UTC

This package is not auto-updated.

Last update: 2020-08-21 20:02:25 UTC


README

Swiftlet 可能是您用过的最小的 MVC 框架。而且它非常快速。

MIT 许可证 下发布。

热门词汇合规性

✔ 微型框架
✔ 松散耦合
✔ 单元测试
✔ 命名空间
✔ 可插件
Composer
PSR-4
✔ PHP7
✔ MVC
✔ 面向对象

✘ ORM

安装

  • 将 Swiftlet 克隆(或下载并解压)到 PHP 支持的 Web 服务器上的目录中。
  • 安装了 Composer 后,运行 composer dump-autoload

入门:控制器和视图

让我们创建一个页面。每个页面由一个控制器和至少一个视图组成。

控制器完成大部分工作;视图应仅限于简单的展示逻辑(循环和开关)。

控制器 src/HelloWorld/Controllers/Foo.php

<?php
namespace HelloWorld\Controllers;

use \Swiftlet\Abstracts\Controller as ControllerAbstract;

class Foo extends ControllerAbstract
{
	protected $title = 'Foo'; // Optional but usually desired 

	// Default action
	public function index(array $args = [])
	{
		// Pass a variable to the view
		$this->view->helloWorld = 'Hello world!';
	}
}

重要:类名以 CamelCase 编写,并与其文件名匹配。

视图 views/foo.php

<h1><?= $this->pageTitle ?></h1>

<p>
	<?= $this->helloWorld ?>
</p>

控制器可以直接在视图中设置变量。值会自动安全地用于 HTML,对于应视为代码的值,请使用 $this->get('variable', false)

现在您可以在 Web 浏览器中通过访问 http://<swiftlet>/foo 来查看页面!

如果您收到“404 未找到”,您需要在 Web 服务器配置中启用重写。或者,您可以导航到 http://<swiftlet>?q=foo

Swiftlet 可从命令行调用(例如运行 cron 作业)。只需运行 php public/index.php -q foo

路由

注意您可以通过创建名为 Foo 的控制器来访问 /foo 页面。应用程序将 URL 映射到控制器、动作和参数。

考虑以下 URL: /foo/bar

在这种情况下,foo 成为控制器和视图的名称,bar 成为动作的名称。动作是控制器类上的公共方法。

您可以使用 $this->view->setName() 为动作指定不同的视图。视图名称是相对于 src\<namespace>\views 目录的文件名,不包含 .php 后缀。

如果未指定控制器或动作,则默认为 index/ 将在 \HelloWorld\Controller\Index 上调用 index())。

控制器名称中的下划线被转换为目录分隔符,因此 /foo_bar 将指向 src/HelloWorld/Controllers/Foo/Bar.php

路由中的破折号将被忽略;/foo-bar/baz-qux 调用 bazqux()\HelloWorld\Controllers\Foobar 上。

自定义路由

自动路由方便,但通常需要更细粒度的控制。在这种情况下,可以定义自定义路由。

路由将URL映射到操作(方法)。

URL段可以用一个“通配符”占位符(以冒号开头的变量名)替换。这个值可以在控制器中使用。

考虑这个路由: bar/:qux

导航到 <controller>/bar/something 匹配此路由。 $args['qux'] 的值变为 something

<?php
namespace HelloWorld\Controllers;

use \Swiftlet\Abstracts\Controller as ControllerAbstract;

class Foo extends ControllerAbstract
{
	protected $routes = array(
		'hello/world' => 'index',
		'bar/:qux'    => 'bar'
		);

	public function index(array $args = [])
	{
		// You navigated to foo/hello/world
	}

	public function bar(array $args = [])
	{
		// You navigated to foo/bar/<something>
		// $args['qux'] contains the second URL argument
	}
}

模型

让我们在混合物中加入一个模型并更新控制器。

模型 src/HelloWorld/Models/Foo.php

<?php
namespace HelloWorld\Models;

use \Swiftlet\Abstracts\Model as ModelAbstract;

class Foo extends ModelAbstract
{
	public function getHelloWorld()
	{
		return 'Hello world!';
	}
}

控制器 src/HelloWorld/Controllers/Foo.php

<?php
namespace HelloWorld\Controllers;

use \Swiftlet\Abstracts\Controller as ControllerAbstract;
use \HelloWorld\Models\Example as ExampleModel;

class Foo extends ControllerAbstract;
{
	protected $title = 'Foo';

	public function index()
	{
		// Get an instance of the Example class 
		// See src/HelloWorld/Models/Example.php
		$example = new ExampleModel;

		$this->view->helloWorld = $example->getHelloWorld();
	}
}

模型通常表示数据。这可以是一个数据库中的条目或用户等对象。

<?php
use \HelloWorld\Models\User as UserModel;

$user = new UserModel;

$user->setEmail('example@example.com');

$user->save();

加载和保存数据几乎总是在模型中发生。你可以创建尽可能多的模型;它们与控制器或视图无关。

事件和监听器

监听器监听事件。当触发事件时,所有相关监听器都会被调用,并可以用来扩展功能。

Swiftlet有几个核心事件,还可以使用$this->app->trigger($event)在几乎任何地方触发额外的事件。

监听器 src/HelloWorld/Listeners/Foo.php

<?php
namespace HelloWorld\Listeners;

use \Swiftlet\Abstracts\Controller as ControllerAbstract;
use \Swiftlet\Abstracts\Listener as ListenerAbstract;
use \Swiftlet\Abstracts\View as ViewAbstract;

class Foo extends ListernerAbstract
{
	public function actionAfter(ControllerAbstract $controller, ViewAbstract $view)
	{
		// Overwrite our previously set "helloWorld" variable
		$view->helloWorld = 'Hi world!';
	}
}

这个监听器监听核心的 actionAfter 事件,并将之前示例中的视图变量 helloWorld 更改为 Hi world!

监听器无需安装或激活,src/HelloWorld/Listeners/ 目录中的所有文件都会自动包含,并且它们的类会被实例化。监听器按字母顺序调用。

核心事件包括

  • actionBefore
    在每个动作之前调用

  • actionAfter 在每个动作之后调用

如发送电子邮件或生成缩略图的代码等可重用组件应放在单独的库类中。

<?php
use \HelloWorld\Libraries\Email as EmailLibrary;

$email = new EmailLibrary;

$email->send($to, $subject, $message);

配置

运行Swiftlet不需要配置。如果你正在编写需要配置的模型,例如建立数据库连接的凭据,你可以使用应用程序的setConfiggetConfig方法。

<?php
$this->app->setConfig('variable', 'value');

$value = $this->app->getConfig('variable');

可以在 config/main.php 或自定义文件中设置值。

公共方法

应用程序 Swiftlet\App

  • App dispatchController()
    确定要使用哪个控制器并运行它

  • App serve()
    提供页面

  • mixed getConfig(string $variable)
    获取配置值

  • App setConfig(string $variable, mixed $value)
    设置配置值

  • App registerHook(string $hookName, array $params)
    注册钩子

视图 Swiftlet\View

  • mixed get(string $variable [, bool $htmlEncode = true ])
    获取视图变量,默认情况下编码以在HTML中使用

  • View set(string $variable [, mixed $value ])
    设置视图变量

  • mixed get(string $variable [, bool $htmlEncode ])
    获取视图变量,将第二个参数传递为 false 以防止值被HTML编码。

  • string getRootPath()
    到网站根目录的绝对客户端路径

  • mixed htmlEncode(mixed $value)
    递归地将值转换为安全地用于HTML的值

  • mixed htmlDecode(mixed $value)
    递归地解码先前编码的值以作为HTML渲染

  • View render(string $path)
    渲染视图