Могу ли я использовать обозначение `::class` в функциях модели - Laravel

Я чищу код в моем приложении. Кажется у меня неправильное представление о ::class нотации.

Хотя в моем config/app.php Заявленные провайдеры могут быть преобразованы из, скажем так 'igaster\laravelTheme\themeServiceProvider', в это igaster\laravelTheme\themeServiceProvider::class,Я не могу сделать то же самое для объектов в моделях.

Например, у меня есть

public function relateds()
{
    return $this->hasMany('App\Models\Related', 'item_id')->Where('itemkind', '=', 'capacitytypes', 'and')->Where('status', '!=', '2');
}

после преобразования в

public function relateds()
{
    return $this->hasMany(App\Models\Related::class, 'item_id')->where('itemkind', '=', 'capacitytypes')->where('status', '!=', '2');
}

Я получаю ошибку

FatalThrowableError in Model.php line 918: Class 'App\Models\App\Models\Action' not found

Означает ли это, что я не могу использовать обозначения в моделях, или я делаю что-то неправильно?

1 ответ

Пространства имен ведут себя в некоторой степени как пути к файлам в этом контексте, поскольку, когда вы ссылаетесь на один из них в своем коде, вы можете ссылаться на них относительно (относительно текущего пространства имен) или абсолютно (полное пространство имен).

Когда вы находитесь в файле с таким пространством имен, как этот, если вы пропустите ведущий \ характер, то вы ссылаетесь относительно. Вот почему он ищет App\Models\App\Models\Action,

Файл config/app.php не является пространством имен, и поэтому предполагается, что любые предоставленные вами пространства имен относятся к корневому пространству имен, поэтому вам не нужен ведущий \ персонаж.

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

  • Во-первых, как предлагается в комментариях, вы можете поставить \ в начале так становится:

    public function relateds()
    {
        return $this->hasMany(\App\Models\Related::class, 'item_id')->where('itemkind', '=', 'capacitytypes')->where('status', '!=', '2');
    }
    
  • Во-вторых, вы могли бы use класс в верхней части вашего файла, сразу после объявления пространства имен, а затем опустите полное пространство имен при определении ваших отношений, например так:

    <?php
    
    namespace App\Models;
    
    use App\Models\Related;
    
    class Action extends Model
    {
        // ...
    
        public function relateds()
        {
            return $this->hasMany(Related::class, 'item_id')->where('itemkind', '=', 'capacitytypes')->where('status', '!=', '2');
        }
    
  • И, наконец, проще, так как ваш Related а также Action модели находятся в одном и том же App\Models пространство имен, вы можете полностью опустить пространство имен при определении ваших отношений, без необходимости use это наверху. Таким образом, вы бы в конечном итоге с этим:

    public function relateds()
    {
        return $this->hasMany(Related::class, 'item_id')->where('itemkind', '=', 'capacitytypes')->where('status', '!=', '2');
    }
    
Другие вопросы по тегам