我正在尝试使用AJAX自动完成功能构建动态文本字段。
我在控制器中定义了一个用于AJAX调用的方法。
public function cityAction(Request $request)
{
$repository = $this->getDoctrine()
->getRepository('UserCityBundle:District');
$items = $repository->findAll();
// $format = $request->getRequestFormat();
// \Doctrine\Common\Util\Debug::dump($items);
return $this->render('CommonAjaxBundle:Default:index.html.twig', array('data' => array(
'success' => true,
'root' => 'district',
'count' => sizeof($items),
'rows' => $items
)));
}
进入树枝文件:
{{ data | json_encode | raw }}
我从一个如何在Symfony2中调用ajax的例子中得到了这个。 它应该打印我的区实体存储库的json编码,但我得到了这个结果:
{"success":true,"root":"district","count":6,"rows":[{},{},{},{},{},{}]}
为什么它不打印括号之间的字段?
答案 0 :(得分:3)
您可以通过序列化程序组件的序列来序列化您的实体(请参阅http://symfony.com/doc/current/components/serializer.html)。
要序列化您的实体,您可以使用上面链接中描述的 GetSetMethodNormalizer 类,也可以创建一个规范化器并将其声明为标记为 serializer.normalizer的新服务在您的软件包的服务定义文件中( Resource / config / service.yml ,如果您使用yaml配置)。
parameters:
common_ajax_bundle.district.normalizer.class: Full\Path\To\Your\normalizer\Class
common_ajax_bundle.district.normalizer:
class: '%common_ajax_bundle.district.normalizer.class%'
tags:
- { name: serializer.normalizer }
normalizer类可以扩展Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer
类。通过方法$this->setIgnoredAttributes(array(/* the fields to ignore */))
将所有字段放在构造函数中,或者您可以从头创建它,只需要实现Symfony\Component\Serializer\Normalizer\NormalizerInterface
接口。
然后在你的控制器中:
public function cityAction(Request $request)
{
$repository = $this->getDoctrine()
->getRepository('UserCityBundle:District');
$items = $repository->findAll();
$serializer = $this->container->get('serializer');
// serialize all of your entities
$serializedCities = array();
foreach ($items as $city) {
$serializedCities[] = $serializer->normalize($city, 'json');
}
return new JsonResponse(array(
'success' => true,
'root' => 'district',
'count' => sizeof($items),
'rows' => $serializedCities
));
}
答案 1 :(得分:1)
来自实体的数据是私有的,因此无法从json_encode访问。您必须使用序列化程序。很多人建议使用JMSSerializerBundle。您还可以使用以下代码:
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
$serializer = new Serializer(array(new GetSetMethodNormalizer()), array('json' => new
JsonEncoder()));
$json = $serializer->serialize($entity, 'json');
就我而言,我构建了一个twig函数,以便返回有限数量的数据(也可以重命名键属性):
namespace Company\EgBundle\Services;
class TwigExtension extends \Twig_Extension
{
public function getFilters()
{
return array(
new \Twig_SimpleFilter('encode_entity', array($this, 'encodeEntity')),
);
}
public function encodeEntity($entity, $filter = null)
{
$data = [];
$methods = get_class_methods($entity);
if ($filter) {
$methods = array_intersect($methods, array_keys($filter));
}
foreach ($methods as $method) {
if (strpos($method, 'get') === 0) {
$value = $entity;
while(is_object($value)) {
$value = $value->$method();
}
$key = $filter ? $filter[$method] : substr($method, 3);
$data[$key] = $value;
}
}
return json_encode($data);
}
}
要在模板中使用此功能,请执行以下操作:
{{ row|encode_entity({'getProductName': 'name', 'getIdIsoCry': 'currency'}) }}