2016-03-10 37 views
0

在symfony項目,我有這樣的映射塞與數據庫條目

/resource/{id} 

網址模式,我可以使用symfony webiste給出這個文檔轉換爲sluggified網址爲

/resource/{slug} 

但是,我不知道如何將這個{slug}映射到數據庫中的記錄。除了在實體類中創建一個slug變量並在數據庫中存儲一個變量,然後使用該屬性檢索記錄之外,是否有任何標準方法來執行此操作?

UPDATE

我不知道怎麼的symfony從數據庫中檢索數據。我的觀點動作如下。

/** 
* Finds and displays a Resource entity. 
* 
* @Route("/{slug}", name="resource_show") 
* @Method("GET") 
*/ 
public function showAction(Resource $resource) 
{ 
    $deleteForm = $this->createDeleteForm($resource); 
    return $this->render('resource/show.html.twig', array(
     'resource' => $resource, 
     'delete_form' => $deleteForm->createView(), 
    )); 
} 

我只是在控制器更換idslugResourceEntity進行正確修改後。現在的symfony使用slug自動檢索從數據庫信息,並將其傳遞給showAction方法..

回答

2

你提到什麼是正確的, 你應該產生從String一個獨特的彈頭(例如:職位名稱),其存儲在數據庫,並通過彈頭找到實體

例子:

$obj = $repository->findOneBySlug('test-post'); 

如果你想創建彈頭簡單,使用經過充分測試的庫的過程中,你可以使用Sluggable behavior extension for Doctrine.

+0

什麼是你的代碼段中的findBySlug?它是由symfony自動生成的東西嗎?還是要創建一個自定義的方法? – niyasc

+0

@niyasc Doctrine提供了findOneBy *()findBy *(),您可以用有效的屬性(列名)替換* – Vamsi

1

您只需使用Synmfony ParameterConvereter即可。

這是怎麼shold樣子:

比方說你有一個User實體。請注意0​​字段。

/** 
* Class User 
* 
* @package AppBundle\Entity 
* 
* @ORM\Entity 
* @Gedmo\Loggable 
*/ 
class User extends BaseUser implements Translatable 
{ 
    /** 
    * @var $id 
    * 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="UUID") 
    * @ORM\Column(type="guid") 
    * 
    */ 
    protected $id; 

    /** 
    * @var 
    * @Gedmo\Translatable 
    * @Gedmo\Versioned 
    * @ORM\Column(type="string")) 
    */ 
    protected $username; 
    /** 
    * @var 
    * 
    * @ORM\Column(type="string")) 
    */ 
    protected $firstName; 

    /** 
    * @var 
    * 
    * @ORM\Column(type="string")) 
    */ 
    protected $lastName; 

    /** 
    * @Gedmo\Slug(fields={"firstName"}, style="camel", updatable=false, separator="-") 
    * @ORM\Column(length=128, unique=true) 
    */ 
    private $slug; 

    /** 
    * @Gedmo\Locale 
    * Used locale to override Translation listener`s locale 
    * this is not a mapped field of entity metadata, just a simple property 
    */ 
    private $locale; 

// ... 

因此,在路由而不是有id,你將有用戶的名字。

然後在控制所有你需要做的是這樣的:

/** 
    * @param User $user 
    * @param Request $request 
    * 
    * @return array 
    * 
    * @Route(path="/edit/{slug}", name="trans_edit") 
    * @ParamConverter("user", class="AppBundle:User", options={"slug" = "slug"}) 

    * @Template() 
    */ 
    public function editAction(User $user, Request $request) 
    { 
     dump($user); 
    } 

// ... 

彈頭自動轉換成User對象。無需手動調用DB,ParameterConvereter會自動爲您執行。