Вызов функции-члена pro_events() при нулевом значении

#laravel

#laravel

Вопрос:

Здравствуйте, я пытаюсь исправить эту проблему, из-за которой ошибка

Вызов функции-члена 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(AppModelsProEvent::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';
  

Комментарии:

1. Попробуйте перехватить присвоение данных $events или просто выдать исключение или игнорировать, если $events значение равно null.

2. как вы относитесь к органайзеру? использует ли он мягкие удаления? может быть, он удален или еще не существует?

3. Спасибо за быстрый ответ, ребята. да, но только модель ProEvent использует мягкие удаления (я отредактировал код выше), связано ли это с этой проблемой?

4. Зависит ли организатор от фильтра или около того? Как вы это получаете? не могли бы вы, пожалуйста, включить этот код тоже?

5. Откуда $organiser берется?

Ответ №1:

Вы должны подняться в стеке вызовов, чтобы найти, откуда берется идентификатор организатора. Возможной причиной может быть то, что администратор / пользователь, вошедший в систему, может изменить маршрут вручную и попытаться загрузить органайзер, который не существует.

Если у вас есть маршрут типа /organizer/{organizer_id} , то вы должны убедиться, что предоставленный идентификатор действительно существует в БД. Одним из способов сделать это было бы использовать 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(IlluminateHttpRequest $request)
{
    // something more here

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

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

Комментарии:

1. Спасибо! Я смог повторить проблему, протестировав return Organiser::findOrFail('100'); , где organizer_id = 100 не существует, а страница только что вернула 404. Этого было бы достаточно. С уважением

Ответ №2:

я думаю, это потому, что экземпляр Organizer, в котором вы вызывали функцию pro_events(), был нулевым.