'required', 'unique_name' => 'required|regex_match[/^[a-z0-9\-]{1,191}$/]|is_unique[persons.unique_name,id,{id}]', 'image_uri' => 'required', 'created_by' => 'required', 'updated_by' => 'required', ]; protected $validationMessages = []; // clear cache before update if by any chance, the person name changes, so will the person link protected $afterInsert = ['clearCache']; protected $beforeUpdate = ['clearCache']; protected $beforeDelete = ['clearCache']; public function getPersonById($personId) { if (!($found = cache("person{$personId}"))) { $found = $this->find($personId); cache()->save("person{$personId}", $found, DECADE); } return $found; } public function getPerson($fullName) { return $this->where('full_name', $fullName)->first(); } public function createPerson($fullName, $informationUrl, $image) { $person = new \App\Entities\Person([ 'full_name' => $fullName, 'unique_name' => slugify($fullName), 'information_url' => $informationUrl, 'image' => download_file($image), 'created_by' => user()->id, 'updated_by' => user()->id, ]); return $this->insert($person); } public function getPersonOptions() { $options = []; if (!($options = cache('person_options'))) { $options = array_reduce( $this->select('`id`, `full_name`') ->orderBy('`full_name`', 'ASC') ->findAll(), function ($result, $person) { $result[$person->id] = $person->full_name; return $result; }, [] ); cache()->save('person_options', $options, DECADE); } return $options; } public function getTaxonomyOptions() { $options = []; $locale = service('request')->getLocale(); if (!($options = cache("taxonomy_options_{$locale}"))) { foreach (lang('PersonsTaxonomy.persons') as $group_key => $group) { foreach ($group['roles'] as $role_key => $role) { $options[ "$group_key,$role_key" ] = "{$group['label']} ▸ {$role['label']}"; } } cache()->save("taxonomy_options_{$locale}", $options, DECADE); } return $options; } protected function clearCache(array $data) { $person = (new PersonModel())->getPersonById( is_array($data['id']) ? $data['id'][0] : $data['id'] ); cache()->delete('person_options'); cache()->delete("person{$person->id}"); cache()->delete("user{$person->created_by}_persons"); $supportedLocales = config('App')->supportedLocales; // clear cache for every credit page foreach ($supportedLocales as $locale) { cache()->delete("credit_{$locale}"); } return $data; } }