2013-09-02 2 views
0

Прежде всего, я все еще учусь, поэтому не сердитесь на меня за задание этого вопроса (и для моего английского - я стараюсь изо всех сил).В 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

ответ

0

маршрутизация Symfony будет пытаться соответствовать первому маршруту соответствия нашли ... в вашем случае аннотаций маршруты другого контроллера настроены до/выше тех FOSUserBundle в ... Поэтому Symfony будет первым пытаться соответствовать /{id}/login, а затем ,

только переместите маршруты FOSUserBundle до вашего другого маршрута контроллера в вашей конфигурации, чтобы исправить эту проблему.

+0

Спасибо за ответ, у вас есть точка. Я знал, что порядок маршрутов важен , но я думал, что это касается только раздела «acces_control» раздела security.yml. Я внес изменения в routing.yml , и теперь «my_backend» после «fos_user_security». Появляется экран входа в систему, но, к сожалению, после входа в систему у меня есть исключение «Acces Denied». huh – mu4ddi3

+0

Вы могли решить проблему с доступом? – nifr