2015-10-20 38 views
1

在DoctrineFixturesBundle如果我想按指定順序我有任何這樣的夾具類的方法來創建執行燈具:Symfony2的燈具與秩序 - 更好的方式

public function getOrder() 
{ 
    return 2; 
} 

這是不指定順序舒適的方式。

在Laravel框架我能做到這一點是這樣的:

class DatabaseSeeder extends Seeder 
{ 
    public function run() 
    { 
     $this->call('PositionsSeeder'); 
     $this->call('UsersSeeder'); 
     $this->call('PostsSeeder'); 
    } 
} 

我的問題是:我可以做這樣的symfony的?

我看到一個解決方案。我可以用此代碼製作BaseFixture:

class LoadBrandData extends AbstractFixture 
{ 
    public function load(ObjectManager $manager) 
    { 
     (new LoadPositionsData())->load(manager); 
     (new LoadUsersData())->load(manager); 
     (new LoadPostsData())->load(manager); 

    } 
} 

但是也許我可以做得更好。我可以嗎?

+0

我也建議檢查https://github.com/nelmio/alice。由於更簡單的API和速度,我更喜歡它。當然取決於你的工作流程,以此爲靈感。 Symfony集成通過:https://github.com/hautelook/AliceBundle/ –

回答

4

即使您不喜歡它,最好的方法是通過getOrder()方法。

說了這麼多,至少有兩個技巧可以用來設置順序在其他的方式:

  • 定義在一個單一文件中的所有燈具。如果你沒有定義很多固定裝置,它纔有意義。
  • 定義一個單一目錄中的所有燈具,並將加載順序作爲文件名的一部分(它們按字母順序裝入)。這隻有在您遵循單包方法來開發Symfony應用程序時纔有效。
1

這就是我所做的。

創建一個將存儲加載順序的類。

<?php 

namespace AppBundle\DataFixtures; 

use AppBundle\DataFixtures\ORM\LoadClientData; 
use AppBundle\DataFixtures\ORM\LoadRoleData; 
use AppBundle\DataFixtures\ORM\LoadUserData; 

class Order 
{ 
    const FIXTURES = [ 
     LoadRoleData::class, 
     LoadUserData::class, 
     LoadClientData::class, 
    ]; 
} 

然後,在你的抽象夾具類(將所有其他附着物被繼承的一個),創建以下方法:

/** 
    * @return int 
    * @throws \Exception 
    */ 
    public function getOrder() 
    { 
     $order = array_search(get_called_class(), Order::FIXTURES); 

     if ($order === false) { 
      throw new \Exception('Seems like you forgot to put things in Order'); 
     } 

     return $order; 
    } 

你不應該直接從夾具調用getOrder方法本身。

+0

應該指出,它適用於PHP5.6 +。 – paskl