我在symfony项目中更新了作曲家,我无法继续使用我的自定义“SecurityRolesType”。
有想法更新吗?以下,代码和错误。
错误:注意:数组到字符串转换500内部服务器错误 - ContextErrorException
这里是一个堆栈屏幕截图http://s11.postimg.org/j6nlup4ar/screencapture_stack.jpg
此处捕获呈现的HTML http://s17.postimg.org/l6mmskmof/Screen_Shot_2015_09_28_at_10_41_19_PM.png
<?php
namespace MYP\UserBundle\Form\Type;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormView;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\OptionsResolver\Options;
use Sonata\AdminBundle\Admin\Pool;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
class SecurityRolesType extends ChoiceType
{
protected $pool;
/**
* @param Pool $pool
*/
public function __construct(Pool $pool)
{
parent::__construct();
$this->pool = $pool;
}
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
}
/**
* {@inheritdoc}
*/
public function buildView(FormView $view, FormInterface $form, array $options)
{
parent::buildView($view, $form, $options);
$attr = $view->vars['attr'];
if (isset($attr['class']) && empty($attr['class'])) {
$attr['class'] = 'sonata-medium';
}
$view->vars['attr'] = $attr;
$view->vars['read_only_choices'] = $options['read_only_choices'];
//$view->vars['full_name'] = substr($view->vars['full_name'], 0, -2);
}
/**
* {@inheritdoc}
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
parent::setDefaultOptions($resolver);
$roles = array();
$rolesReadOnly = array();
$securityContext = $this->pool->getContainer()->get('security.context');
// get roles from the Admin classes
foreach ($this->pool->getAdminServiceIds() as $id) {
try {
$admin = $this->pool->getInstance($id);
} catch (\Exception $e) {
continue;
}
$isMaster = $admin->isGranted('MASTER');
$securityHandler = $admin->getSecurityHandler();
// TODO get the base role from the admin or security handler
$baseRole = $securityHandler->getBaseRole($admin);
foreach ($admin->getSecurityInformation() as $role => $permissions) {
$role = sprintf($baseRole, $role);
if ($isMaster) {
// if the user has the MASTER permission, allow to grant access the admin roles to other users
$roles[$role] = $role;
} elseif ($securityContext->isGranted($role)) {
// although the user has no MASTER permission, allow the currently logged in user to view the role
$rolesReadOnly[$role] = $role;
}
}
}
// get roles from the service container
foreach ($this->pool->getContainer()->getParameter('security.role_hierarchy.roles') as $name => $rolesHierarchy) {
if ($securityContext->isGranted($name)) {
$roles[$name] = $name . ': ' . implode(', ', $rolesHierarchy);
foreach ($rolesHierarchy as $role) {
if (!isset($roles[$role])) {
$roles[$role] = $role;
}
}
}
}
$resolver->setDefaults(array(
'choices' => function (Options $options, $parentChoices) use ($roles) {
return empty($parentChoices) ? $roles : array();
},
'read_only_choices' => function (Options $options) use ($rolesReadOnly) {
return empty($options['choices']) ? $rolesReadOnly : array();
},
'data_class' => null,
//'expanded' => true
));
}
/**
* {@inheritdoc}
*/
public function getParent()
{
return 'choice';
}
/**
* {@inheritdoc}
*/
public function getName()
{
return 'myp_security_roles';
}
}
答案 0 :(得分:1)
最后,您可以看到注释的修复程序在删除一些缓存后正在运行。
$view->vars['full_name'] = substr($view->vars['full_name'], 0, -2);