При чтении данных с использованием Anahkiasen / Polyglot возвращается ошибка при попытке получить свойство необъекта

После добавления пакета Anahkiasen / Polyglot в мой проект Laravel 4.2 я попытался заставить это работать. Я все настроил так, как мне кажется (документация довольно плохая). Сохранение в базе данных не кажется проблемой, но когда я хочу прочитать, я получаю следующую ошибку:

Trying to get property of non-object (View: /Applications/MAMP/htdocs/*my view*.blade.php)

Модели:

use Polyglot\Polyglot;

class Page extends Polyglot {

use SoftDeletingTrait;

protected $fillable = [
'lang',
'meta_title',
'meta_description',
'title',
'page_title',
'page_content',
];
protected $polyglot = [
'meta_title',
'meta_description',
'title',
'page_title',
'page_content',
];

// ...
}

class PageLang extends Eloquent {

public $timestamps = false;
protected $fillable = [
'page_id',
'lang',
'meta_title',
'meta_description',
'title',
'page_title',
'page_content',
];
}

Мой шаблон лезвия:

$page->nl->title
/*
This is what's causing the error
$page->title doesn't produce errors but is, of course, empty
*/

Застрял в этом некоторое время сейчас. Любая помощь с благодарностью 🙂

1

Решение

Я не знаком с библиотекой, но смотрю на базовый класс полиглота, похоже, что эта абстракция работает с использованием магии PHP __get переменная для ввода n объекта локализации при доступе к чему-то вроде $page->nl

Смотря на __get,

public function __get($key)
{
// If the relation has been loaded already, return it
if (array_key_exists($key, $this->relations)) {
return $this->relations[$key];
}
// If the model supports the locale, load and return it
if (in_array($key, $this->getAvailable())) {
$relation = $this->hasOne($this->getLangClass())->whereLang($key);
if ($relation->getResults() === null) {
$relation = $this->hasOne($this->getLangClass())->whereLang(Config::get('polyglot::fallback'));
}
return $this->relations[$key] = $relation->getResults();
}
// If the attribute is set to be automatically localized
if ($this->polyglot) {
if (in_array($key, $this->polyglot)) {
/**
* If query executed with join and a property is already there
*/
if (isset($this->attributes[$key])) {
return $this->attributes[$key];
}
$lang = Lang::getLocale();
return $this->$lang ? $this->$lang->$key : null;
}
}
return parent::__get($key);
}

есть ряд условий, которые в случае неудачи приводят к __get будучи призванным

return parent::__get($key);

Другими словами, нормальная модель поведения. Это, вероятно, то, что происходит выше — и так как nl не заданный объект PHP жалуется, когда вы пытаетесь вызвать метод для него.

Из трех условий в __getкажется, это наиболее вероятный кандидат на провал

    if (in_array($key, $this->getAvailable())) {
$relation = $this->hasOne($this->getLangClass())->whereLang($key);
if ($relation->getResults() === null) {
$relation = $this->hasOne($this->getLangClass())->whereLang(Config::get('polyglot::fallback'));
}
return $this->relations[$key] = $relation->getResults();
}

Если ваш конкретный случай, он будет выглядеть

    if (in_array('nl', $this->getAvailable())) {
//...
}

Смотря на getAvailable()

protected function getAvailable()
{
return Config::get('polyglot::locales');
}

он ищет поле конфигурации с именем Config::get('polyglot::locales');, Я бы проверил, возвращает ли вызов этого поля конфигурации nl как настроенный язык

var_dump(Config::get('polyglot::locales'));

Я думаю, что это не так, возможно, потому что вы не запустили команду ремесленника, чтобы опубликовать конфигурацию для пакета

php artisan config:publish anahkiasen/polyglot
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]