2016-08-30 4 views
1

新しいSyliusバージョン(1.0)でいくつかのエンティティを作成しようとしています。Sylius - 新しいエンティティでSlugableとTimestampableを実装する

私は自分のドキュメントを読んでいますが、少し怒っています。

新しいエンティティBook.phpを取得しました。

このエンティティは、三つのフィールド、著者タイトルコンテンツを得ました。

このエンティティでSlugableとTimestampableを使用して、アノテーションを使用してこのエンティティに2つの新しいフィールドを作成するにはどうすればよいですか?

私は、SlugableとTimestampableインターフェイスを拡張したInterface BookInterface.phpを作成しようとしていますが、明らかにDoctrineはインターフェイスのフィールドをマッピングしません。 Gedmo実体形質を使用

はBook.php

<?php 

namespace Acme\SyliusBookBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Sylius\Component\Resource\Model\ResourceInterface; 
use Gedmo\Mapping\Annotation as Gedmo; 

/** 
* Book 
* 
* @ORM\Table(name="book") 
* @ORM\Entity(repositoryClass="App\SyliusBookBundle\Repository\BookRepository") 
*/ 
class Book implements ResourceInterface 
{ 
    public function __construct() 
    { 
     $this->createdAt = new \DateTime(); 
    } 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var int 
    * 
    * @ORM\ManyToOne(targetEntity="Sylius\Component\User\Model\User") 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    */ 
    private $author; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="content", type="text") 
    */ 
    private $content; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="title", type="string", length=255) 
    */ 
    private $title; 

解決しよう

完璧に動作します。

Gedmo\Timestampable\Traits\TimestampableEntity;

その後、あなたのエンティティクラスにそれを使用する:

class Post implements ResourceInterface 
{ 
    use TimestampableEntity; 
+0

私はシリウスを知りませんが、 '/ ** @var \ DateTime @Gedmo \ Timestampable(on =" update ")... */private $ updated;' for timestamp 、および '/ ** @var string @Gedmo \ Slug(fields = {" name "})... */private $ slug;' slug? – lolmx

+0

あなたのお返事ありがとうございます@lolmxしかし、私はSyliusとの良いプラクティスを学ぼうとしています:) –

答えて

0

Component/Product/Model/Productをチェックし、それはTimestampableTraitを使用し、それが(ProductInterface経由)SlugAwareInterfaceを使用しています。これらのインターフェイスはComponent/Resource/Model/フォルダに格納されます

したがって、特性を使用してSlugAwareInterfaceを拡張します。次に、必要なスラッグ機能を追加します。 getSlug() setSlug()

Interface ProductInterface extends 
    AttributeSubjectInterface, 
    SlugAwareInterface, 
    TimestampableInterface, 
    ToggleableInterface, 
    ProductTranslationInterface, 
    AssociableInterface, 
    CodeAwareInterface, 
    TranslatableInterface, 
    VariableInterface 
{ 
+0

はい、私はそれを見ましたが、Syliusはtimestampabletraitを使用してXMLのこれらのフィールドをマッピングし、annotationsのcreatedAtとupdatedAtフィールドをマップする –

+0

あなたの質問に対するコメントは、注釈を使用する正解であると思います。 XMLバージョンが使用する<フィールド名= "createdAt" 欄= "のcreated_at" タイプ= "日時"> : <フィールド名= "updatedAt" 欄= "updated_atの" Brett

+0

はい、注釈のために、私はクラス変数を再定義する必要があります:> Entity \ PostとGedmo \ Timestampable \ Traits \ Timestampableは、Entity \ Bookの構成で同じプロパティ($ createdAt)を定義します。しかし、定義が異なり、互換性がないと考えられています –

1

私はあなたがSyliusからTimestampableTraitと注釈を混在させることはできないと思います。はるかに簡単な解決方法は、あなた自身の特性を定義するか、Gedmoが提供するものを使用することです。

とにかく、なぜアノテーションとコードを混在させたいのですか? xml/yamlファイル内のマッピングを保持すると、ロジックが分割され、コードが分かりやすくなります。エンティティ内でデータベースマッピングを維持することは、単一責任原則(SOLID Principles)にも違反します。

ここにはsome reading about itがあります。

PS。あなたの問題を解決したら、私はそれを書いていました。私はちょうどここにそれを残すだろう、誰かが有用なリンクを見つけるかもしれない。

関連する問題