2015-01-29 3 views
1

Моего routes.php отрывок:Laravel конфликтующих маршруты

Route::group(['prefix' => 'admin', 'namespace' => 'Admin'], function() { 

    Route::resource('posts', 'PostsController', [ 
     'except' => ['show'] 
    ]); 

    Route::delete('posts/trash', [ 
     'as' => 'posts.trash.empty', 
     'uses' => '[email protected]' 
    ]); 

}); 

Моего PostsController.php отрывок:

/** 
* DELETE /admin/posts/{id} 
*/ 
public function destroy($id) 
{ 
    // code 
} 

/** 
* DELETE /admin/posts/trash 
*/ 
public function emptyTrash() 
{ 
    // code 
} 

Проблема заключается в том, что Laravel путает 'мусор' строку в DELETE /admin/posts/trash запросе в качестве {id} параметра. Как следствие, вместо emptyTrash() вызывается метод destroy(). Почему и что я могу сделать для этого?

+0

Попробуйте изменить порядок ваших маршрутов. Поместите 'Route :: delete ('posts/trash ...' before 'Route :: resource ...' – lukasgeiter

+0

Да, это работает. Но я хочу знать, почему и на самом деле лучший способ сделать это, чем просто полагаться на заказ. Может быть, привязка модели или проверка {id}, чтобы быть int? Сделайте полный ответ, чтобы принять его. –

ответ

5

Во-первых, вопросы порядка. Laravel будет искать маршруты для матча в том порядке, в котором вы их регистрируете. Как вы поняли, Laravel примет trash как идентификатор, и поэтому URI соответствует ресурсному маршруту. Поскольку этот маршрут зарегистрирован до вашего дополнительного, он будет использовать маршрут ресурса.

Самым простым способом исправить это просто изменить этот порядок:

Route::delete('posts/trash', [ 
    'as' => 'posts.trash.empty', 
    'uses' => '[email protected]' 
]); 

Route::resource('posts', 'PostsController', [ 
    'except' => ['show'] 
]); 

Если вам не нравится, что вы можете попытаться ограничить параметр для вашего ресурса пути к только цифры. К сожалению, вы не можете просто добавить ->where() в маршрут ресурса, как вы могли бы с другими.

Вместо этого вы должны определить global pattern для параметра маршрута. Параметр маршрута Route::resource выбирает имя ресурса (в snake_case).

Так это должно работать для вас:

Route::pattern('posts', '[0-9]+'); 
+0

Это здорово, порядок имеет значение в Laravel '5.4'. –

0

Где-то на ваш взгляд, у вас должна быть кнопка или ссылка для фактического удаления сообщения. Вид должен выглядеть следующим образом:

@section('content') 
<div class="panel panel-default"> 
    <div class="panel-heading clearfix"> 
     <b>{{ $post->post_name . ' (id:' . $post->post_id . ')' }}</b><br /> 
     <b> {{ link_to_route('overview', 'Go Back To Post List') }} </b> 
     <div class="pull-right"> 
      // FORM FOR DELETING POST 
      {{ Form::open(array('route' => array('delete_post', $post->post_id))) }} 
       {{ link_to_route('edit_post', 'Edit Post', array('id' => $post->post_id), array('class' => 'post_img_button_edit')) }} 
       {{ Form::hidden('_method', 'DELETE') }} 
       {{ Form::submit('Delete Post', array('class' => 'post_img_button_delete')) }} 
      {{ Form::close() }} 
     </div> 

     <div class="pull-right"> 
      // FORM FOR EMPTYING TRASH 
      {{ Form::open(array('route' => 'empty_trash')) }} 
       {{ Form::hidden('_method', 'DELETE') }} 
       {{ Form::submit('Empty Trash', array('class' => 'post_img_button_delete')) }} 
      {{ Form::close() }} 
     </div> 

    </div> 

/* Additional HTML code within view */ 

Ваш контроллер должен быть похож на это:

public function destroy($id) 
{ 
    $this->post->delete($id); 
    return \Redirect::route('overview'); 
} 

public function emptyTrash() 
{ 
    // code for collecting and emptying Trash 
} 

И ваши маршруты должны выглядеть примерно так:

Route::delete('admin_posts/admin_posts/{id}/destroy', array('as'=>'delete_post', 'uses'=>'[email protected]')); 

Route::delete('posts/trash', array('as'=>'empty_trash', 'uses'=>'[email protected]')); 

Название вашего путь на самом деле удаление сообщений be 'delete_post'.

Название вашего маршрута для опорожнения вашего мусора будет empty_trash

В основном вы явно задать ваши маршруты так, что вы будете избегать меньше двусмысленности и Laravel будет знать, какие маршруты принять. Надеюсь, эта информация поможет!

+0

Я уже пытался изменить имя маршрута и установить свою форму следующим образом: '{!! Form :: open ([ 'method' => 'DELETE', 'route' => 'delete_post']) !!} 'без успеха. –

+0

@AntonisGr Хорошо, дай мне несколько минут. Я отредактирую свой ответ выше с более подробным объяснением. –

+0

спасибо, но это не проблема. См. Другой ответ. Это порядок маршрутов, который является проблематичным! –

Смежные вопросы