首页 > 解决方案 > 在 null 上调用成员函数 pro_events()

问题描述

您好,我正在尝试解决错误的问题

在 null 上调用成员函数 pro_events()

不会一直发生。我不确定是什么原因造成的。

知道如何防止此错误再次出现吗?我们刚刚在日志中看到了这个错误,但无法复制这个问题。谢谢!

Organizer.php模型

class Organiser extends MyBaseModel
{
    protected $rules = [
        'org_name'           => ['required', 'unique:organisers,name'],
        'email'          => ['required', 'email', 'unique:organisers'],
        'organiser_logo' => ['mimes:jpeg,jpg,png', 'max:10000'],
        'terms_agreed'   => ['required'],
        'org_tags'   => ['required'],
    ];

    protected $messages = [
        'org_name.required'    => 'You must at least give a name for the event organiser.',
        'org_name.unique'      => 'Your desired organisation name is already taken.',
        'organiser_logo.max'   => 'Please upload an image smaller than 10Mb',
        'organiser_logo.size'  => 'Please upload an image smaller than 10Mb',
        'organiser_logo.mimes' => 'Please select a valid image type (jpeg, jpg, png)',
    ];

public function pro_events() {
        return $this->hasMany(\App\Models\ProEvent::class)->orderBy('event_date', 'asc');
}

SomeController.php


public function showPackageHome($organiser_id, $event_dummy = null, $event_id = null, $the_country = null, $package_type_id = null, $package_category_id = null)
    {
        date_default_timezone_set('Europe/London');
        $now        = Carbon::now();

        $cacheKey = md5(vsprintf('%s.%s', [
            $organiser_id,
            'organiser_cache'
        ]));

        $organiser = Cache::remember($cacheKey, 10, function() use ($organiser_id) {
            return Organiser::find($organiser_id);
        });

$cacheKey = md5(vsprintf('%s', [
            'event_list_cache'
        ]));

$events = Cache::remember($cacheKey, 1, function() use ($organiser, $now) {
          return $organiser->pro_events()
                            ->where("event_status", "live")
                            ->whereDate('event_date', '>=', $now->format("Y-m-d"))
                            ->orderBy('event_date', 'asc')
                            ->get();
          });

ProEvent.php模型

class ProEvent extends MyBaseModel
{
    use SoftDeletes;

    protected $table   = 'pro_events';

标签: laravel

解决方案


您必须在调用堆栈中向上查找 Organizer_id 的来源。一个可能的原因是 admin/loggedIn 人可能会手动更改路线并尝试加载不存在的组织者。

如果您有类似 的路由/organizer/{organizer_id},则必须确保提供的 ID 确实存在于 db.xml 中。一种方法是使用findOrFail代替find并捕获抛出的异常,以防组织者不存在。

public function showPackageHome($organiser_id, $event_dummy = null, $event_id = null, $the_country = null, $package_type_id = null, $package_category_id = null)
{
    date_default_timezone_set('Europe/London');
    $now        = Carbon::now();

    $cacheKey = md5(vsprintf('%s.%s', [
        $organiser_id,
        'organiser_cache'
    ]));


    $organiser = Cache::remember($cacheKey, 10, function() use ($organiser_id) {
        return Organiser::findOrFail($organiser_id);
    });

    $cacheKey = md5(vsprintf('%s', [
        'event_list_cache'
    ]));

    $events = Cache::remember($cacheKey, 1, function() use ($organiser, $now) {
    
         return $organiser->pro_events()
                        ->where("event_status", "live")
                        ->whereDate('event_date', '>=', $now->format("Y-m-d"))
                        ->orderBy('event_date', 'asc')
                        ->get();
     });
}

在您的控制器方法中,您实际上可以捕获异常并向用户显示一些内容:

public function yourControllerMethod(Illuminate\Http\Request $request)
{
    // something more here

    try {
        $events = $this->showPackageHome($request->get('organizer_id'), /* the other parameters */);

        return $this->view(..., ['events' => $events]);
    } catch (Illuminate\Database\Eloquent\ModelNotFoundException $ex) {
        // The organizer couldn't be found
        return redirect()->back()->withErrors(['organizer-not-found' => 'The organizer could not be found'])
    }
}

推荐阅读