Для упрощения взаимодействия в Laravel придуманы правила наименований. Правила нужны везде, а если правила не только знать но и соблюдать, то это даёт значительный прирост в скорости разработки.
Laravel наш помощник, но он будет помогать лишь в том случае, если вы работаете по его правилам! Применяя конвенцию наименований Laravel поможет автоматически находить нужные зависимые сущности!
По большей части конвенция наименований охватывает слой взаимодействия с базой данных.
Применение конвенции наименований в Laravel = простой, чистый и лаконичный код.
- Общие правила
- Таблицы базы данных
- Models
- Миграции
- Фабрики
- Политики/Policy
- Директории
- Controllers
- Routes
- Blade
- Json response
- Всегда в названиях используйте точное значение слова на английском. Не надо использовать транслит.
Если не знаете перевод слова или как оно правильно пишется - просто найдите его перевод. Заодно и словарный запас расширите) - Избегайте ошибок в написании.
- Старайтесь подбирать название так, чтобы сразу было понятно, что именно содержится в именовании.
- Не сокращайте названия без острой необходимости.
// плохо $acc $conn $descr prepResp() regEvtHandler() updCom() // хорошо $account $connection $description prepareResponse() registerEventHandler() updateComment()
Для оформлении названий таблиц принято использовать имена во множественном числе с нотацией snake_case:
snake_case — стиль написания составных слов, при котором несколько слов разделяются символом подчеркивания. Слова как бы ползут по строке, в результате получается дли_и_инное, как змея, название. В данном гайде snake_case всегда в нижнем регистре
Примеры:
usersproductsorder_products
Исключение
Связующие таблицы для отношений BelongsToMany.
Применяем snake_case + имена двух таблиц, которые будем связывать, в единственном числе. В качестве разделителя между именами таблиц используем символ нижнего подчёркивания _.
Сортируются сущности между разделителем в алфавитном порядке.
Разберём на примере: есть таблицы users и tasks, приводим обе таблицы в единственное число и разделяем через подчеркивание. Буква t в алфавите следует раньше u, поэтому результат связи двух таблиц будет - task_user.
Ну или пример посложнее: order_products и properties! Результат - order_product_property.
Примеры:
task_userevent_placeorder_product_property
Все просто - snake_case. И не забывайте общие правила о которых мы писали в одноименном разделе
Примеры:
created_atseo_title
По умолчанию Laravel ожидает id.
snake_case в формате - имя таблица в единственном числе, далее подчеркивание _ и далее Primary key ('id').
Пример - страна пользователя, где все страны в таблице countries, пользователь в таблице users
имеет foreign key для связи со страной - country_id, формат {связанная_таблица_в_единственном_числе}_{primary_key_связанной_таблицы}
Примеры:
country_idorder_product_id
PascalCase в единственном числе
PascalCase — это стиль написания имен, при котором составные слова названия идентификатора (в том числе и первое слово) пишутся слитно, и каждое новое слово начинается с большой буквы. Пример: MyVar, MyBestProgramm, WorkArray. Паскаль нотация используется для названий классов и публичных полей данных, а также именования процедур и функций.
Если мы соблюдали конвенцию наименований для таблиц, то Laravel автоматически определит таблицу для модели. Как? Приведет вашу модель в snake_case в нижнем регистре добавит подчеркивания '_' и переведёт в множественное число. Получится имя таблицы.
В итоге User будет ссылаться к таблице users, OrderProduct к order_products
Проблемы нарушения конвенции наименований:
- Если название таблицы указано не в snake_case (или название таблицы отличается от названия модели) потребуется указать в модели свойство, помогающее определить таблицу:
protected $table = 'tableName'; - тоже самое в случае с primary key -
protected $primaryKey = 'primaryKey'; - и еще масса побочных указаний для отношений)
Директория по умолчанию
app/Models
Примеры:
UserProductOrderProduct
При оформлении названия используем UPPER_CASE с разделителем подчеркивания.
Примеры:
class Document
{
const STATUS_ACTIVE = 1;
const STATUS_DELETE = 2;
const STATUS_ARCHIVE = 9;
}Свойства модели ссылаются на поля таблицы и имеют точно такие же наименования в snake_case.
Становятся доступными за счет магических php методов. Обращаясь к свойствам модели, Laravel автоматически соотнесет их с полями в таблице (если такие существуют).
Примеры:
$model->created_at$model->seo_title
При оформлении названия используем camelCase:
camelCase - стиль написания составных слов, при котором несколько слов пишутся слитно без пробелов, при этом каждое слово внутри фразы пишется с прописной буквы. Начинается с маленькой буквы. И получается верблюд (camel) с его горбами.
Примеры:
getSomething()
Наименования поля в таблице приводится к camelCase и изменяется в методе Отлично расписано в официальной документации
camelCase с префиксом scope Отлично расписано в официальной документации
Все просто - camelCase для модели с которой мы формируем отношение. Если отношение к одной записи, тогда именование оформляем в единственном числе, а если несколько - то во множественном числе!
Рассмотрим примеры для модели User c разным типом отношений к модели Country.
Примеры:
belongsTo, hasOne, hasOneThrough, morphOne=country()belongsToMany, hasMany, hasManyThrough, morphMany, morphToMany=countries()
Проблемы нарушения конвенции наименований:
- Может потребоваться указать
foreign_keyreturn $this->hasOne(Phone::class, 'foreign_key'); - Может потребоваться указать
foreign_keyиlocal_keyreturn $this->hasOne(Phone::class, 'foreign_key', 'local_key'); - Может потребоваться указать и связующую таблицу и ключи
return $this->belongsToMany(Role::class, 'role_user', 'user_id', 'role_id');
php artisan make:migration migration_name
Команда выше просто создаст пустой файл миграции, где методы up и down будут пустыми.
public function up()
{
//
}
public function down()
{
//
}Но мы также можем влиять на содержимое миграций, если будем придерживаться правил наименования, тем самым упрощая нам жизнь.
php artisan make:migration create_users_table
Мы дали понять, что хотим создать таблицу users - create_{Имя_таблицы}_table
Ключевое здесь create_{Имя_таблицы}, а вот table в конце можно пропустить
В итоге получили:
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('users');
}php artisan make:migration add_column_to_users_table
В данном примере мы сообщаем Laravel о нашем желании модифицировать таблицу и ключевое здесь to_{Имя_таблицы}, а вот table в конце можно пропустить
public function up()
{
Schema::table('users', function (Blueprint $table) {
//
});
}
public function down()
{
Schema::table('users', function (Blueprint $table) {
//
});
}Директория по умолчанию
database/factories
Взаимодействовать с фабриками мы можем посредством метода factory() в моделях. Модель автоматически определит к какому классу фабрики ей ссылаться если соблюдать конвенцию наименований.
Те же правила что и для модели, только добавляем суффикс Factory!
Формат - {ИмяМодели}Factory
Примеры:
- Модель
User, а фабрикаUserFactory - Модель
OrderProduct, фабрикаOrderProductFactory
Директория по умолчанию
app/Policies
Laravel может автоматически определить политику для модели при соблюдении конвенции наименований. В таком случае политику не требуется регистрировать "вручную".
Используем те же правила, что и для модели, только добавляем суффикс Policy!
Формат - {ИмяМодели}Policy
Примеры:
- Модель
User, а политикаUserPolicy - Модель
OrderProduct, политикаOrderProductPolicy
Никак не влияют на взаимодействие с Laravel, но делают код понятнее для всех кто будет с ним взаимодействовать.
PascalCase во множественном числе.
Примеры:
ModelsQueryBuildersFilters
Laravel дает свободу в расположении сущностей и наименовании директорий.
Как пример, если мы используем DDD подход, то нас никто не ограничивает перенести всю бизнес логику в директорию src. Также перенести в src /app и назвать скажем App
Но сами группы абстракций в хороших практиках именуются как в примере выше.
Директория по умолчанию
app/Http/Controllers
PascalCase в единственном числе c суффиксом Controller.
Примеры
CatalogControllerProductControllerOrderControllerBlogController
snake_case либо kebab-case, пользуйтесь здравым смыслом выбирая между единственным либо множественным числом.
apiResource и resource указываются во множественном числе, несмотря на то, что контроллер остается в единственном числе.
kebab-case стиль написания в котором слова в нижнем регистре разделяют символом дефиса. Можно представить, что слова при этом как бы насаживают на шампур — вот и получается шашлык (kebab).
Примеры
Route::get('catalog', CatalogController::class)Route::get('categories', CategoryController::class)Route::resource('users', UserController::class)Route::apiResource('users', UserController::class)
snake_case во множественном числе, несмотря на то, что контроллер остается в единственном числе.
snake_case
Ключи в snake_case