PHP 模型-控制器微框架

安装量: 3,967

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 0

开放问题: 0

类型:项目

1.5.1 2013-08-16 15:47 UTC

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 所需的代码,并以与测试相同的方式使用它。