我所拥有的是一个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
但我想知道我是否会以最佳方式做到:
答案 0 :(得分:0)
Symfony允许从命令行使用其功能。如果您使用CronJob或其他应用程序,并且想要调用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构建应用程序时,请使用您可以使用的漂亮工具。