Skip to content

Instantly share code, notes, and snippets.

@yesnik
Last active February 10, 2020 21:47
Show Gist options
  • Save yesnik/9ac702dc0f99434c4055fc725711b76e to your computer and use it in GitHub Desktop.
Save yesnik/9ac702dc0f99434c4055fc725711b76e to your computer and use it in GitHub Desktop.
Laravel рецепты

Команды консоли

Модель

Создать модель и файл миграции

php artisan make:model Book -m

Будет создано 2 файла:

  • app/Book.php
  • database/migrations/YYYY_MM_DD_XXXXXXX_create_books_table.php

Определить mass assign атрибуты

Чтобы иметь возможность массово присваивать атрибуты модели, нужно указать их в файле модели, к примеру app/Product.php:

class Product extends Model
{
    protected $fillable = ['name', 'price'];
}

Контроллер

Создать контроллер

php artisan make:controller ProductController --resource

Будет создан файл: app/Http/Controllers/ProductController.php

Посмотреть список доступных роутов приложения

php artisan route:list

Роуты

Добавить ресурс

В файл routes/web.php добавить:

Route::resource('products', 'ProductController');

При этом подразумевается, что в контроллере будут определены экшены ресурса (index, create, store, show, edit, update, destroy).

Миграции

Создать файл миграции

php artisan make:migration create_links_table

Будет создан файл миграции в database/migrations:

// ...
Schema::create('links', function (Blueprint $table) {
    $table->increments('id');
    
    $table->integer('weight');
    $table->string('title');
    $table->string('url')->unique();
    $table->text('description');
    
    // Эта команда создаст в базе поля created_at, updated_at
    $table->timestamps();
});

Применить миграции

php artisan migrate

Откатить последнюю миграцию

php artisan migrate:rollback

Тестовые данные

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

Добавьте в database/factories/ModelFactory.php:

$factory->define(App\Link::class, function (Faker\Generator $faker) {
    return [
        'title' => $faker->name,
        'url' => $faker->url,
        'description' => $faker->paragraph,
    ];
});

Создать класс для заполнения таблицы тестовыми данными

php artisan make:seeder LinksTableSeeder

Будет создан файл: database/seeds/LinksTableSeeder.php

Добавим туда команду по созданию 10 тестовых записей. При этом будет использоваться фабрика, определенная в database/factories/ModelFactory.php для класса App\Link:

// ...
public function run()
{
    factory(App\Link::class, 10)->create();
}

Чтобы использовать класс LinksTableSeeder, его нужно вызвать в файле database/seeds/DatabaseSeeder.php, отвечающем за наполнение всех таблиц тестовыми данными:

// ...
public function run()
{
    $this->call(LinksTableSeeder::class);
}

Заполнить таблицы тестовыми данными

php artisan migrate --seed

Работа с assets

В laravel 5.5 для работы с ассетами используется mix, который заменяет использовавшийся ранее elixir. Инструмент mix основывается на более универсальном webpack, тогда как elixir опирался на gulp.

Команды mix

  • Запустить все mix-команды
npm run dev
  • Запустить все mix-команды и минифицировать вывод
npm run production
  • Запустить отслеживание изменений css, js файлов и их автоматическую компиляцию
npm run watch

Настройка mix

Настройки mix расположены в файле webpack.mix.js:

// ...

mix
  .js('resources/assets/js/app.js', 'public/js')
  .sass('resources/assets/sass/app.scss', 'public/css');

При компиляции:

  • файл resources/assets/js/app.js будет преобразован в public/js/app.js
  • файл resources/assets/sass/app.scss будет преобразован в public/css/app.css

Если нужно будет добавить новые файлы стилей, их можно поместить, к примеру, в resources/assets/sass/products.scss. Чтобы содержимое этого файла появилось в финальном файле app.css, нужно импортировать этот файл в resources/assets/sass/app.scss:

@import "products";

Модели

Команды ORM

  • Найти запись по id
$product = Product::find(5);
  • Связанные модели
$product->categories
  • Число связанных моделей
$product->categories->count(); // 6
  • Проверить существование связанных моделей
$product->categories()->exists(); // true | false
  • Добавить связанную модель
$category = Category::find(5);
$product->categories()->attach($category);
  • Удалить связанные модели
$product->categories()->detach(); // 0 | 1

Контроллеры

Валидация параметров в контроллере

Валидация параметров, переданных с формы, идет в методе контроллера. Рассмотрим метод store контроллера app/Http/Controllers/ProductController.php:

// ...
public function store(Request $request) {
    // Валидируем параметры, пришедшие с формы. 
    // Если они окажутся ошибочными, остальная часть кода этого метода не будет выполнена
    $params = $request->validate([
        'name' => 'required',
        'price' => 'required|numeric'
    ]);
    
    $product = Product::create($params);
}

Миграции

Создать внешний ключ на таблицу

Schema::table('posts', function(Blueprint $table)) {
    $table->foreign('user_id')->references('id')->on('users');
});

На колонке user_id таблицы posts будет создан внешний ключ на колонку id таблицы users.

Важно: Колонки должны иметь одинаковый формат, иначе внешний ключ не будет создан. В общем случае колонка user_id должна быть создана такой командой (обратите внимание на unsigned):

// ...
$table->integer('user_id')->unsigned();

Хэлперы

Аналог var_dump в laravel

В laravel, чтобы отобразить на странице значение переменной, можно использовать функции:

dump($someVar); // выполнение скипта продолжится
dd($someVar); // выполнение скрипта будет прервано
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment