Жизнь разработчика
3 subscribers
Пишу о том что происходит в жизни разработчика (Laravel, PHP, JS, Vue, Unity и Unreal для души)
Download Telegram
Всем доброго времени суток.
Совсем недавно, при написании тестов на Laravel, решили использовать Pest.
Изучив его документацию мы поняли что он выглядит гораздо лаконичнее и проще чем PHPUnit. Но мы столкнулись с одной проблемой, когда делаешь Mocking фасадов Laravel, в частности Http::fake() и Http::preventStrayRequests(). Получали следующую ошибку

Call to a member function {function} on null

Такая ошибка появлялась только в Unit тестах, в Feature же такого не наблюдалось

Потратив какое то время на гугление не нашли решение в самом гугле.
При обсуждении один из разработчиков вспомнил, что да, действительно, такая же ошибка появляется когда используешь PHPUnit для Unit тестов в Laravel.

Там это решается довольно просто.

// Меняем данный use в классе теста
use PHPUnit\Framework\TestCase;

// на следующий use
use Tests\TestCase;

Но тогда возник вопрос, а как сделать так чтобы use Tests\TestCase; использовался в pest?

Все оказалось проще, не надо это делать в каждом файле тестов. Просто выполняем команду, которая создаст в корне testing директории Pest.php файл.

./vendor/bin/pest --init

В данном файле размещаем следующий код.

uses(
Tests\TestCase::class,
)->in('Unit');


Что даст нам спокойно делать Mocking фасадов Laravel.

Всем спасибо за внимание.
Далее о тестировании.

Мы с командой используем Laravel Sail для локальной разработки. По умолчанию он уже включает в себя все инструменты для отладки (XDebug) и тестирования (PHPUnit, PCOV)

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

sail artisan test --coverage

В случае если какой то код находится за пределами папки 'app', то покрытие кода тестами не считается от слова совсем.

После некоторого изучения документации выяснилось, что внутри докера (sail) PCOV считает покрытие только внутри директории '/var/www/html/app'

Решается все довольно просто, в php.ini нужной конфигурации sail необходимо добавить

[pcov]
pcov.directory=/var/www/html

И пересобрать контейнер.

Все, покрытие считается корректно.
Channel name was changed to «Жизнь разработчика (Web и GameDev)»
Всем привет! Сегодня поговорим о паттерне "Фабрика" (Factory Pattern) и как он помогает нам в Laravel.

Представьте, что вы строите конвейер игрушек. Вместо того, чтобы каждый раз собирать игрушку с нуля, вы настраиваете машину (фабрику), которая будет это делать за вас. Так и в программировании: фабрика это класс или метод, который создаёт объекты другого класса.

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

Пример фабрики в Laravel:

// database/factories/UserFactory.php

/** @var \Illuminate\Database\Eloquent\Factory $factory */
$factory->define(App\User::class, function (Faker\Generator $faker) {
    return [
        'name' => $faker->name,
        'email' => $faker->unique()->safeEmail,
        'password' => bcrypt('secret'), // пароль
        'remember_token' => Str::random(10),
    ];
});


Использование фабрики для создания пользователя:

$user = factory(App\User::class)->create();


Также можно создать несколько пользователей одновременно:

$users = factory(App\User::class, 10)->create();


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

Теперь вы знаете, что такое паттерн "Фабрика" и как он используется в Laravel. Применяйте его на практике, и ваш код станет ещё лучше!

Спасибо за внимание и до новых встреч в мире Laravel! 🚀🛠
Channel name was changed to «Жизнь разработчика»
Привет, Laravel-разработчики! Сегодня мы поговорим о ресурсах (Resources), которые представляют собой мощный инструмент для трансформации данных в Laravel.

Ресурсы Laravel позволяют нам легко и удобно преобразовывать модели Eloquent и коллекции в JSON. Это особенно полезно при построении API, где вам нужно представить данные в структурированном формате.

Допустим, у нас есть API, который возвращает информацию о пользователях. Вместо того чтобы возвращать все поля модели User, мы можем использовать ресурс для определения точной структуры ответа.

Пример ресурса в Laravel:

// app/Http/Resources/UserResource.php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class UserResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
'created_at' => $this->created_at->toDateString(),
'updated_at' => $this->updated_at->toDateString(),
];
}
}


Использование ресурса для возврата данных пользователя:

use App\Http\Resources\UserResource;
use App\User;

// Возвращаем одного пользователя
public function show(User $user)
{
return new UserResource($user);
}

// Возвращаем коллекцию пользователей
public function index()
{
return UserResource::collection(User::all());
}


Ресурсы позволяют вам легко изменять структуру данных без изменения основной бизнес-логики приложения. Также они поддерживают дополнительные данные (meta data) и пагинацию, делая их идеальным выбором для API.

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

return (new UserResource($user))
->additional(['meta' => [
'key' => 'value',
]]);


Используя ресурсы, вы обеспечиваете согласованность API и упрощаете процесс его разработки.

Спасибо за внимание! Применяйте ресурсы для создания чистых и эффективных API в Laravel, и до скорых встреч в мире кодинга! 🌐🔧
Всем привет! Сегодня поговорим о ресурсе в Laravel и о том, как он может упростить нашу работу с API и преобразованием данных.

Представьте, что вы управляете библиотекой. У вас есть множество книг, и каждая из них имеет много информации: автор, жанр, год издания и так далее. Но когда посетитель просит информацию о книге, вы не предоставляете ему все данные, а только те, которые ему действительно нужны. Так и в программировании: ресурс в Laravel помогает нам преобразовать модель или коллекцию моделей в удобный для клиента формат.

В Laravel ресурсы используются для преобразования объектов Eloquent в JSON-ответы. Это позволяет нам контролировать, какие данные будут возвращены клиенту, и обеспечить их единообразие.

Пример ресурса в Laravel:

// app/Http/Resources/BookResource.php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class BookResource extends JsonResource
{
public function toArray($request)
{
return [
'id' => $this->whenHas('id'),
'title' => $this->whenHas('title'),
'author' => $this->whenHas('author'),
'published_year' => $this->whenHas('published_year'),
// добавляем другие необходимые поля
];
}
}


Использование ресурса для возврата данных о книге:

use App\Http\Resources\BookResource;
use App\Models\Book;

public function show($id)
{
$book = Book::findOrFail($id);
return BookResource::make($book);
}


Также можно использовать коллекцию ресурсов для работы с несколькими записями:

use App\Http\Resources\BookResource;
use App\Models\Book;

public function index()
{
$books = Book::all();
return BookResource::collection($books);
}


Ресурсы упрощают работу с данными, обеспечивая их консистентность и гибкость. Они позволяют легко добавлять или удалять поля без необходимости изменять код во многих местах.

Теперь вы знаете, что такое ресурсы в Laravel и как они помогают управлять данными в ваших приложениях. Используйте их, чтобы сделать ваш API более эффективным и удобным!