2016-11-27 2 views
0

Я пытаюсь ознакомиться с рамкой Laravel. Я слежу за учебником и застрял на части с маршрутизацией. У меня есть простой проект блога, который пытается создать и отредактировать сообщение в блоге. У меня уже есть 2 других объекта CRUD-операции, которые работают корректно - 1 из них настраивается с ресурсом в маршрутах, как я пытаюсь сделать с этим. При попытке сделать пост на следующее:Laravel 5.2 Маршрут не работает при использовании ресурса для работы CRUD

<form class="form-horizontal" role="form" method="POST" 
         action="{{ route('admin.post.store') }}"> 

Я возвратил ошибку «Route [admin.post.store] не определен (Вид:./Дом/бродяга/Код/тест-DEV/ресурсы/views/admin/post/create.blade.php) «

Теперь я понимаю, что это проблема с тем, что он может найти хранимую процедуру, хранящуюся по умолчанию в базовом классе моего объекта post post. Я использовал мастеринг и миграцию для создания этих объектов и автоматически привязывал их к объектам БД. Post.php модель объекта размещены ниже:

<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class Post extends Model 
{ 
    protected $dates = ['published_at']; 
    protected $fillable = [ 
     'title', 'subtitle', 'content_raw', 'page_image', 'meta_description', 
     'layout', 'is_draft', 'published_at', 
    ]; 

    //// other methods here that help pass slug and do DB relationship support 
    //// If someone thinks they are relevant I can addthem 
} 

Вот файл web.php внутри папки "маршрутов":

Route::get('/', function() { 
    return redirect('/blog'); 
}); 

Route::get('blog', '[email protected]'); 
Route::get('blog/{slug}', '[email protected]'); 

// Admin area 
Route::get('admin', function() { 
    return redirect('/admin/post'); 
}); 
$router->group([ 
    'namespace' => 'Admin', 
    'middleware' => 'auth', 
], function() { 
    Route::resource('admin/post', 'PostController', ['except' => 'show']); 
    Route::resource('admin/tag', 'TagController', ['except' => 'show']); 
    Route::get('admin/upload', '[email protected]'); 
    Route::post('admin/upload/file', '[email protected]'); 
    Route::delete('admin/upload/file', '[email protected]'); 
    Route::post('admin/upload/folder', '[email protected]'); 
    Route::delete('admin/upload/folder', '[email protected]'); 
}); 

Auth::routes(); 

Route::get('/home', '[email protected]'); 

Вот PostController

<?php 
namespace App\Http\Controllers\Admin; 

use App\Jobs\PostFormFields; 
use App\Http\Requests; 
use App\Http\Requests\PostCreateRequest; 
use App\Http\Requests\PostUpdateRequest; 
use App\Http\Controllers\Controller; 
use App\Post; 

class PostController extends Controller 
{ 
/** 
* Display a listing of the posts. 
*/ 
public function index() 
{ 
    return view('admin.post.index') 
     ->withPosts(Post::all()); 
} 

/** 
* Show the new post form 
*/ 
public function create() 
{ 
    $data = $this->dispatch(new PostFormFields()); 

    return view('admin.post.create', $data); 
} 

/** 
* Store a newly created Post 
* 
* @param PostCreateRequest $request 
*/ 
public function store(PostCreateRequest $request) 
{ 
    $post = Post::create($request->postFillData()); 
    $post->syncTags($request->get('tags', [])); 

    return redirect() 
     ->route('admin.post.index') 
     ->withSuccess('New Post Successfully Created.'); 
} 

/** 
* Show the post edit form 
* 
* @param int $id 
* @return Response 
*/ 
public function edit($id) 
{ 
    $data = $this->dispatch(new PostFormFields($id)); 

    return view('admin.post.edit', $data); 
} 

/** 
* Update the Post 
* 
* @param PostUpdateRequest $request 
* @param int $id 
*/ 
public function update(PostUpdateRequest $request, $id) 
{ 
    $post = Post::findOrFail($id); 
    $post->fill($request->postFillData()); 
    $post->save(); 
    $post->syncTags($request->get('tags', [])); 

    if ($request->action === 'continue') { 
     return redirect() 
      ->back() 
      ->withSuccess('Post saved.'); 
    } 

    return redirect() 
     ->route('admin.post.index') 
     ->withSuccess('Post saved.'); 
} 

} 

Наконец - класс PostCreateRequest:

<?php 

namespace App\Http\Requests; 

use Illuminate\Foundation\Http\FormRequest; 
use Carbon\Carbon; 

class PostCreateRequest extends FormRequest 
{ 
    /** 
    * Determine if the user is authorized to make this request. 
    */ 
    public function authorize() 
    { 
     return true; 
    } 

    /** 
    * Get the validation rules that apply to the request. 
    * 
    * @return array 
    */ 
    public function rules() 
    { 
     return [ 
      'title' => 'required', 
      'subtitle' => 'required', 
      'content' => 'required', 
      'publish_date' => 'required', 
      'publish_time' => 'required', 
      'layout' => 'required', 
     ]; 
    } 

    /** 
    * Return the fields and values to create a new post from 
    */ 
    public function postFillData() 
    { 
     $published_at = new Carbon(
      $this->publish_date.' '.$this->publish_time 
     ); 
     return [ 
      'title' => $this->title, 
      'subtitle' => $this->subtitle, 
      'page_image' => $this->page_image, 
      'content_raw' => $this->get('content'), 
      'meta_description' => $this->meta_description, 
      'is_draft' => (bool)$this->is_draft, 
      'published_at' => $published_at, 
      'layout' => $this->layout, 
     ]; 
    } 
} 

Проверка списка маршрутов с Artisan возвращает следующее:

POST  | admin/post    | post.store | App\Http\Controllers\Admin\[email protected]      | web,auth  

GET|HEAD | admin/post    | post.index | App\Http\Controllers\Admin\[email protected]      | web,auth  | 

GET|HEAD | admin/post/create  | post.create | App\Http\Controllers\Admin\[email protected]      | web,auth  | 

PUT|PATCH | admin/post/{post}  | post.update | App\Http\Controllers\Admin\[email protected]      | web,auth  | 

DELETE | admin/post/{post}  | post.destroy | App\Http\Controllers\Admin\[email protected]      

То, что я не понимаю, об этом почему другие объекты, кажется, работают под теми же самыми условиями. В том, как делается запись формы, существует небольшая разница, которая, как я полагаю, вызывает проблему. Я чувствую, что есть что-то еще, что нужно настроить или «подключить», чтобы убедиться, что вызов {{route()}} нашел правильный URL-адрес.

Любая помощь очень признательна.

+0

Вы можете проверить все маршруты с помощью 'PHP мастеровых маршрут: list' , –

+0

Я действительно сделал эту проверку и правильно посмотрел на мои конечные точки (по крайней мере, так, как я понимаю). Я обновил вопрос, чтобы показать результаты, связанные с этими вызовами объектов. – Chris

ответ

1

При поиске в списке маршрутов подтверждено, что маршрут не указан admin.post.store который вы используете в своей форме.

Чтобы решить эту проблему, вы можете изменить названия маршрутов ресурсов.

Пример из docs:

Route::resource('photo', 'PhotoController', ['names' => [ 
    'create' => 'photo.build' 
]]); 

Так что в вашем случае, это будет как:

Route::resource('admin/post', 'PostController', ['except' => 'show', 'names' => [ 
    'store' => 'admin.post.store' 
]]); 

Подобно этому, вы можете определить несколько имен маршрутов.

Update

Route::group(['prefix' => 'admin', 'as' => 'admin.'], function() { 
    Route::resource('post', 'PostController', ['except' => 'show']); 
}); 
+0

Спасибо за ответ. Это решило мою проблему для создания, обновления и удаления. Так это способ определения имен псевдонимов для конкретных конечных точек REST? Извините, если я тупой, но я пытаюсь понять, почему эта настройка по умолчанию неверна? «Admin/post» с конечной точкой «post.store» не появляется в admin.post.store? Основываясь на изменениях, которые вы просили меня сделать, похоже, что эта часть администратора не была полностью связана с частью post.store URL-адреса. Я полностью отсюда? – Chris

+0

Да, это официальный способ определения имен псевдонимов для конкретных конечных точек REST. Но вы также можете сделать обходной путь, если вы не хотите определять имя для каждого маршрута, чтобы проверить обновленный ответ. –

0

Попробуйте изменить и обновить композитор:

$router->group([ 
'namespace' => 'Admin', 
'middleware' => 'auth', 
], function() { 
Route::resource('admin/post', 'PostController', ['except' => 'show']); 
Route::resource('admin/tag', 'TagController', ['except' => 'show']); 
Route::get('admin/upload', '[email protected]'); 
Route::post('admin/upload/file', '[email protected]'); 
Route::delete('admin/upload/file', '[email protected]'); 
Route::post('admin/upload/folder', '[email protected]'); 
Route::delete('admin/upload/folder', '[email protected]'); 
}); 

к

Route::group([ 
'namespace' => 'Admin', 
'middleware' => 'auth', 
], function() { 
Route::get('admin/upload', '[email protected]'); 
Route::post('admin/upload/file', '[email protected]'); 
Route::delete('admin/upload/file', '[email protected]'); 
Route::post('admin/upload/folder', '[email protected]'); 
Route::delete('admin/upload/folder', '[email protected]eFolder'); 
Route::resource('admin/post', 'PostController', ['except' => 'show']); 
Route::resource('admin/tag', 'TagController', ['except' => 'show']); 
}); 
+0

Я не думаю, что я вижу какие-то различия между этими двумя здесь :( – Chris

+0

@ Крис, я перестроил код. Можете ли вы просто попробовать и посмотреть список ваших мастеров сейчас? –

+0

Это все равно вернуло ту же ошибку. Спасибо за вашу помощь! – Chris