laravel - 在 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';
解决方案
您必须在调用堆栈中向上查找 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'])
}
}
推荐阅读
- mysql - 按城市选择每个学科组中所有得分最高的学生的数据
- c - 如何将带有分隔符的文件行中的单词存储到结构中
- typescript - 在 Typescript 声明中,如何让一个值依赖于另一个值的类型?
- python - Selenium - 'list' 对象没有属性 'screenshot_as_png'
- android - minSdkVersion > 21 是否需要 vectorDrawables.useSupportLibrary 标志
- html - 如何连接“<”和“>”字符以构建从 postgresql 通过 XML 和 XSL 到 HTML 的 img 标签
- spring - Spring Boot websocket RabbitMQ STOMP 中继代理在没有 TCP 连接的情况下从实例发送到客户端时无法发送消息
- powershell - 依次运行 2 个 Powershell 脚本
- r - 如何在 R 中使循环图动态/交互?
- python - Numpy 数组以索引为值的字典