После добавления пакета 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
*/
Застрял в этом некоторое время сейчас. Любая помощь с благодарностью 🙂
Я не знаком с библиотекой, но смотрю на базовый класс полиглота, похоже, что эта абстракция работает с использованием магии 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
Других решений пока нет …