Explicando: você "NÃO TEM" como ter acesso ao container no Model. Se quiser encontrar um meio de fazer isto, estará fazendo do modo "errado".
O caminho "certo" é: crie uma classe que receba no construtor o Container, o Doctrine ou qualquer outro serviço que precisar, e como parâmetro opcional (setter) o objeto que você quer validar na regra de negócio.
<?php
namespace MeuNamespace\MeuBundle\Regras;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManager;
use MeuNamespace\MeuBundle\Entity\Cadastro;
class MinhaRegra
{
/** @var ContainerInterface $container */
private $container;
/** @var EntityManager $dm */
private $dm;
/** @var Request $request */
private $request;
/** @var Cadastro $cadastro */
private $cadastro;
/**
* @param ContainerInterface $container
*/
public function __construct(ContainerInterface $container, Request $request)
{
$this->container = $container;
$this->request = $request;
$this->dm = $this->container->get('doctrine.orm.entity_manager');
}
public function setCadastro(Cadastro $cadastro)
{
$this->cadastro = $cadastro;
return $this;
}
public function valida()
{
// seu código
return true; // ou false
}
}
E você pode usar o código assim no seu controler (ou em qualquer lugar que tenha acesso ao Container):
$regra = $this->container->get('minha.regra.negocio');
// (...) aqui qualquer código para pegar Cadastro = $cadastro
if ($regra->($cadastro)->valida()) {
// Passou na regra
} else {
// Opa, não passou!
}
Obviamente que está muito genérico. Passar o container é interessante porque tens acesso a QUALQUER serviço, mas o IDEAL é passar o serviço que realmente necessitas para deixar mais consistente. E fiz o exemplo genérico, mas o ideal é usar @doctrine, @mailer, etc.
É o caminho adequado para transformar uma Entity baseada em dados de outra com a qual ela não tem relacionamento (onde você precisaria fazer uma consulta na classe da Entity, coisa possível no SF 1.x mas inadequada e "impossível" no SF2).arguments
Use o app/console container:debug para saber que classe precisa colocar no "use" e o nome do serviço para colocar em "arguments".
[]'s
Rafael