carlescliment / moco
PHP 模型-控制器微框架
Requires
- php: >=5.3.2
- symfony/config: v2.3.3
- symfony/dependency-injection: v2.3.3
- symfony/finder: v2.3.3
- symfony/yaml: v2.3.3
This package is not auto-updated.
Last update: 2024-09-23 13:26:04 UTC
README
MoCo 是一个模型-控制器框架。它基于 Symfony 依赖注入组件构建,允许您构建无 HTTP 相关的应用程序,并专注于系统所需的企业逻辑。目标是去除面向 Web 框架的烦恼,以获得更好的设计。它也不打算生成视图,尽管您也可以这样做。
一旦您的企业逻辑已经正确编码和测试,您就可以将应用程序包含在一个 HTTP 框架中,该框架将处理请求并提供 HTML、JSON 或您需要的任何格式的响应。
安装
创建一个包含您的 PHP 应用程序的目录。在该目录中创建一个 composer.json
文件。最初它可能看起来像这样
{
"name": "my/moco-app",
"require": {
"php": ">=5.3.2",
"carlescliment/moco": "dev-master"
},
"autoload": {
"psr-0": { "": "src/" }
}
}
执行 php composer.phar update
。MoCo 将作为供应商安装。
在 MoCo 上构建您的应用程序
MoCo 不提供任何标准来构建您的目录结构。以下是一个示例
-
在您的项目内部创建一个名为
src/Configuration/
的目录。 -
在
src/Configuration/ApplicationBuilder.php
中创建一个新的类ApplicationBuilder
。<?php namespace Configuration; use carlescliment\moco\Application\ApplicationBuilder as MocoBuilder; class ApplicationBuilder { public static function build($env = 'prod', $dir = null) { if (is_null($dir)) { $dir = __DIR__; } return MocoBuilder::build($dir, $env); } }
如您所见,MocoBuilder 接受两个参数,$dir
和 $env
。$dir
是配置文件所在的目录,$env
是将要使用的环境。我们稍后讨论它。
测试您的第一个控制器
我们从开始。为了使测试正常运行,我们需要一些配置文件。首先,在您的根目录中创建一个 phpunit.xml
文件。
<phpunit
backupGlobals = "false"
backupStaticAttributes = "false"
colors = "true"
convertErrorsToExceptions = "true"
convertNoticesToExceptions = "true"
convertWarningsToExceptions = "true"
processIsolation = "false"
stopOnFailure = "true"
syntaxCheck = "false"
bootstrap = "tests/bootstrap.php">
<testsuites>
<testsuite name="MoCo App Test Suite">
<directory>tests/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory>src/</directory>
</whitelist>
</filter>
</phpunit>
然后,创建 tests/bootstrap.php
文件来自动加载源代码。
<?php
$loader = require __DIR__.'/../vendor/autoload.php';
$loader->add('Test', __DIR__);
完美,现在让我们编写测试。创建一个名为 tests/Controller
的文件夹,并编写一个文件 GreetingsControllerTest.php
。
<?php
namespace Test\Controller;
use Configuration\ApplicationBuilder;
class GreetingsControllerTest extends \PHPUnit_Framework_TestCase
{
/**
* @test
*/
public function itGreetsPeople()
{
$app = ApplicationBuilder::build('test')->run();
$response = $app->getService('greetings_controller')->greet('Carles');
$this->assertEquals('Hello Carles!', $response);
}
}
这个测试说明应用程序能够说你好。通过查看内部代码,我们看到首先我们创建了一个应用程序实例,然后执行一个名为 'greetings_controller' 服务的 greet
方法,并返回一个字符串,该字符串问候传递给第一个参数的人。
从根目录运行测试文件,执行 phpunit
命令。
E
Time: 0 seconds, Memory: 3.75Mb
There was 1 error:
1) Test\Controller\GreetingsControllerTest::itGreetsPeople
InvalidArgumentException: The file "config_test.yml" does not exist (in: /var/www/vhosts/moco-app/src/Configuration).
测试失败。它说它在 /var/www/vhosts/moco-app/src/Configuration
中寻找 config_test.yml
文件,但没有找到,对吗?让我们谈谈环境。
环境
MoCo 可以在许多不同的环境中运行。最常用的环境是 'test'、'dev' 和 'prod',尽管您可以创建一个具有您希望命名的名称的环境。环境允许您提供不同的配置和行为。这对于测试非常有用,但在您在不同的客户之间共享相同的代码库时也很有用。
让我们通过编写一个空的 src/Configuration/config_test.yml
文件来满足测试的要求。再次运行测试
E
Time: 0 seconds, Memory: 4.00Mb
There was 1 error:
1) Test\Controller\GreetingsControllerTest::itGreetsPeople
Symfony\Component\DependencyInjection\Exception\InvalidArgumentException: The service definition "greetings_controller" does not exist.
嘿,这不同了。它说我们没有在容器中声明任何名为 "greetings_controller" 的服务。MoCo 被设计成可以被其他应用程序使用,因此控制器必须声明为服务才能公开。
为了使这个指南更快,我们将现在采取许多不同的步骤。
构建公共控制器
首先,让我们整理我们的配置文件。在 src/Configuration/config.yml
中写入以下内容的文件
parameters:
# declare your parameters here
services:
greetings_controller:
class: Controller\GreetingsController
修改 src/Configuration/config_test.yml
的内容
imports:
- { resource: "config.yml" }
如果您现在执行测试,您将看到以下消息
ReflectionException: Class Controller\GreetingsController does not exist
太棒了,这很容易解决。来吧,把您的控制器写在 src/Controller/GreetingsController.php
<?php
namespace Controller;
class GreetingsController
{
public function greet($name)
{
return "Hello $name!";
}
}
高级控制器
我们编写的控制器已经足够用于问候人们,但通常您需要在逻辑上添加更多。实际上,您可能需要从控制器中访问其他服务。MoCo 允许您通过编写高级控制器来访问依赖注入容器。
修改 config.yml
中控制器的声明并添加一个参数
parameters:
greet_clause: 'Hi'
greetings_controller:
class: Controller\GreetingsController
tags:
- { name: moco.controller }
现在修改您的控制器类
<?php
namespace Controller;
use carlescliment\moco\Application\Moco;
class GreetingsController extends Moco
{
public function greet($name)
{
$greet_clause = $this->getParameter('greet_clause');
return "$greet_clause $name!";
}
}
如果您现在运行测试,您将看到它们失败并显示以下消息
1) Test\Controller\GreetingsControllerTest::itSaysHello
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'Hello Carles!'
+'Hi Carles!'
这意味着您的控制器现在知道环境配置了!
添加编译器和扩展
随着您的应用程序的增长,您可能需要安装第三方库并将它们公开在容器中。幸运的是,您可以通过在运行应用程序之前添加编译器传递和扩展来轻松完成此操作
$app = MocoBuilder::build($dir, $env);
$app->addExtension(new MyExtension);
$app->addCompilerPass(new SwiftMailerCompilerPass);
$app->addCompilerPass(new DoctrineCompilerPass);
$app->addCompilerPass(new EventDispatcherCompilerPass);
$app->run();
将 MoCo 集成到您自己的框架中
一旦您的业务逻辑得到良好定义并编码,现在您可以使用 composer 在您的 Symfony/Sylex/Drupal/CodeIgniter/ whatever 中引入应用程序。只需编写构建 MocoApp 所需的代码,并以与测试相同的方式使用它。