2016-04-25 28 views
0

我所擁有的是一個symfony應用程序,它包含一些實體以及一些存儲庫。第二個非symfony應用程序應該與第一個非symfony應用程序進行交互,以與其中編寫的某些邏輯進行交互(在此刻僅使用實體及其適當的存儲庫)。 請記住,第一個應用程序可以有它自己的自動加載寄存器等從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'); 
    } 

工作,我很高興與它:

php app/authInterface.php 

但我想知道如果我做的最好的方式來講:我在剛裝我真的需要我的代碼運行的資源

  • 資源?我真的需要內核嗎?這樣一切正常加載 - 包括數據庫連接 - 但我不知道如果有其他方法可以做到更輕
  • symfony邏輯我正在與symfony正確的方式進行交互?有更好的方法嗎?
+0

爲什麼不創建一個HTTP API來驗證外部應用程序? – Hidde

+0

我建議用一個清晰​​的接口(例如通過REST或XML或類似的東西)用Symfony構建適當的後端。 – LBA

+0

'Auth'只是一個例子:我真的需要通過編程來訪問Symfony,以獲得一系列我所具有的架構約束。我們能專注於真正的話題嗎? :-) – Bertuz

回答

0

Symfony允許從命令行使用其功能。如果你使用一個cronjob或其他應用程序,並想打電話給你的Symfony的應用程序,你有兩個常規選項:

  • 生成HTTP端點在你的Symfony應用
  • 生成它在你的Symfony應用
  • 執行代碼的命令

這兩個選項將在下面討論。

HTTP端點(REST API)

創建你的路由配置的路由來路由一個HTTP請求給控制器/動作。

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

這將調用ApiController::testAction方法。

然後,執行要excecute與你的代碼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構建應用程序時,請使用您擁有的漂亮工具。

相關問題