1

在 Symfony2 中,当我运行命令时,bin/vendors install我收到以下消息:

?? src/Symfony/Component/Validator/Constraints/Alphanumeric.php
?? src/Symfony/Component/Validator/Constraints/AlphanumericValidator.php
?? src/Symfony/Component/Validator/Constraints/GreaterThan.php
?? src/Symfony/Component/Validator/Constraints/GreaterThanValidator.php
"symfony" has local modifications. Please revert or commit/push them before running this command again.

列出的文件是我按照此处的说明书条目创建的自定义约束验证器。

有没有办法更新 deps 文件而忽略我所做的更改?我的目标是安装一个新包,同时保留我创建的约束验证器文件。

更新:彼得的解决方案是正确的,唯一剩下的就是在实体中“使用”正确的命名空间,如下所示:

(代码中有西班牙语单词,我再次假设我在 DemoBundle 中只是为了保持一致性)

namespace Acme\DemoBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Acme\DemoBundle\Component\Validator\Constraints as CustomAssert;

/**
 * @ORM\Entity
 */
class Employee
{
    //...

    /**
     * @ORM\Column(type="string", length=20)
     * @Assert\NotBlank()
     * @CustomAssert\Alphanumeric()
     */
    protected $alfanum;

    //...
}
4

3 回答 3

3

您永远不应更改供应商目录中包含的任何内容。如果您有新功能要添加(并且您总是必须添加),请将这些功能放在您的应用程序特定的捆绑包中(在 src 目录中)。

您的命名空间/类方案应遵循框架约定。例如,您的约束验证器应该进入“src/MyNamespace/MyBundle/Validator/Constraint”(并且您的命名空间应该是“MyNamespace\MyBundle\Validator\Constraint”)。

请注意,您的版本管理器应该忽略供应商目录。

于 2012-05-10T19:14:47.150 回答
2

不,不要这样做。您编写的自定义验证器(或自定义任何东西)应该是命名空间的一部分,而不是 Symfony 的。而且它们当然根本不应该是供应商目录(除非您编写自己的供应商)。这是命名空间和供应商管理的重点——避免冲突!

因此,您需要将自定义验证器移动到应用程序的源代码中。以 AcmeDemoBundle 为例...

为以下路径创建目录

src/Acme/DemoBundle/Component/Validator/Constraints

然后您的自定义验证器移动到此文件夹中。然后相应地更新每个验证器类的命名空间

namespace Acme\DemoBundle\Component\Validator\Constraints

干杯

于 2012-05-10T19:25:15.757 回答
2

您可以将自定义验证器放在自己的包中,并以下列方式引用它,

# in validation.yml

# define namespace identifier
namespaces:
  namespace_name: Path\To\Your\Validator\Namespace\

# then in your entity
FQCN\Of\Entity:
  constraints:
    - Path\To\Your\Validator\Namespace\Alphanumeric
    # or
    - "namespace_name:Alphanumeric": ~ 
于 2012-05-10T19:37:29.480 回答