Загрузка...

Строгий режим в Laravel

Использование mustBeStrict в AppServiceProvider
laravel cover

Введение

Laravel — это мощный PHP- фреймворк, и все его возможности сопряжены с большими обязанностями. В сегодняшней статье мы узнаем, как активировать строгий режим Eloquent в вашем приложении Laravel и как использовать его в своих интересах.

Предотвращение ленивой загрузки

Lazy Loading – это получение родителя modelи его дочерних элементов.

Например, у вас есть модель Post, у которой много комментариев , что-то вроде:
class Post extends Model

{
    // ...
 
    public function comments()
    {
        return $this->hasMany(Comment::class);
    }
}

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


$post = Post::find(1);
$post->comments // return the comments collection.

Но давайте остановимся здесь на минутку. Если вы взглянете на запрос за сценой, вы заметите проблему N+1.


SELECT * FROM `comments` WHERE `comments`. `id` = 1;
SELECT * FROM `comments` WHERE `comments`. `id` = 2;
SELECT * FROM `comments` WHERE `comments`. `id` = 3;
SELECT * FROM `comments` WHERE `comments`. `id` = 4;
...

Допустим, у вас 1000 комментариев, этот запрос будет повторяться 1000 раз. Чтобы этого не произошло, вы будете использовать функцию отложенной загрузки.


$post = Post::find(1);
$post->with('comments')->comments;

Этот with()метод будет использовать inвстроенную функцию MySQL для получения всех комментариев в одном запросе.

SELECT * FROM `comments` WHERE `comments` . `id` in (1,2,3,4,5,6,...1000)

Разработчики могут забыть об этой проблеме в процессе разработки, что бы этого не произошло в Laravel есть специальная функция.

В bootметод вашего AppServiceProvider.phpдобавьте следующие строки:


use Illuminate\Database\Eloquent\Model;
 
public function boot()
{
    Model::preventLazyLoading(! $this->app->isProduction());
}

Добавьте ! $this->app->isProduction()что бы не показывать ошибки в продакшн среде.

Предотвращение молчаливого удаления атрибутов

Я знаю , что в Laravel появилась еще одна функция строгого режима — «Предотвращение тихого удаления атрибутов ». Давайте разберемся с этим.

Когда вы вставляете новую запись в базу данных через model, вы просто добавляете атрибуты или, можно сказать, столбцы таблицы в fillable массив, примерно так:


class User extends Model
{
    protected $fillable = [
        'name',
        'email',
    ];
}

Допустим, вы добавили, genderнапример, еще один столбец и забыли добавить его в fillableсвойство, Laravel молча игнорирует, что нового атрибута нет в fillableатрибутах, и просто добавляет его.

Чтобы предотвратить это и убедиться, что все атрибуты находятся в fillableсвойстве массива, при разработке приложения вы можете найти метод boot в AppServiceProvider.phpи добавить следующее:


public function boot()
{
    Model::preventSilentlyDiscardingAttributes(! $this->app->isProduction());
}

Запретить доступ к отсутствующим атрибутам

При разработке приложения Laravel вы можете заметить, что при доступе к отсутствующему атрибуту Laravel в результате возвращает NULL .

Допустим, у вас есть UserМодель, contains nameи emailpassword, и вы хотите получить доступ к чему-то вроде gender, но оно не существует в базе данных как свойство


$user = User::find(1);
 
$user->gender // will returns null by default

Чтобы этого не произошло, вы можете добавить в bootметод следующее:


Model::preventAccessingMissingAttributes(! $this->app->isProduction());

Все в одном

Если вам понравилось то, что вы видели выше, и вы хотите включить все 3 функции одновременно, вы можете добавить следующую строку:


Model::shouldBeStrict(! $this->app->isProduction());

Заключение

В этой статье мы обсудили 3 типа строгого режима модели в Laravel и способы его реализации в вашей базе кода, и если вы хотите включить все 3 одновременно, вы можете использовать метод mustBeStrict.

Оригинал заметки

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *