2015-01-13 3 views
1

저는 이전 웹 사이트 코드를 새로운 Symfony2.6에 "이식"합니다. 컨트롤러를 사용하여 양식을 렌더링하고 블로그에서 게시물을 만듭니다. 그런 다음 유효하면 두 번째 컨트롤러에 제출됩니다 (POST 메서드). 컨트롤러를 초기화하기 위해 라우트를 호출 할 때 무시할 수있는 이유가 있지만 ShowAction ($ slug)을 호출하기도합니다. 포스트가 생성되지 않았기 때문에 실패하기 때문에 $ slug 매개 변수가 없습니다. 왜이 쇼 액션을 부르는거야? 그럼에도 불구하고 양식을 표시하는 url을 입력했습니다. 나는 ShowAction를 호출하지 않으Symfony2 포스트 콜을 만들기 ShowAction

1. in src/Blog/BlogBundle/Services/PostManager.php at line 80 
2. at PostManager ->findBySlug ('create_post') in src/Blog/BlogBundle/Controller PostController.php at line 55 
3. at PostController ->ShowAction ('create_post') 
4. at call_user_func_array (array(object(PostController), 'ShowAction'), array('create_post')) in app/bootstrap.php.cache at line 3020 

: 여기

는 실패를 시작하는 줄에서 오류 로그입니다. 여기

컨트롤러 코드 :

/** 
    * Show a Post 
    * 
* @param string $slug 
* 
* @throws NotFoundHttpException 
* @return array 
* 
* @Route("/{slug}") 
* @Template() 
*/ 
public function ShowAction($slug) 
{ 
    $post = $this->getPostManager()->findBySlug($slug); 
    $form_comment = $this->createForm(new CommentType()); 

    return array(
     'post' => $post, 
     'form_comment' => $form_comment->createView() 
    ); 
} 

/** 
* Displays a form to create a new Post entity. 
* 
* @Route("/new_post", name="_blog_backend_post_new") 
* @Template() 
*/ 
public function newAction() 
{ 
    $form = $this->createForm(new PostType(), new PostModel(new Post())); 

    return array(
     'form' => $form->createView(), 
    ); 
} 

/** 
* Creates a new Post entity. 
* 
* @Route("/create_post", name="_blog_backend_post_create") 
* @Method("POST") 
* @Template("BlogBundle:Backend/Post:new.html.twig") 
*/ 
public function createAction() 
{ 
    $request = $this->getRequest(); 
    $em = $this->getDoctrine()->getManager(); 

    $form = $this->createForm(new PostType(), new PostModel(new Post())); 
    $formHandler = new PostHandler($form, $request, new Post(), $em); 
    if ($formHandler->process()) { 
     return $this->redirect($this->generateUrl('_blog_backend_post')); 
    } 

    return array(
     'form' => $form->createView(), 
    ); 
} 

는 필요한 경우 나도 몰라하지만 여기에 관련 템플릿입니다
* @Template ("BlogBundle : 백엔드/우편 : new.html.twig") :

{% extends "::base.html.twig" %} 

{% block content %} 
    <form class="well" action="{{ url('_blog_backend_post_create') }}" method="post" {{ form_enctype(form) }}> 
     {% include 'BlogBundle:Backend/Post:edit.form.html.twig' with {'form': form } %} 
    </form> 
{% endblock %} 

BlogBundle : 백엔드/우편 : edit.form.html.twig :

{% if form_errors(form) %} 
<div class="alert alert-block alert-error fade in form-errors"> 
    {{ form_errors(form) }} 
</div> 
{% endif %} 
<p> 
<label for="">Title</label> 
{% if form_errors(form.title) %} 
<div class="alert alert-block alert-error fade in form-errors"> 
    {{ form_errors(form.title) }} 
</div> 
{% endif %} 
{{ form_widget(form.title, { 'attr': {'class': 'w100'} }) }} 
</p> 
<p> 
<label for="">Body</label> 
{% if form_errors(form.body) %} 
<div class="alert alert-block alert-error fade in form-errors"> 
    {{ form_errors(form.body) }} 
</div> 
{% endif %} 
{{ form_widget(form.body, { 'attr': {'class': 'w100'} }) }} 
</p> 
<p> 
<button class="btn" type="submit">Save</button> 
<a class="btn" href="{{ url('_blog_backend_post') }}">Cancel</a> 
</p> 
{{ form_rest(form) }} 

내가 누락 된 부분과 어떻게 해결할 수 있습니까? 미리 감사드립니다.

+0

헥타르 제출 한 후 그것을 과장하십시오? –

+0

나는 그것을 향상시키고 싶고 오래된 것들은이 경우에 유용하지 않다. 그러나 지금 사용하고있는 것들은 매우 똑같습니다. 그래서 생각하는 문제는 newAction뿐 아니라 showAction을 먼저 호출하는 컨트롤러 내입니다. – Garces

+0

새 작업 및 편집 작업을 모두 처리하는 단일 경로를 만듭니다. "$ slug"가 null 인 경우 새 객체를 만듭니다. 그렇지 않으면 현재 객체를 업데이트합니다. –

답변

2

라우터가 가능한 첫 번째 경로 (이 경우 "/ {slug}", 여기서 slug = "create_post")와 일치합니다.

가장 먼저 가장 쉬운 적어도 두 가지 해결책이 있습니다, 두 번째는 내가 추천 하나입니다

  • 잘라 내기/파일의 맨 아래에 showAction을 붙여,이 경우 라우터의 것 먼저 createAction에 일치/create_post

  • 당신은 제외 할 수 있습니다
  • 같은 : 당신은 또한 새/편집 양식과 동일한 기능을 사용하지 않는 이유는 @Route("/{slug}", requirements={"slug" = "^(?<!create_post).+"})

+0

오류는/create_post가 문제임을 나타냅니다. 그렇다면/new_post가 작동하는 이유는 무엇입니까? – Cerad

+0

그 이유는 내가 먼저 이것을 읽었 기 때문입니다. "양식을 표시하는 URL을 입력 했음에도 불구하고", 그리고 그것은 "new_post"입니다.하지만 고마워, 올바르게 바꿨다. –

+0

사용자가/new_post를 입력하면 어떻게 될 것이라고 생각하니? – Cerad

1

/create_post에 게시 중이며/{slug} 경로와 일치하는 것이 문제입니다. 슬러그가 'create_post'로 설정됩니다. Symfony 2 라우터를 사용하면 첫 번째 매치가이기므로 showAction 메서드가 호출됩니다.

ShowAction 경로를 '/ show/{slug}'로 설정하십시오.

또는 ShowAction을 컨트롤러 파일 맨 아래로 이동할 수 있습니다. 나중에 잊어서 다른 동작을 추가 할 수도 있기 때문에 다소 위험합니다. 그러나 어느 쪽이든 작동합니다.

관련 문제