Автор оригинала: David Wong.
Laravel хорошо известен разработчикам PHP своим чистым, отлаживаемым кодом. Он также поддерживает множество функций, иногда не отраженных в документе, или по какой-то причине они появляются и удаляются.
Я использую Laravel в производственной среде в течение двух лет, и я научился улучшать код, и я в полной мере использовал его преимущества с тех пор, как я впервые его использовал. Далее я покажу вам некоторые мифы, которые могут быть полезны при написании кода в Laravel.
- *
Используйте локальные области при запросе данных
У Laravel есть отличный способ писать запросы с помощью конструкторов запросов. Подобный этому:
$orders = Order::where('status', 'delivered')->where('paid', true)->get();Очень хорошо. Это позволяет мне сосредоточиться на написании более удобного кода, а не инструкций SQL. Но если мы используем локальную область, мы можем улучшить эту строку кода.
При запросе данных локальные области позволяют нам создавать собственный метод цепочки конструкторов запросов. Например, замените ->где () Мы можем использовать более краткие выражения. ->доставлено() Сумма ->оплачено() 。
Прежде всего Заказ В модель мы добавляем некоторые методы:
class Order extends Model
{
...
public function scopeDelivered($query) {
return $query->where('status', 'delivered');
}
public function scopePaid($query) {
return $query->where('paid', true);
}
}При объявлении локальной области вы должны использовать сфера применения[Что-то] Назови это. Затем Laravel узнает, что это локальная область и ее можно использовать в конструкторе запросов. Убедитесь, что вы передали первый параметр в методе $query То есть экземпляр конструктора запросов, автоматически введенный Laravel.
$orders = Order::delivered()->paid()->get();
Для запросов, которые принимают дополнительные параметры, можно использовать динамические области. Каждый диапазон позволяет передавать дополнительные параметры.
class Order extends Model
{
...
public function scopeStatus($query, string $status) {
return $query->where('status', $status);
}
}
$orders = Order::status('delivered')->paid()->get();Позже в этой статье вы увидите, почему следует использовать поля базы данных Змеиное имя Но вот первая причина: Laravel по умолчанию где[что-то] Чтобы заменить область действия[Что-то] 。 Так как статус области Вместо области действия вы можете сделать это:
Order::whereStatus('delivered')->paid()->get();о где[Что-то] Ларавель будет искать Имя змеи Версия поля базы данных. Если у вас есть один в вашей базе данных статус Поля, вы можете использовать приведенный выше пример. Если таковой имеется отправка_статус Поля, которые вы можете использовать:
Order::whereShippingStatus('delivered')->paid()->get();Все зависит от тебя!
При необходимости используйте классы запросов
Laravel предоставляет отличный способ проверки данных, представленных в формах. Если вам это нужно, его можно проверить, будь то сообщение или запрос на получение.
В контроллере вы можете сделать это:
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
// If the content of this blog is invalid...
}Но когда в контроллере много кода, добавление кода для проверки данных формы может быть беспорядочным. Вы хотите максимально сократить код контроллера – по крайней мере, это первое, о чем я думаю, когда пишу много логики в контроллере.
Laravel предоставляет зародышевый способ проверки запросов форм путем создания и использования специализированных классов запросов вместо исходных. Запрос 。 Вам просто нужно создать свой класс запроса:
php artisan make:request StoreBlogPost
оставайтесь приложение/Http/Запросы/ Вы можете найти класс запроса, который вы только что создали, в каталоге:
class StoreBlogPostRequest extends FormRequest
{
public function authorize()
{
return $this->user()->can('create.posts');
}
public function rules()
{
return [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
];
}
}Теперь вы должны использовать недавно созданный App\Http\Запросы\Запрос на запись в блоге магазина Чтобы заменить оригинал Осветить\Http\Запрос Класс:
use App\Http\Requests\StoreBlogPostRequest;
public function store(StoreBlogPostRequest $request)
{
// If the content of this blog is invalid...
}В классе запроса authorize() Метод должен возвращать логическое значение. Если он возвращает false Он бросает один 403 Исключения, пожалуйста, убедитесь, что вы находитесь в uuuuuuuuuu/| app/Exceptions/Handler.php Из рендеринга() Это исключение фиксируется в методе:
public function render($request, Exception $exception)
{
if ($exception instanceof \Illuminate\Auth\Access\AuthorizationException) {
//
}
return parent::render($request, $exception);
}В классе запросов есть еще один. сообщения() Метод, при сбое проверки он возвращает массив, содержащий информацию об ошибке:
class StoreBlogPostRequest extends FormRequest
{
public function authorize()
{
return $this->user()->can('create.posts');
}
public function rules()
{
return [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
];
}
public function messages()
{
return [
'title.required' => 'The title is required.',
'title.unique' => 'The post title already exists.',
...
];
}
}@if ($errors->any())
@foreach ($errors->all() as $error)
{{ $error }}
@endforeach
@endifЕсли вы хотите получить информацию о проверке для поля, вы можете сделать это (когда проверка поля пройдет) $ошибки->имеет() $ошибки->имеет()
@if ($errors->has('title'))
@endifДиапазон магии
При построении запросов вы можете использовать существующие магические области:
- согласно
created_atОбратному запросу:
User::latest()->get();
- Запрос в обратном порядке в соответствии с любым полем:
User::latest('last_login_at')->get();- Случайные запросы (то есть в операторах SQL)
ЗАКАЗ ОТ РЭНДА())
User::inRandomOrder()->get();
Используйте ассоциацию вместо длинных запросов (или плохо написанных).
Вы когда-нибудь использовали много операций объединения в операторах запроса, чтобы получить больше информации? Даже с помощью конструкторов запросов трудно писать такие инструкции SQL, но модели данных уже используют ассоциативные связи для достижения той же функции. Документация содержит слишком много информации, поэтому вы можете сначала не быть знакомы с этими отношениями, но это может помочь вам лучше понять, как все работает, и сделать вашу программу более плавной.
Запросите соответствующие документы здесь.
Используйте системы задач для выполнения трудоемких задач
Задача Laravel – запускать программы в фоновом режиме с помощью мощных инструментов.
- Вы хотите отправить электронное письмо? Система задач.
- Вы хотите передать сообщение в эфир? Система задач.
- Вы хотите обработать картинку? Система задач.
Система задач может помочь вам выполнить эти задачи и сократить время загрузки приложений ваших пользователей. Эти задачи могут быть помещены в именованные очереди, они могут быть расставлены по приоритетам, и Laravel реализует очереди практически везде, где это возможно: независимо от того, выполняются ли задачи PHP в фоновом режиме, отправляются сообщения или транслируются события, очереди появляются в этих сценариях.
Вы можете запросить документы очереди здесь.
При использовании очередей мне нравится использовать Laravel Horizon, потому что его легко установить, он может работать в фоновом режиме с помощью инструментов супервизора или файлов конфигурации, и я могу указать Horizon, сколько процессов я хочу, чтобы каждая очередь создавалась.
Соответствие стандартам баз данных – средства доступа
Ларавель с самого начала учил вас, что переменные и методы должны использоваться как $camelCase верблЮжий чемодан() Называя такие горбы и используя поля базы данных, такие как змеиный кейс Такое змеиное имя. Почему? Потому что это помогает нам создавать лучшие аксессуары.
Аксессуары-это настраиваемые поля, которые могут быть созданы непосредственно в модели. Если наша база данных содержит имя пользователя 、 фамилия 、 возраст Для этих полей мы можем добавить одно под названием имя Настраиваемые поля для имя пользователя и фамилия Сшейте вместе. Не волнуйся, это одно имя Он не будет записан в базу данных. Это просто пользовательское свойство модели. Все аксессуары, такие как область, имеют пользовательский синтаксис именования: получить что-то Атрибут :
class User extends Model
{
...
public function getNameAttribute(): string
{
return $this->first_name.' '.$this->last_name;
}
}При использовании $пользователь->имя Средство доступа возвращает объединенную строку.
- *
По умолчанию dd($пользователь) Вы не можете этого видеть. имя Атрибут, но через uuuuuuuuuuu $добавляет Переменные могут использоваться все время:
class User extends Model
{
protected $appends = [
'name',
];
...
public function getNameAttribute(): string
{
return $this->first_name.' '.$this->last_name;
}
}Теперь каждый раз dd($пользователь) Мы все можем видеть имя Сейчас. (Тем не менее, это свойство не приобретается из базы данных, но используется каждый раз. имя пользователя и фамилия Шитье.
Обратите внимание, что если он уже есть в вашей базе данных имя Это поле, тогда ситуация будет немного другой: $добавляет Массив имя Элемент не нужен, и тогда средство доступа должно передать параметр, который находится в базе данных. имя То есть, нам больше не нужно его использовать. $это Сейчас.
Например, мы могли бы использовать ucfirst() Чтобы заглавными буквами написать инициалы имени:
class User extends Model
{
protected $appends = [
//
];
...
public function getFirstNameAttribute($firstName): string
{
return ucfirst($firstName);
}
public function getLastNameAttribute($lastName): string
{
return ucfirst($lastName);
}
}Теперь, когда мы его используем $ пользователь->имя пользователя Он возвращает строку с заглавными буквами.
Из-за этой функции лучше всего использовать поля базы данных змеиный кейс Это змеиное имя.
Не храните статические данные, связанные с моделью, в файлах конфигурации
Мне нравится хранить статические данные, связанные с моделями, в файлах моделей. Давайте взглянем.
Не будьте такими, как следующие:
Не будьте такими, как следующие:
class BettingOdds extends Model
{
...
}config/bettingOdds.php
return [
'sports' => [
'soccer' => 'sport:1',
'tennis' => 'sport:2',
'basketball' => 'sport:3',
...
],
];Доступ осуществляется следующим образом:
config('bettingOdds.sports.soccer');Я предпочитаю делать это:
Я предпочитаю делать это:
class BettingOdds extends Model
{
protected static $sports = [
'soccer' => 'sport:1',
'tennis' => 'sport:2',
'basketball' => 'sport:3',
...
];
}Затем получите к ним доступ:
BettingOdds::$sports['soccer'];
Почему все так складывается? Потому что это выгодно для последующих операций:
class BettingOdds extends Model
{
protected static $sports = [
'soccer' => 'sport:1',
'tennis' => 'sport:2',
'basketball' => 'sport:3',
...
];
public function scopeSport($query, string $sport)
{
if (! isset(self::$sports[$sport])) {
return $query;
}
return $query->where('sport_id', self::$sports[$sport]);
}
}Теперь мы можем использовать запросы диапазона:
BettingOdds::sport('soccer')->get();Замена исходной обработки массива коллекциями
В прошлом мы использовали массивы примитивным способом:
$fruits = ['apple', 'pear', 'banana', 'strawberry'];
foreach ($fruits as $fruit) {
echo 'I have '. $fruit;
}Теперь мы можем использовать усовершенствованный метод для обработки данных в массивах. Мы можем фильтровать, преобразовывать, просматривать и изменять данные в массиве:
$fruits = collect($fruits);
$fruits = $fruits->reject(function ($fruit) {
return $fruit === 'apple';
})->toArray();
['pear', 'banana', 'strawberry']Дополнительные сведения см. в документации по коллекции.
При использовании конструктора запроса ->get() Метод возвращает один Коллекция Примеры. Но будьте осторожны, чтобы не запутаться. Коллекция Сумма Запрос конструктор:
- Мы не можем получить никаких данных из конструктора запросов. Но у нас есть большое количество методов, связанных с запросами, для использования:
упорядочить по(),где()И так далее. - Последний вызов
->get()После выполнения метода данные будут получены, а объем памяти будет израсходован. Он возвращает один.СборникПримеры. Некоторые конструкторы запросов недоступны или доступны, но имена методов разные. Для этого, пожалуйста, обратитесь к методам всех коллекций.
Если вы можете Конструктор запросов Иерархическая фильтрация данных, продолжайте! Не полагайтесь на ожидание результатов. Коллекция Фильтруйте экземпляры, когда они вернутся – вы потребите больше места в памяти. Ограничение используется для ограничения количества результатов, а индекс используется для ускорения запросов на уровне БД.
Хорошо используйте пакеты расширения и не повторяйте колеса
Вот некоторые расширения, которые я использую:
- Директивы Laravel Blade
- Laravel CORS
- Помощник по тегам Laravel (проще использовать HTML-теги в Blade)
- Laravel Sluggable (очень полезно при создании слага в красноречивой модели)
- Ответчик Laravel (проще построить JSON API)
- Вмешательство в Изображение
- Горизонт (очередями можно управлять с помощью небольшого количества настроек)
- Socialite (интеграция сторонних логинов в социальных сетях с небольшим количеством настроек)
- Паспорт (Интегрированная маршрутизация OAuth)
- Журнал активности Спати
- Резервная копия Spatie (резервные копии файлов и баз данных)
- Лезвие Spatie-X (Определите свой собственный HTML-тег; может быть объединен с Laravel TagHelper)
- Медиатека Spatie (быстрое сопоставление моделей с файлами)
- Кэш ответов пациента
- Макросы коллекции Spatie (добавьте дополнительные макросы в коллекцию)
Ниже приведены некоторые расширения, которые я (первоначальный автор) написал:
- Подружился
- Расписание (Создайте календарь и проверьте, доступен ли момент времени)
- Рейтинг (добавление функции оценки в модель)
- Опекун (простая в использовании система привилегий)
Слишком трудно понять? Свяжитесь со мной!
Если у вас есть еще вопросы о Laravel, если вам нужна помощь в операциях или вы просто хотите что-то сказать. Спасибо Вы можете найти меня на [электронная почта защищена] !
От сообщества разработчиков PHP/Laravel https://laravel -China.org/top…
Оригинал: “https://developpaper.com/laravel-5-7-best-practices-and-development-skills-sharing/”