【问题标题】:Laravel 5.2 Route not working when using resource for CRUD operation使用资源进行 CRUD 操作时,Laravel 5.2 Route 不起作用
【发布时间】:2017-04-11 10:10:00
【问题描述】:

我正在尝试熟悉 Laravel 框架。我一直在关注一个教程,并且被困在路由的一部分。我有一个简单的博客项目,它试图创建和编辑博客文章。我已经有 2 个其他对象 CRUD 操作正常工作 - 其中 1 个是使用路由中的资源设置的,就像我尝试使用这个一样。尝试向以下内容发帖时:

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

我返回一个错误“Route [admin.post.store] not defined。(查看:/home/vagrant/Code/test-dev/resources/views/admin/post/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', 'BlogController@index');
Route::get('blog/{slug}', 'BlogController@showPost');

 // 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', 'UploadController@index');
    Route::post('admin/upload/file', 'UploadController@uploadFile');
    Route::delete('admin/upload/file', 'UploadController@deleteFile');
    Route::post('admin/upload/folder', 'UploadController@createFolder');
    Route::delete('admin/upload/folder', 'UploadController@deleteFolder');
});

Auth::routes();

Route::get('/home', 'HomeController@index');

这里是 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\PostController@store                        | web,auth     

GET|HEAD  | admin/post             | post.index   | App\Http\Controllers\Admin\PostController@index                        | web,auth     |

GET|HEAD  | admin/post/create      | post.create  | App\Http\Controllers\Admin\PostController@create                       | web,auth     |

PUT|PATCH | admin/post/{post}      | post.update  | App\Http\Controllers\Admin\PostController@update                       | web,auth     |

DELETE    | admin/post/{post}      | post.destroy | App\Http\Controllers\Admin\PostController@destroy                      

我不明白为什么其他对象似乎在完全相同的条件下工作。表单发布的方式有一点不同,我认为这是导致问题的原因。我觉得还需要配置或“连接”其他东西以确保 {{ route()}} 调用找到正确的 url。

非常感谢任何帮助。

【问题讨论】:

  • 您可以使用php artisan route:list查看您的所有路线。
  • 我实际上做了那个检查并且确实正确地看到了我的端点(至少我理解正确)显示。我更新了问题以显示与此对象调用相关的结果。

标签: php laravel laravel-5.2 laravel-routing laravel-artisan


【解决方案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']);
});

【讨论】:

  • 感谢您的回复。这解决了我的创建、更新和删除问题。那么这是一种为特定 REST 端点定义别名的方法吗?对不起,如果我很迟钝,但我想了解为什么这个默认配置不正确?端点为“post.store”的“admin/post”不会出现在 admin.post.store 中吗?根据您要求我做出的修改,看起来管理部分没有完全连接到 url 的 post.store 部分。我完全不在这儿吗?
  • 是的,这是为特定 REST 端点定义别名的官方方式。但是,如果您不想为每条路线定义名称,您也可以采取一种解决方法,为此请检查更新的答案。
【解决方案2】:

尝试更改和更新您的作曲家:

$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', 'UploadController@index');
Route::post('admin/upload/file', 'UploadController@uploadFile');
Route::delete('admin/upload/file', 'UploadController@deleteFile');
Route::post('admin/upload/folder', 'UploadController@createFolder');
Route::delete('admin/upload/folder', 'UploadController@deleteFolder');
});

Route::group([
'namespace' => 'Admin',
'middleware' => 'auth',
], function () {
Route::get('admin/upload', 'UploadController@index');
Route::post('admin/upload/file', 'UploadController@uploadFile');
Route::delete('admin/upload/file', 'UploadController@deleteFile');
Route::post('admin/upload/folder', 'UploadController@createFolder');
Route::delete('admin/upload/folder', 'UploadController@deleteFolder');
Route::resource('admin/post', 'PostController', ['except' => 'show']);
Route::resource('admin/tag', 'TagController', ['except' => 'show']);
});

【讨论】:

  • 我不认为我在这里看到两者之间有任何区别:(
  • @Chris,我重新排列了代码。你现在可以试试看你的工匠名单吗?
  • 这仍然返回相同的错误。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2016-09-21
  • 2016-12-16
  • 2019-03-03
  • 1970-01-01
  • 2017-05-22
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多