jamm/mvc

MVC设计项目的微型基础框架

维护者

详细信息

github.com/jamm/MVC

源代码

问题

dev-master 2015-08-18 14:33 UTC

This package is not auto-updated.

Last update: 2024-09-14 13:18:04 UTC


README

创建MVC设计应用程序的基接口和类

### 主要概念 它可以用作构建MVC应用程序的基。
这里最重要的是接口 - 架构的基础。

### 工作原理 请求被Front Controller解析后,传递给Router,然后从Router传递给Controller,Controller填充响应,然后将此响应返回给用户。

### 内置服务 内置了一些有用的模型

  • Crypt - 用于密码散列和/或双向加密(基于mcrypt)。
  • Sessions - 用于会话处理(默认为Redis,但可配置)。
  • SessionAuthenticator - 与cookie和CSRF保护一起工作。实现了AngularJS XSRF-token保护机制,并为JSON响应添加了前缀。

如果您愿意,可以使用来自Models文件夹的一些服务 - 它们绝对有效,并且在实时项目中使用。
总的来说,这个库永远不会要求您的类扩展库中的类。主要建议 - 倾向于组合而非继承。
但“永不要求”并不意味着“不允许” - 如果您发现某些类足够好,可以用作基类 - 那就这么做,它们旨在以两种方式都很有用。

此外,在Views文件夹中还有模板渲染器(PHTML和Twig),欢迎使用它们。
但如果您不介意 - 看看AngularJS。使用AngularJS,您可以使用原生的HTML页面作为模板,由nginx或Apache(无需PHP)提供,因此您的应用程序将需要更少的服务器资源。这也意味着更少的页面重新加载(由于ajax请求) - 您的应用程序的性能和可用性将大大提高。
这只是个建议 :)

### 依赖项 Jamm\HTTP
PHP 5.3+

### 带自动填充路由的前端控制器示例

class Launcher
{
	public function start(array $config = [])
	{
		$ServiceFactory     = new ServiceFactory(new Config($config));
		$ServiceLocator     = new ControllersServiceLocator($ServiceFactory);
		$FallbackController = new IndexPage();
		$RequestParser      = new RequestParser($ServiceFactory->getRequest());
		$Response           = $ServiceLocator->getResponse();
		$Router = new AutoFillableRouter($RequestParser, $FallbackController);
		$Router->fillRoutesFromList(new RoutesList($config['routes']), __NAMESPACE__.'\\Controller', new ControllerBuilder($ServiceLocator));
		$Controller = $Router->getControllerForRequest();
		$Controller->fillResponse($Response);
		$Response->Send();
	}
}

#### 自动填充路由的配置

{
	"routes": {
		"service": "ServiceAPI",
		"user": "UserAPI",
		"record": "RecordAPI"
	}
}

#### 自动填充控制器的示例

class ServiceAPI extends AutoInstantiableController implements IRequireServiceLocator
{
	public function fillResponse(\Jamm\HTTP\IResponse $Response)
	{
		$action = $this->ServiceLocator->getRequestParser()->getQueryArrayItem(1);
		if ($action=='get_init_data')
		{
			$data = $this->ServiceLocator->getRedis()->get('data');
			$Response->setBody($data);
		}
	}
}

### 不带自动填充路由的前端控制器示例

$RedisServer        = new \Jamm\Memory\RedisServer();
$Request            = new \Jamm\HTTP\Request();
$RequestParser      = new \Jamm\MVC\Controllers\RequestParser($Request);
$TemplatesRenderer  = new \Jamm\RedisDashboard\View\TemplatesRenderer();
$FallbackController = new Controller\Fallback($RedisServer, $TemplatesRenderer);
$Router             = new \Jamm\MVC\Controllers\Router($RequestParser, $FallbackController);
$Response           = new \Jamm\HTTP\Response();

$TemplatesRenderer->setBaseURL('/redis');
$Request->BuildFromInput();
$Router->addRouteForController('db', new Controller\Database($RedisServer, $RequestParser, $TemplatesRenderer));
$Router->addRouteForController('key', new Controller\DBKey($RedisServer, $RequestParser, $TemplatesRenderer));

$Response->setHeader('Content-type', 'text/html; charset=UTF-8');

$Controller = $Router->getControllerForRequest();
$Controller->fillResponse($Response);
$Response->Send();

### 带Twig模板渲染的普通(非自动填充)控制器示例

class Fallback implements \Jamm\MVC\Controllers\IController
{
	private $Redis;
	private $TemplatesRenderer;

	public function __construct(\Jamm\Memory\IRedisServer $Redis,
								\Jamm\MVC\Views\ITemplatesRenderer $TemplatesRenderer)
	{
		$this->Redis             = $Redis;
		$this->TemplatesRenderer = $TemplatesRenderer;
	}

	public function fillResponse(\Jamm\HTTP\IResponse $Response)
	{
		$StatsMonitor = $this->getNewStatsMonitor($this->Redis);
		$stats        = $StatsMonitor->getStats();
		$databases    = $StatsMonitor->getDatabases();

		$template = $this->TemplatesRenderer->render_Twig_template(
			'IndexPage.twig', array('databases' => $databases, 'stats' => $stats));
		$Response->setBody($template);
	}

	/**
	 * @param \Jamm\Memory\IRedisServer $Redis
	 * @return \Jamm\RedisDashboard\Model\StatsMonitor
	 */
	protected function getNewStatsMonitor(\Jamm\Memory\IRedisServer $Redis)
	{
		return new \Jamm\RedisDashboard\Model\StatsMonitor($Redis);
	}
}

### 许可证 MIT

在此,免费许可,任何获得本软件及其相关文档副本(“软件”)的人,在不限制的前提下,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,以及允许向软件提供的人这样做,但受以下条件约束

上述版权声明和本许可声明应包含在软件的副本或主要部分中。

软件按“原样”提供,不提供任何形式的保证,无论是明示的还是暗示的,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权所有者不对任何索赔、损害或其他责任负责,无论是基于合同、侵权或其他原因,源于、源于或与软件或其使用或其他交易有关。