Фреймворк Laravel – это довольно сильный фреймворк. Вы постоянно удивляетесь, когда глубоко погружаетесь в его структуру из-за ее красоты, расширяемости и искусства кода. В этой статье я собираюсь представить еще одну классную особенность Laravel – макросы. Это дает вам больше гибкости для расширения основных классов Laravel! Вы можете сделать больше вещей с помощью функции макроса, которая по умолчанию не предлагается Laravel! Большинство основных классов Laravel являются макро-управляемыми, которые я перечислю в конце этой статьи.
Давайте поговорим о реальном примере, когда мы делаем RESTful API, нам нужно дать ответ в стандартном формате JSON. Обычно мы даем примерно следующий ответ нашего API
// for success
return response()->json(['success' => true,'message' => 'Successful']);
//for fail
return response()->json(['success' => false,'message' => 'Failed']);
Делаем макрос в Laravel
Давайте добавим классу response новый метод success, который будет отдавать данные в едином формате. Для этого мы можем использовать наши макросы. Давайте так и сделаем. Нам нужно сделать наш собственный макрос в методе загрузки AppServiceProvider.php
//app/Providers/AppServiceProvider.php
public function boot()
{
Response::macro('success', function ($message) {
return ['success' => true,'message' => $message];
});
Response::macro('fail', function ($message) {
return ['success' => false,'message' => $message];
});
}
Использование макросов в Laravel
– Готово! теперь мы можем использовать success
и fail
методы из класса Response во всем нашем приложении, как показано ниже.
Успешное действие
return response()->success('Successful');
Вывод
{
"success": true,
"message": "Successful"
}
Ошибочное действие
return response()->fail('Failed!');
Вывод
{
"success": true,
"message": "Failed!"
}
Несколько макросов
Если нам нужно больше макросов, то метод AppServiceProvider::boot будет все больше и больше. В этой ситуации мы можем использовать микширование в app/Mixins
namespace App\Mixins;
use Illuminate\Support\Facades\Response;
class ReponseMixin
{
Response::macro('success', function ($message) {
return ['success' => true,'message' => $message];
});
Response::macro('fail', function ($message) {
return ['success' => false,'message' => $message];
});
Response::macro('data', function ($data) {
return ['success' => false,'data' => $data];
});
}
теперь в методе boot мы можем просто зарегистрировать наши миксины.
//app/Providers/AppServiceProvider.php
public function boot()
{
Response::mixin(new ReponseMixin);
}
Классы Laravel, которые можно расширять с использованием макросов
Вы можете создать свой собственный макрос с помощью этих основных классов Laravel.
- Request: Illuminate\Http\Request
- Response: Illuminate\Http\Response
- Collection: Illuminate\Support\Collection
- Str: Illuminate\Support\Str
- Router: Illuminate\Routing\Router
- UrlGenerator: Illuminate\Routing\UrlGenerator
- Cache: Illuminate\Cache\Repository
- Filesystem: Illuminate\Filesystem\Filesystem
- Arr: Illuminate\Support\Arr
- Rule: Illuminate\Validation\Rule