0

まず第一に、私はまだ学習中なので、この質問をしたことで怒ってはいけません (そして私の英語についても - 私は最善を尽くしています)。

私は Symfony 2.0.10 用に書かれた本のチュートリアルを読んでいますが、各演習では最新の Symfony 2.3.4 プロジェクトを使用しています。

問題は、FOSUserBundle と CRUD パネルを使用して、「ログインしたユーザーのみがアクセスできるアプリを作成する」ことが演習のポイントであるということです。(登録など不要なものは一切なし)

チュートリアルと同様に、バンドル (My/BackendBundle) を作成し、そのコントローラーとビューを削除してから、MyBackendBundle:Mountain というエンティティを作成し、db にデータを入力しました。次に、以前に作成したエンティティの CRUD パネルを作成したので、新しいコントローラーがすべての「表示」、「新規」、「編集」などのメソッドとともに表示されます。重要なことは、生成されたコントローラー クラス ("MyBackendBundle:Mountain" エンティティのために MountainController という名前が付けられている) は、クラスの前に次の @Routing アノテーションを持っていることです。

/**
 * Mountain controller.
 * 
 * @Route("/mountain")
 */
class MountainController extends Controller
{
...

しかし、チュートリアルでは、Project/web/mountain の代わりに単に Project/web/ address を使用するために、この注釈を削除するように指示されました。だから私はしました。

次に、管理者アカウントを作成して、routing.yml を次のように変更します。

ルーティング.yml

my_backend:
    resource: "@MyBackendBundle/Controller/"
    type:     annotation
    prefix:   /

fos_user_security:
    resource: "@FOSUserBundle/Resources/config/routing/security.xml"

tut の次のステップは、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 }

次のステップでは、base.html.twig にログアウト リンクを追加し、ログイン ページを上書きしようとしていますが、問題はすでに始まっているため、おそらく問題にはなりません。アプリを実行しようとすると、Mountain エンティティが見つかりません。例外。これは、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(),
        );
    }

「/login」であるsecurity.ymlの「login_path」が適合するため、CRUDによって生成される@Route("/{id}", name="mountain_show")アノテーションと関係があるとほぼ確信していますshowAction の @Route パターンに。そのため、表示するレコードの ID (数値である必要があります) を取得する代わりに、テキストを受け取るか、何がわからないかを確認し、否定的な結果で ID を見つけようとします。

Ps。チュートリアル (Symfony 2.0.10) の例は、CRUD によって生成された "showAction" に route: が含まれているため動作しますが、 @Route("/{id}/show", name="mountain_show") これは競合ではありません。

だから、これで私を助けることができる人がいれば、私は非常に感謝しています.

私の問題をよりよく説明するために提供できる情報がさらにある場合は、ただ言ってください。よろしく。KB

4

1 に答える 1