【问题标题】:Need slug field value as JDoe (for John Doe) in doctrine在学说中需要 slug 字段值作为 JDoe(对于 John Doe)
【发布时间】:2018-11-06 12:02:30
【问题描述】:

如何将 slug 字段设置为 JDoe(J-First char of first name, Doe - full last name);

/**
 * @var string
 *
 * @Gedmo\Slug(fields={"firstName", "lastName"}, separator="??")
 * @ORM\Column(name="slug", type="string", length=20, unique=true)
 */

谢谢!

【问题讨论】:

  • 我从未使用过任何 Gedmo 扩展,但如果您需要处理一个或多个字段(我不确定,但查看文档似乎无法使用内置在处理程序注释选项中)我认为更简单的方法是创建一个像fullNameSlug 这样的新参数并在setFullNameSlug() 内部(或在服务外部)你可以创建你想要的然后需要将该参数分配给@Gedmo\Slug 注释。
  • 如果你只想使用Gedmo,文档中有一些有趣的东西叫做handlersgithub.com/Atlantic18/DoctrineExtensions/blob/master/doc/…。否则,您也可以由教义听众来完成此操作
  • 我认为你应该考虑 trix's answer的第三种方法

标签: symfony doctrine-orm slug


【解决方案1】:

方法一

我没有尝试过以下,但它可能是您正在寻找的sn-p。尝试一下,让我知道它是否有效:

class SomeEntity
{
    /**
     * @var string
     *
     * @Gedmo\Slug(fields={"getFirstNameSlugged", "lastName"}, separator="??")
     * @ORM\Column(name="slug", type="string", length=20, unique=true)
     */
    private $slug;

    private function getFirstNameFirstLetter()
    {
        return substr ($this->firstName, 0 , 1);
    }

    private function getFirstNameSlugged()
    {
        return ucfirst (getFirstNameFirstLetter());
    }

}

方法二

在您的实体中使用setSlug() 方法:

class SomeEntity
{
    const SEPERATOR = '??';

    /**
     * @var string
     *
     * @Gedmo\Slug(fields={"firstName", "lastName"}, separator="??")
     * @ORM\Column(name="slug", type="string", length=20, unique=true)
     */
    private $slug;

    private function getFirstNameFirstLetter()
    {
        return substr ($this->firstName, 0 , 1);
    }

    private function getFirstNameSlugged()
    {
        return ucfirst (getFirstNameFirstLetter());
    }

    private function getLastNameSlugged()
    {
        return ucfirst ($this->getLastName());
    }

    public function setSlug()
    {
        $this->slug = $this->getFirstNameSlugged() . self::SEPERATOR . $this->getLastNameSlugged();

        return $this->slug;
    }
}

在您的控制器中:

$entity = new SomeEntity;
$entity->setSlug();

$em->persist($entity);
$em->flush();

方法3

在您的 Entity 中,创建一个方法并将其设置在您的 Controller 中:

class SomeEntity
{
    /**
     * @var string
     *
     * @Gedmo\Slug(fields={"firstName", "lastName"}, separator="??")
     * @ORM\Column(name="slug", type="string", length=20, unique=true)
     */
    private $slug;

    private function getFirstNameFirstLetter()
    {
        return substr ($this->firstName, 0 , 1);
    }

    private function getFirstNameSlugged()
    {
        return ucfirst (getFirstNameFirstLetter());
    }

    private function getLastNameSlugged()
    {
        return ucfirst ($this->getLastName());
    }

    public generateSlug()
    {
        $slug = $this->getFirstNameSlugged() . self::SEPERATOR . $this->getLastNameSlugged();

        return $slug;
    } 
}

在您的控制器中:

$entity = new SomeEntity;

$callable = array('AppBundle\Entity\SomeEntity', 'generateSlug');
$sluggableListener = new \Gedmo\Sluggable\SluggableListener();
$sluggableListener->setTransliterator($callable);

$em->persist($entity);
$em->flush();

【讨论】:

    猜你喜欢
    • 2015-08-14
    • 2021-10-03
    • 2020-11-21
    • 2013-09-04
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多