从Symfony应用程序外部访问和使用Symfony模型层

时间:2016-04-25 13:13:55

标签: php symfony doctrine-orm doctrine

我所拥有的是一个symfony应用程序,它包含一些实体和一些存储库。第二个非symfony应用程序应与第一个应用程序接口,以便与其中编写的某些逻辑进行交互(此时此刻仅使用实体及其正确的存储库)。 请记住,第一个应用程序可能有自己的自动加载寄存器等。

我想到了一个外部应用程序的API类,它位于app目录中。要使用它,应用程序应该需要一个脚本。这是一个想法:

外部应用程序应该要求的

app/authInterface.php

$loader = require __DIR__.'/autoload.php';
require_once (__DIR__.'/APIAuth.php');

return new APIAuth();

和我写的一个工作的APIAuth的例子(代码有点乱:记住这只是一个尝试,但你可以得到这个想法):

class APIAuth
{
    public function __construct()
    {
        //dev_local is a personal configuration I'm using.
        $kernel = new AppKernel('dev_local', false);
        $kernel->loadClassCache();
        $kernel->boot();

        $doctrine = $kernel->getContainer()->get('doctrine');
        $em = $doctrine->getManager();
        $users = $em->getRepository('BelkaTestBundle:User')->findUsersStartingWith('thisisatry');
    }

通过shell调用它一切正常,我很高兴:

php app/authInterface.php

但我想知道我是否会以最佳方式做到:

  • 资源我是否只加载运行代码所需的资源?我真的需要内核吗?这样一切都正确加载 - 包括数据库连接 - 但我不确定是否还有其他方法可以更轻松
  • symfony logics 我是否正确地与symfony互动?还有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

Symfony允许从命令行使用其功能。如果您使用CronJob或其他应用程序,并且想要调用Symfony应用程序,则有两个常规选项:

  • 在Symfony应用程序中生成HTTP端点
  • 生成在Symfony应用程序中执行代码的命令

下面将讨论这两个选项。

HTTP端点(REST API)

在路由配置中创建路由,以将HTTP请求路由到Controller / Action。

# app/config/routing.yml
test_api:
    path:      /test/api/v1/{api_key}
    defaults:  { _controller: AppBundle:Api:test }

将调用ApiController::testAction方法。

然后,使用您想要执行的代码实现testAction

use Symfony\Component\HttpFoundation\Response;

public function testAction() {
    return new Response('Successful!');
}

<强>命令

创建一个命令行命令,在您的应用程序中执行某些内容。这可用于执行可以使用您在(Web)应用程序中定义的任何Symfony服务的代码。

看起来像是:

// src/AppBundle/Command/TestCommand.php
namespace AppBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

class GreetCommand extends ContainerAwareCommand
{
    protected function configure()
    {
        $this
            ->setName('myapp:section:thecommand')
            ->setDescription('Test command')
            ->addArgument(
                'optionname',
                InputArgument::OPTIONAL,
                'Test option'
            )
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $option = $input->getArgument('optionname');
        if ($option) {
            $text = 'Test '.$option;
        } else {
            $text = 'Test!';
        }

        $output->writeln($text);
    }
}

查看here以获取文档。

使用类似

的方式调用命令
bin/console myapp:section:thecommand --optionname optionvalue

(使用app/console进行3.0之前的Symfony安装。)

使用您认为最佳的选项。

一句建议。当您的应用程序使用完整的Symfony框架时,请勿尝试使用Symfony框架的某些部分。很可能你会一路上遇到麻烦而你正在努力工作。

当您已经使用Symfony构建应用程序时,请使用您可以使用的漂亮工具。