【问题标题】:Laravel Model Show Function returning nullLaravel 模型显示函数返回 null
【发布时间】:2018-04-30 20:50:46
【问题描述】:

我安装了 Laravel 5.6 并设置了多重身份验证。

一切正常,除了当我进入资源显示功能时,雄辩的人没有得到记录。只是返回 null。

我在 Google 上搜索了 2 天,但无法弄清楚。

代码如下。

web.php

Route::get('/', function () {
return view('welcome');
});

Auth::routes();

Route::get('/home', 'HomeController@index')->name('home');
Route::get('/user/logout','Auth\LoginController@userLogout')->name('user.logout');

//admin route for our multi-auth system

Route::prefix('admin')->name('admin.')->group(function () {
    Route::get('/', 'AdminController@index')->name('dashboard');
    Route::get('/login', 'Auth\AdminLoginController@showLoginForm')->name('login');
    Route::post('/login', 'Auth\AdminLoginController@login')->name('login.submit');
    Route::get('/logout','Auth\AdminLoginController@logout')->name('logout');

    //admin password reset routes
    Route::post('/password/email','Auth\AdminForgotPasswordController@sendResetLinkEmail')->name('password.email');
    Route::get('/password/reset','Auth\AdminForgotPasswordController@showLinkRequestForm')->name('password.request');
    Route::post('/password/reset','Auth\AdminResetPasswordController@reset');
    Route::get('/password/reset/{token}','Auth\AdminResetPasswordController@showResetForm')->name('password.reset');

});

Route::resource('/admin/stock_categories','Admin\Stock\CategoryController');

我正在使用的资源是上面的 stock_categories。

我的路线:列表如下。

|        | POST      | admin/stock_categories                       | stock_categories.store   | App\Http\Controllers\Admin\Stock\CategoryController@store                   | web,auth:admin                               |
|        | GET|HEAD  | admin/stock_categories                       | stock_categories.index   | App\Http\Controllers\Admin\Stock\CategoryController@index                   | web,auth:admin                               |
|        | GET|HEAD  | admin/stock_categories/create                | stock_categories.create  | App\Http\Controllers\Admin\Stock\CategoryController@create                  | web,auth:admin                               |
|        | GET|HEAD  | admin/stock_categories/{stock_category}      | stock_categories.show    | App\Http\Controllers\Admin\Stock\CategoryController@show                    | web,auth:admin                               |
|        | PUT|PATCH | admin/stock_categories/{stock_category}      | stock_categories.update  | App\Http\Controllers\Admin\Stock\CategoryController@update                  | web,auth:admin                               |
|        | DELETE    | admin/stock_categories/{stock_category}      | stock_categories.destroy | App\Http\Controllers\Admin\Stock\CategoryController@destroy                 | web,auth:admin                               |
|        | GET|HEAD  | admin/stock_categories/{stock_category}/edit | stock_categories.edit    | App\Http\Controllers\Admin\Stock\CategoryController@edit                    | web,auth:admin         

当我显示列表时,它会正确显示。

但是当我点击一个项目并打开 URL 时

/admin/stock_categories/1

它返回一个空结果。即不显示该项目。

我的型号代码如下。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;


class Category extends Model
{
    use Notifiable;

    protected $table = 'stock_categories';
    //protected $fillable = ['name, discount'];

    //
    function items() {
      return $this->hasMany('App\Item','category_id');
    }

}

我的控制器是代码如下。

/**
 * Create a new controller instance.
 *
 * @return void
 */
public function __construct()
{
    $this->middleware('auth:admin');
}


/**
 * Display a listing of the resource.
 *
 * @return \Illuminate\Http\Response
 */
public function index()
{
    $category = Category::where('master_category_id',0)->orderBy('name')->paginate(20);
    $master_category_id = 0;
    return view('admin.stock.top_list',compact('category','master_category_id'));
}

/**
 * Show the form for creating a new resource.
 *
 * @return \Illuminate\Http\Response
 */
public function create()
{
    //
}

/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store(Request $request)
{
    //
}

/**
 * Display the specified resource.
 *
 * @param  \App\Category  $category
 * @return \Illuminate\Http\Response
 */


public function show(Category $category)
{
    return view('admin.stock.category',compact('category'));
}

当我在 show 函数中使用 var_dump($category) 时,我得到了这个。

object(App\Category)#755 (26) {
  ["table":protected]=>
  string(16) "stock_categories"
  ["connection":protected]=>
  NULL
  ["primaryKey":protected]=>
  string(2) "id"
  ["keyType":protected]=>
  string(3) "int"
  ["incrementing"]=>
  bool(true)
  ["with":protected]=>
  array(0) {
  }
  ["withCount":protected]=>
  array(0) {
  }
  ["perPage":protected]=>
  int(15)
  ["exists"]=>
  bool(false)
  ["wasRecentlyCreated"]=>
  bool(false)
  ["attributes":protected]=>
  array(0) {
  }
  ["original":protected]=>
  array(0) {
  }
  ["changes":protected]=>
  array(0) {
  }
  ["casts":protected]=>
  array(0) {
  }
  ["dates":protected]=>
  array(0) {
  }
  ["dateFormat":protected]=>
  NULL
  ["appends":protected]=>
  array(0) {
  }
  ["dispatchesEvents":protected]=>
  array(0) {
  }
  ["observables":protected]=>
  array(0) {
  }
  ["relations":protected]=>
  array(0) {
  }
  ["touches":protected]=>
  array(0) {
  }
  ["timestamps"]=>
  bool(true)
  ["hidden":protected]=>
  array(0) {
  }
  ["visible":protected]=>
  array(0) {
  }
  ["fillable":protected]=>
  array(0) {
  }
  ["guarded":protected]=>
  array(1) {
    [0]=>
    string(1) "*"
  }
}

我的中间件是这样的。

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     *
     * These middleware are run during every request to your application.
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,

    ];

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,

        ],

        'api' => [
            'throttle:60,1',
            'bindings',
        ],
    ];

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    ];
}

我希望我只是做了一些愚蠢的事情,而我一生都找不到。

总而言之,我点击了一个项目,加载了显示资源路由,但没有从数据库中检索到该项目。

非常感谢任何帮助。

谢谢

【问题讨论】:

  • 您是否已验证控件已到达您的show 方法内部?
  • 是的,我可以从 show 方法返回一个视图,但是 $category 是按照 var_dump 的。所以是的,在 show 方法中。

标签: laravel binding model resources


【解决方案1】:

我认为你应该寻找Model Binding。 这里有一些资源,展示了如何将模型对象传递给控制器​​。

  1. Route model binding documentation
  2. Some examples
  3. SO

希望能帮助你找到一些线索。

【讨论】:

  • 谢谢,这是我期望在这里发生的模型绑定。我将更详细地浏览示例页面。明确的示例几乎正是我在这里编写的代码。谢谢
  • 这就是为什么我认为它可能与我在 Kernel.php 中的身份验证和模型绑定有关。
  • 我更新了答案,请参阅3 链接,您的路线有`admin/stock_categories/{stock_category}` 但控制器接受$category
  • 嗨,是的,谢谢,这帮我解决了问题。谢谢一百万!
  • 这对我很有帮助。非常感谢。但我仍然很困惑为什么变量名很重要
【解决方案2】:

我认为您需要使用路由中发送的 id 来获取类别。

例如。

public function show($id)
{
    $category = Category::find($id);

    return view('admin.stock.category',compact('category'));
}

【讨论】:

  • 嗨,如果我对 ID 进行硬编码,这将有效,但在我的例子中是 (Category $category) 的 $id 不包含来自 url 的 ID。
  • 我认为资源方法show 不会提供自动加载的记录。以下是有关资源控制器 laravel.com/docs/5.6/controllers#resource-controllers 的文档的更多信息
  • 这就是重点,您需要将show方法中的参数更改为整数,例如$id,然后使用它来检索记录。
  • 好吧,我想是因为 laravel 自动生成了带有 (Category $category) 的方法,所以 eloquent 会自动检索记录。谢谢
  • 我对 eloquent 通过传入 ID 并让 laravel 返回列出的模型来检索记录没有任何问题;在这种情况下,将 1 作为 id 传递给接受 Category $category 的方法。我按预期返回了Category 模型。但是,只要我将auth:api 添加到我的中间件,模型绑定就会被破坏,并且对于同一个示例,所有内容都为空。听起来就像 OP 一样的问题。
猜你喜欢
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
  • 2020-08-02
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多