2016-11-27 47 views
0

我试图熟悉Laravel框架。我一直在关注一个教程,并坚持使用路由的一部分。我有一个简单的博客项目试图创建和编辑博客文章。我已经有2个其他对象的CRUD操作正常工作 - 其中一个是在路由中设置一个资源,就像我正在试图用这个一样。当试图做一个邮寄到以下几点:Laravel 5.2使用资源进行CRUD操作时,路由不工作

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

我返回了一个错误“路线[admin.post.store]没有定义(查看:/家庭/流浪者/编码/测试开发/资源/意见/管理/后/ create.blade.php)”

现在我理解,这是它能够找到默认情况下,在基类中我的模型后对象的存储存储过程中的问题。我使用工匠和移植来创建这些对象并自动将它们绑定到数据库对象。 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

感谢您的回复。这解决了我的问题创建,更新和删除。那么这是一种将Alias名称定义到特定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

我不认为我看到两个在这里:( – Chris

+0

@克里斯之间的差异,我重排的代码。你能不能给试一试,看看你的工匠名单了吗? –

+0

这仍然返回相同的错误。谢谢您的帮助! – Chris