控制器返回 application/json 而不是视图

Posted

技术标签:

【中文标题】控制器返回 application/json 而不是视图【英文标题】:Controller returning application/json instead of view 【发布时间】:2017-12-30 07:56:25 【问题描述】:

我有一个非常奇怪的问题。我可以访问该页面,一切都很好,直到我在我的 web.php 路由文件中添加了一些新路由。问题在于第 5 条路线(名为 post.create)。 ** 只是为了突出我正在谈论的线路/路线:

Route::group(['prefix'=>'admin', 'middleware'=>'auth'], function()

Route::get('home', 'HomeController@index')->name('admin.home');

Route::get('post/all','PostsController@index')->name("post.all");

Route::get('post/id?','PostsController@show')->name('post.fetch');

**Route::get('post/create','PostsController@create')->name('post.create');**

Route::post('post/store', 'PostsController@store')->name('post.store');

Route::put('post/id?','PostsController@update')->name('post.update');

Route::delete('post/delete/id','PostsController@destroy')->name('post.delete');

Route::get('category/create','CategoriesController@create')->name('category.create');

Route::post('category/store','CategoriesController@store')->name('category.store');

Route::get('category/all','CategoriesController@index')->name('category.all');

Route::get('category/id?','CategoriesController@show')->name('category.fetch');

Route::delete('category/delete/id','CategoriesController@destroy')->name('category.delete');

Route::put('category/id','CategoriesController@update')->name('category.update');
);

当我访问这条路线时,我得到一个只有一对花括号的空白页面,没有别的。浏览器控制台上有一条消息显示 - Resource 解释为 Document 但使用 MIME 类型 application/json 传输

但是如果我改变路线到

Route::get('posts/create','PostsController@create')->name('post.create');

,这只是添加一个额外的s,我得到了页面的完整视图。

我似乎无法弄清楚为什么前面的路由会发回 application/json(似乎是一个空对象)。我没有更改控制器功能。下面是 PostsController@create 函数的代码:

public function create()

    $categories = Category::all();
    return view('admin.posts.create', compact('categories'));

我试图从这个函数中为这条路线返回一个不同的视图或一个简单的字符串。似乎没有任何效果。

我做错了什么,谁能帮忙?

【问题讨论】:

【参考方案1】:

你应该将 Blade 文件命名为:

resources/views/admin/posts/create.blade.php

刀片视图文件使用.blade.php 文件扩展名,通常存储在resources/views 目录中

https://laravel.com/docs/5.4/blade#introduction

更新

在 cmets 中,我建议您将路线移到 'post/id?' 之前。

【讨论】:

刀片文件已命名为 create.blade.php。正如我所说,如果我更改定义中的路由 url,即使是 1 个字符,相同的页面也是可见的。是的,这个文件存放在 resources/views/admin/posts/ 目录下! 尽量把这条路线放在'post/id?'之前 嗨,亚历克斯。谢谢,确实是这个问题。 是的,我应该这样做。现在点赞。虽然我已经赞成你的评论。实际上发生的事情是,当我回来查看答案时,我看到了您的两个答案,但无法弄清楚谁先回答。由于对方有解释,我接受了。感谢您的帮助!【参考方案2】:

Laravel 将按照您定义的顺序提供匹配的第一个路由。由于您首先拥有post.fetch,因此它使用“create”作为id 参数为该路由提供服务。

在您的路线文件中,将post.create 放在post.fetch 之前,这样您就有了:

Route::get('post/create','PostsController@create')->name('post.create');

Route::get('post/id?','PostsController@show')->name('post.fetch');

Route::post('post/store', 'PostsController@store')->name('post.store');

Route::put('post/id?','PostsController@update')->name('post.update');

【讨论】:

@Eric_Tucker:那行得通。非常感谢您的解释。通过遇到问题学习了新事物:)

以上是关于控制器返回 application/json 而不是视图的主要内容,如果未能解决你的问题,请参考以下文章

使用 postman 测试站点,返回 json ,中文乱码--解决办法

mediaType浅析

Response::json() 发送 html 而不是 json

Resource interpreted as Document but transferred with MIME type application/json

Spring Boot 将 js 文件返回为 MIME 'application/json' 而不是 'text/javascript'

PHP Curl,在 application/json 中请求数据返回