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