2016-11-27 19 views
0

Laravelフレームワークに慣れようとしています。私はチュートリアルに従っており、ルーティングのある部分に固執しています。私は、ブログ記事を作成して編集しようとしている簡単なブログプロジェクトを持っています。私は既に2つの他のオブジェクトCRUD操作が正しく動作しています - それらのうちの1つは、私がこれと一緒にしようとしているように、ルート内のリソースでセットアップされています。次のポスト行おうとする場合:私はエラーを返していますLaravel 5.2 CRUD操作にリソースを使用しているときにルートが動作しない

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

を「ルート[admin.post.store]定義されていません(ビュー:/ホーム/浮浪者/コード/テスト-devの/リソース/ビュー/ admin/post/create.blade.php) "

これは、私のモデルポストオブジェクトの基本クラスにデフォルトで格納されているストアドプロシージャを見つけることができるという問題です。職人と移行を使ってこれらのオブジェクトを作成し、それらを自動的にDBオブジェクトに結びつけました。下に掲載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, 
     ]; 
    } 
} 

アーティザンでルートリストをチェックすると、次の値を返します。

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' 
]]); 

、あなたがルートに複数の名前を定義することができます。

更新

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

お返事ありがとうございます。これは、作成、更新、および削除に関する私の問題を解決しました。これは特定のRESTエンドポイントに別名を定義する方法ですか? 残念ですが、このデフォルト設定が間違っている理由を理解しようとしていますか? "post.store"のエンドポイントを持つ "admin/post"はadmin.post.storeに出ていないのですか?変更に基づいて、管理部分がURLのpost.store部分に完全に接続されていないように見えるように求めました。私はここから完全に離れていますか? – 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]'); 
Route::resource('admin/post', 'PostController', ['except' => 'show']); 
Route::resource('admin/tag', 'TagController', ['except' => 'show']); 
}); 
+0

私はここに2つの違いがあるとは思わない:( – Chris

+0

@Chris、私はコードを再編成しました。今あなたの職人のリストを見てみることができますか? –

+0

これはまだ同じエラーを返しました。 – Chris

関連する問題