Прежде всего, я все еще учусь, поэтому не сердитесь на меня за задание этого вопроса (и для моего английского - я стараюсь изо всех сил).В Symfony2 (v2.3.4) - FOSUserBundle конфликтует с маршрутом контроллера, генерируемым CRUD
Im, проходящий через учебное пособие, написанное для Symfony 2.0.10, но для каждого упражнения я использую новейший проект Symfony 2.3.4, решая в конечном итоге изменения (обучение таким образом) с хорошими результатами, но, наконец, m застрял.
Проблема в том, что целью является «сделать приложение, доступное только для зарегистрированных пользователей», используя панель FOSUserBundle и CRUD. (без регистрации и всего этого ненужного материала)
Как и в учебнике, я создал пакет (My/BackendBundle), удалил его контроллер и представления, а затем создал объект под названием MyBackendBundle: Mountain и заполнил db моими данными. Затем я создал панель CRUD для сущности, которую я создал ранее, поэтому новый контроллер отображает все эти «показательные», «новые» «редактируемые» и т. Д. Методы. важного является то, что создаваемый класс контроллера (который назван MountainController из-за «MyBackendBundle: Mountain» лица) имеет это @Routing аннотации перед классом:
/**
* Mountain controller.
*
* @Route("/mountain")
*/
class MountainController extends Controller
{
...
Но Tutorial приказал удалить эту аннотацию в порядке просто использовать Project/web/address вместо Project/web/mountain. так я и сделал.
Затем я создал и учетная запись администратора и изменить routing.yml на выглядит следующим образом:
routing.yml
my_backend:
resource: "@MyBackendBundle/Controller/"
type: annotation
prefix: /
fos_user_security:
resource: "@FOSUserBundle/Resources/config/routing/security.xml"
Следующий шаг ТПИ является изменение security.yml взорам, как это :
security.yml
security:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
#role_hierarchy:
# ROLE_ADMIN: ROLE_USER
# ROLE_SUPER_ADMIN: ROLE_ADMIN
providers:
fos_userbundle:
id: fos_user.user_provider.username
#id: fos_user.user_manager
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
# the user is redirected here when he/she needs to login
login_path: /login
# if true, forward the user to the login form instead of redirecting
use_forward: false
# submit the login form here
check_path: /login_check
# by default, the login form *must* be a POST, not a GET
post_only: true
#remember_me: false
# login success redirecting options (read further below)
always_use_default_target_path: false
default_target_path: /
target_path_parameter: _target_path
use_referer: false
# login failure redirecting options (read further below)
failure_path: null
failure_forward: false
# field names for the username and password fields
username_parameter: _username
password_parameter: _password
# csrf token options
csrf_parameter: _csrf_token
intention: authenticate
logout: true
anonymous: true
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, role: ROLE_ADMIN }
Следующие шаги собирается добавить logou t на base.html.twig и переопределить страницу входа, но это, вероятно, не имеет значения, поскольку проблемы уже начались. Когда я пытаюсь запустить мое приложение, у меня есть Невозможно найти объект горы. исключение. который указывает на эту функцию в MountainController:
/**
* Finds and displays a Mountain entity.
*
* @Route("/{id}", name="mountain_show")
* @Method("GET")
* @Template()
*/
public function showAction($id)
{
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('MyBackendBundle:Mountain')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find Mountain entity.');
}
$deleteForm = $this->createDeleteForm($id);
return array(
'entity' => $entity,
'delete_form' => $deleteForm->createView(),
);
}
Я почти уверен, что это что-то делать с @Route («/ {ID}», имя = «mountain_show») аннотаций, который генерируется CRUD, потому что «login_path» из security.yml, который является «/ login», подходит для шаблона @Route showAction. Таким образом, действие вместо того, чтобы показывать идентификатор записи (который должен быть числом), получает текст или я не знаю, что и пытается найти идентификатор с отрицательными результатами.
Ps. Пример из учебника (на Symfony 2.0.10) работает, потому что «showAction», сгенерированный CRUD, имеет маршрут: @Route("/{id}/show", name="mountain_show")
, который не является конфликтом.
Так что если есть кто-нибудь, кто может мне помочь, я буду очень благодарен.
Если есть больше информации, я могу дать, чтобы лучше объяснить мою проблему, просто скажите. С уважением.KB
Спасибо за ответ, у вас есть точка. Я знал, что порядок маршрутов важен , но я думал, что это касается только раздела «acces_control» раздела security.yml. Я внес изменения в routing.yml , и теперь «my_backend» после «fos_user_security». Появляется экран входа в систему, но, к сожалению, после входа в систему у меня есть исключение «Acces Denied». huh – mu4ddi3
Вы могли решить проблему с доступом? – nifr