Может войдёшь?
Черновики Написать статью Профиль

Быстрый старт

перевод документация 5.х

  1. 1. Введение
  2. 2. Установка
  3. 3. Подготовка базы данных
    1. 3.1. Миграции БД
  4. 4. Модели Eloquent
  5. 5. Маршрутизация
    1. 5.1. Заглушки маршрутов
    2. 5.2. Вывод представления
  6. 6. Создание макетов и представлений
    1. 6.1. Определяем макет
    2. 6.2. Определяем дочернее представление
      1. 6.2.1. Несколько разъясняющих замечаний
  7. 7. Добавление задач
    1. 7.1. Проверка ввода
      1. 7.1.1. Переменная PHP$errors
    2. 7.2. Создание задачи
    3. 7.3. Отображение существующих задач
  8. 8. Удаление задач
    1. 8.1. Добавление кнопки удаления задачи
      1. 8.1.1. Примечание по спуфингу метода
    2. 8.2. Удаление задачи
Этот перевод актуален для англоязычной документации на (ветка 5.2) и (ветка 5.1). Опечатка? Выдели и нажми Ctrl+Enter.

Данная статья документации актуальна только для версий 5.2 и 5.1 и была удалена в версии 5.3.

Введение

Это руководство позволит вам быстро освоить фреймворк Laravel. Оно содержит информацию о миграциях баз данных, Eloquent ORM, маршрутизации, проверке ввода, представлениях и Blade-шаблонах. Это отличная отправная точка для новичков в фреймворке Laravel и PHP-фреймворках в целом. Если вы уже использовали Laravel или другие PHP-фреймворки, вы можете ознакомиться с нашими более продвинутыми руководствами.

Чтобы рассмотреть основной набор функций Laravel, мы создадим простой список задач и будем придерживаться его (типичный пример списка «to-do»). Полный финальный вариант исходного кода для этого проекта доступен на GitHub.

Установка

Установка Laravel

Конечно, в первую очередь вам будет нужен свежий фреймворк Laravel. Чтобы запустить его, вы можете использовать виртуальную машину Homestead или локальную PHP-среду на ваш выбор. Как только ваше окружение будет готово, вы можете установить фреймворк Laravel, используя Composer:

shcomposer create-project laravel/laravel quickstart --prefer-dist

Установка проекта Quickstart (не обязательно)

Вы можете просто прочитать данное руководство. Однако, если вы хотите загрузить исходный код для этого руководства и выполнить его на локальной машине, то можете клонировать Git хранилище и установить зависимости:

shgit clone https://github.com/laravel/quickstart-basic quickstart
cd quickstart
composer install
php artisan migrate

Больше информации относительно создания локальной среды разработки Laravel вы сможете найти в документации по Homestead и по установке.

Подготовка базы данных

Миграции БД

Во-первых, давайте использовать миграцию для определения таблицы базы данных для хранения всех наших задач. Миграции БД в Laravel позволяют простым способом определить структуру таблицы базы данных и выполнять модификации с использованием простого и выразительного PHP кода. Вместо того чтобы вручную добавлять столбцы в свои локальные копии БД, ваши товарищи по команде могут просто запустить миграции, которые вы поместили в систему управления версиями.

Итак, давайте создадим таблицу БД, которая будет содержать все наши задачи. Для создания различных классов может быть использован интерфейс Artisan. Он избавит вас от ручной генерации кода при создании проектов Laravel. Поэтому давайте используем команду shmake:migration для создания миграции новой базы данных для нашей таблицы tasks:

shphp artisan make:migration create_tasks_table --create=tasks

Миграция будет помещена в каталог database/migrations вашего проекта. Как вы могли заметить, команда shmake:migration уже добавила автоинкремент ID и метки времени к файлу миграции. Давайте отредактируем этот файл и добавим дополнительный столбец string для имён наших задач:

PHP
<?php

  
use Illuminate\Database\Schema\Blueprint;
  use 
Illuminate\Database\Migrations\Migration;

  class 
CreateTasksTable extends Migration
  
{
    
/**
    * Запуск миграций
    *
    * @return void
    */
    
public function up()
    {
      
Schema::create('tasks', function (Blueprint $table) {
        
$table->increments('id');
        
$table->string('name');
        
$table->timestamps();
      });
    }

    
/**
    * Откатить миграции
    *
    * @return void
    */
    
public function down()
    {
      
Schema::drop('tasks');
    }
  }

Чтобы запустить нашу миграцию, мы будем использовать команду Artisan shmigrate. Если вы используете Homestead, вы должны выполнить эту команду в своей виртуальной машине, так как у вашей host-машины не будет прямого доступа к базе данных:

shphp artisan migrate

Эта команда создаст все наши таблицы БД. Если вы просматриваете таблицы БД, используя какой-либо клиент, вы должны заметить новую таблицу tasks, которая содержит столбцы, определённые в нашей миграции. Теперь мы готовы определить модель Eloquent ORM для наших задач!

Модели Eloquent

Eloquent — это стандартное ORM для Laravel (объектно-реляционное отображение). Eloquent делает безболезненным получение и хранение данных в вашей базе данных, используя чётко определённые «модели». Обычно, каждая Eloquent модель однозначно соответствует одной таблице базы данных.

Давайте определим модель Task, которая будет соответствовать только что созданной нами таблице tasks. Мы снова можем использовать команду Artisan, чтобы сгенерировать эту модель. В этом случае мы будем использовать команду shmake:model:

shphp artisan make:model Task

Модель будет помещена в каталог app вашего приложения. По умолчанию класс модели пуст. Нам не надо явно указывать, какой таблице соответствует Eloquent модель, потому что подразумевается, что имя таблицы – это имя модели во множественном числе (s на конце). В этом случае модель Task, как предполагается, соответствует таблице базы данных tasks. Вот на что должна быть похожа наша пустая модель:

PHP
<?php

  
namespace App;

  use 
Illuminate\Database\Eloquent\Model;

  class 
Task extends Model
  
{
    
//
  
}

Мы ещё познакомимся чуть ближе с моделями Eloquent, когда добавим маршруты к нашему приложению. Разумеется, вы можете заглянуть и в полную документацию по Eloquent для получения дополнительной информации.

Маршрутизация

Заглушки маршрутов

Теперь можно добавить несколько маршрутов в наше приложение. Маршруты используются для связи URL с контроллерами или анонимными функциями, которые должны быть выполнены, когда пользователь переходит на данную страницу. По умолчанию все маршруты Laravel определены в файле app/Http/routes.php, который автоматически добавляется в каждый новый проект.

Для нашего приложения нам будут нужны по крайней мере три маршрута: маршрут для вывода на экран списка всех наших задач, маршрут для добавления новых задач и маршрут для удаления существующих задач. Давайте напишем заглушки для всех этих маршрутов в файле app/Http/routes.php:

PHP
<?php

  
use App\Task;
  use 
Illuminate\Http\Request;

  
/**
   * Вывести панель с задачами
   */
  
Route::get('/', function () {
    
//
  
});

  
/**
   * Добавить новую задачу
   */
  
Route::post('/task', function (Request $request) {
    
//
  
});

  
/**
   * Удалить задачу
   */
  
Route::delete('/task/{task}', function (Task $task) {
    
//
  
});

Если в вашей копии Laravel есть RouteServiceProvider, который уже содержит файл маршрутов по умолчанию в группе посредников web, то вам не надо вручную добавлять группу в ваш файл routes.php.

Вывод представления

Давайте заполним наш маршрут /. По этому маршруту мы хотим отрисовывать HTML-шаблон, который содержит форму добавления новой задачи, а также список всех текущих задач.

В Laravel все HTML-шаблоны хранятся в каталоге resources/views, и мы можем использовать вспомогательную функцию PHPview(), чтобы возвратить один из этих шаблонов по нашему маршруту:

PHP
Route::get('/', function () {
  return 
view('tasks');
});

Передача tasks в функцию PHPview() создаст экземпляр объекта View, который соответствует шаблону resources/views/tasks.blade.php.

Конечно, нам необходимо создать это представление, поэтому давайте сделаем это!

Создание макетов и представлений

Наше приложение содержит одно представление с формой добавления новых задач, а также список всех текущих задач. Чтобы помочь вам визуализировать представление, мы сделали скриншот законченного приложения со стандартными стилями Bootstrap CSS:

/packages/proger/habravel/uploads/374-basic-overview.png

Определяем макет

Почти все веб-приложения используют один макет на всех своих страницах. Например, у нашего приложения есть верхняя панель навигации, которая присутствовала бы на каждой странице (если бы у нас их было больше одной). Laravel упрощает использование этих общих функций на всех страницах, используя макеты Blade.

Как мы выяснили ранее, все представления Laravel хранятся в resources/views. Давайте определим представление нового макета в resources/views/layouts/app.blade.php. Расширение .blade.php даёт фреймворку команду использовать механизм шаблонной обработки Blade, чтобы отрисовать это представление. Конечно, в Laravel вы можете использовать и простые PHP-шаблоны. Однако Blade позволяет быстро написать простой и небольшой шаблон.

Наше представление app.blade.php должно выглядеть примерно так:

xml  <!-- resources/views/layouts/app.blade.php -->

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>Laravel Quickstart - Basic</title>

    <!-- CSS и JavaScript -->
  </head>

  <body>
    <div class="container">
      <nav class="navbar navbar-default">
        <!-- Содержимое Navbar -->
      </nav>
    </div>

    @yield('content')
  </body>
</html>

Обратите внимание на строчку xml@yield('content') в макете. Это специальная Blade-директива для указания всем дочерним страницам, наследующим этот шаблон, где они могут внедрить своё содержимое. Давайте определим дочернее представление, которое будет использовать этот макет и выводить его основной контент.

Определяем дочернее представление

Теперь мы должны определить представление, которое содержит форму создания новой задачи, а также таблицу со списком всех существующих задач. Давайте определим это представление в resources/views/tasks.blade.php.

Мы пропустим небольшую часть Bootstrap CSS и сфокусируемся на важном. Помните, вы можете скачать весь исходный код этого приложения с ((https://github.com/laravel/quickstart-basic GitHub):

PHP
  <!-- resources/views/tasks.blade.php -->

@extends(
'layouts.app')

@
section('content')

  <!-- 
Bootstrap шаблон... -->

  <
div class="panel-body">
    <!-- 
Отображение ошибок проверки ввода -->
    @include(
'common.errors')

    <!-- 
Форма новой задачи -->
    <
form action="{{ url('task') }}" method="POST" class="form-horizontal">
      {{ 
csrf_field() }}

      <!-- 
Имя задачи -->
      <
div class="form-group">
        <
label for="task" class="col-sm-3 control-label">Задача</label>

        <
div class="col-sm-6">
          <
input type="text" name="name" id="task-name" class="form-control">
        </
div>
      </
div>

      <!-- 
Кнопка добавления задачи -->
      <
div class="form-group">
        <
div class="col-sm-offset-3 col-sm-6">
          <
button type="submit" class="btn btn-default">
            <
class="fa fa-plus"></iДобавить задачу
          
</button>
        </
div>
      </
div>
    </
form>
  </
div>

  <!-- 
TODOТекущие задачи -->
@
endsection

Несколько разъясняющих замечаний

Прежде чем двигаться дальше, давайте немного поговорим об этом шаблоне. Во-первых, директива PHP@extends сообщает Blade, что мы используем макет, который мы определили в resources/views/layouts/app.blade.php. Все содержимое между PHP@section('content') и PHP@endsection будет добавлено вместо строчки директивы PHP@yield('content') в макете app.blade.php.

Директива PHP@include('common.errors') загрузит шаблон resources/views/common/errors.blade.php. Мы его ещё не определили, но скоро сделаем это!

Итак, мы определили основной макет и представление для нашего приложения. Помните, мы возвращаем это представление по маршруту /:

PHP
Route::get('/', function () {
  return 
view('tasks');
});

Теперь мы готовы добавить код в наш маршрут POST /task, чтобы обработать входящие данные из формы и добавить новую задачу в БД.

Добавление задач

Проверка ввода

Теперь, когда у нас есть форма на нашем представлении, мы должны добавить код к нашему маршруту POST /task в app/Http/routes.php, чтобы проверить входящие данные из формы и создать новую задачу. Во-первых, давайте проверим ввод.

Для этой формы мы создадим обязательное поле name и зададим, что оно должно содержать не более 255 символов. Если проверка не пройдёт, то мы перенаправим пользователя назад к URL /, а также возвратим ему в сессию его введённые данные с указанием на ошибки. Возврат введённых данных в сессию позволит нам сохранить их, даже если в них будут ошибки:

PHP
Route::post('/task', function (Request $request) {
  
$validator Validator::make($request->all(), [
    
'name' => 'required|max:255',
  ]);

  if (
$validator->fails()) {
    return 
redirect('/')
      ->
withInput()
      ->
withErrors($validator);
  }

  
// Создание задачи...
});

Переменная PHP$errors

Давайте сделаем перерыв на минутку, чтобы поговорить о строчке PHP->withErrors($validator) в нашем примере. Вызов PHP->withErrors($validator) подсветит в сессии ошибки данного экземпляра проверки ввода, и к ним можно будет обратиться через переменную PHP$errors в нашем представлении.

Помните, что мы использовали директиву PHP@include('common.errors') в нашем представлении, чтобы отобразить ошибки ввода формы. PHPcommon.errors позволяет нам легко показывать ошибки ввода в одинаковом формате на всех наших страницах. Давайте определим содержимое этого представления:

PHP
<!-- resources/views/common/errors.blade.php -->

@if (
count($errors) > 0)
  <!-- 
Список ошибок формы -->
  <
div class="alert alert-danger">
    <
strong>УпсЧто-то пошло не так!</strong>

    <
br><br>

    <
ul>
      @foreach (
$errors->all() as $error)
        <
li>{{ $error }}</li>
      @endforeach
    </
ul>
  </
div>
@endif

Переменная PHP$errors доступна в любом представлении Laravel. Если не будет ошибок ввода, она просто будет пустым экземпляром PHPViewErrorBag.

Создание задачи

Теперь, когда обрабатывается ввод данных, давайте создадим новую задачу, продолжая заполнять наш маршрут. Как только новая задача была создана, мы перенаправим пользователя назад к URL /. Чтобы создать задачу, мы можем использовать метод PHPsave() после создания и установки свойств для новой модели Eloquent:

PHP
Route::post('/task', function (Request $request) {
  
$validator Validator::make($request->all(), [
    
'name' => 'required|max:255',
  ]);

  if (
$validator->fails()) {
    return 
redirect('/')
      ->
withInput()
      ->
withErrors($validator);
  }

  
$task = new Task;
  
$task->name $request->name;
  
$task->save();

  return 
redirect('/');
});

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

Отображение существующих задач

Во-первых, мы должны отредактировать наш маршрут /, чтобы передать все существующие задачи в представление. Функция PHPview() принимает массив данных вторым параметром, который будет доступным для представления. Каждый ключ массива станет переменной в представлении:

PHP
Route::get('/', function () {
  
$tasks Task::orderBy('created_at''asc')->get();

  return 
view('tasks', [
    
'tasks' => $tasks
  
]);
});

Когда данные переданы, мы можем обращаться к задачам в нашем представлении tasks.blade.php и выводить их на экран таблицей. Blade-конструкция PHP@foreach позволяет нам кратко писать циклы, которые компилируются в молниеносный простой PHP-код:

PHP
@extends('layouts.app')

@
section('content')
  <!-- 
Форма создания задачи... -->

  <!-- 
Текущие задачи -->
  @if (
count($tasks) > 0)
    <
div class="panel panel-default">
      <
div class="panel-heading">
        
Текущая задача
      
</div>

      <
div class="panel-body">
        <
table class="table table-striped task-table">

          <!-- 
Заголовок таблицы -->
          <
thead>
            <
th>Task</th>
            <
th>&nbsp;</th>
          </
thead>

          <!-- 
Тело таблицы -->
          <
tbody>
            @foreach (
$tasks as $task)
              <
tr>
                <!-- 
Имя задачи -->
                <
td class="table-text">
                  <
div>{{ $task->name }}</div>
                </
td>

                <
td>
                  <!-- 
TODOКнопка Удалить -->
                </
td>
              </
tr>
            @endforeach
          </
tbody>
        </
table>
      </
div>
    </
div>
   @endif
@
endsection

Наше приложение почти готово. Но у нас нет способа удалять наши существующие задачи, когда они завершены. Давайте добавим и это!

Удаление задач

Добавление кнопки удаления задачи

Мы оставили отметку «TODO» в коде, где предположительно будет находиться наша кнопка. Давайте добавим кнопку удаления к каждой строке нашего списка задач в представлении tasks.blade.php. Мы создадим маленькую однокнопочную форму для каждой задачи в списке. После нажатия кнопки приложению будет отправляться запрос DELETE /task:

PHP
<tr>
  <!-- 
Имя задачи -->
   <
td class="table-text">
    <
div>{{ $task->name }}</div>
  </
td>

  <!-- 
Кнопка Удалить -->
  <
td>
    <
form action="{{ url('task/'.$task->id) }}" method="POST">
      {{ 
csrf_field() }}
      {{ 
method_field('DELETE') }}

      <
button type="submit" class="btn btn-danger">
        <
class="fa fa-trash"></iУдалить
      
</button>
    </
form>
  </
td>
</
tr>

Примечание по спуфингу метода

Обратите внимание на то, что method формы кнопки удаления объявлен как POST, несмотря на то, что мы отвечаем на запрос, используя маршрут PHPRoute::delete. HTML-формы позволяют использовать только GET и POST методы HTTP. А нам нужен способ имитировать запрос DELETE от формы.

Мы можем имитировать запрос DELETE, выводя результаты функции PHPmethod_field('DELETE') в нашей форме. Эта функция генерирует скрытый ввод формы, который распознается Laravel и используется, чтобы переопределить вызываемый метод HTTP. Сгенерированное поле будет похоже на это:

PHP
<input type="hidden" name="_method" value="DELETE">

Удаление задачи

Наконец, давайте добавим к нашему маршруту логику удаления текущей задачи. Мы можем использовать неявную привязку модели, чтобы автоматически получить модель Task, которая соответствует параметру маршрута {task}.

В обратном вызове нашего маршрута мы используем метод PHPdelete() для удаления записи. Как только запись удалена, мы перенаправим пользователя назад к URL /:

PHP
Route::delete('/task/{task}', function (Task $task) {
  
$task->delete();

  return 
redirect('/');
});

Комментарии (33)

zedsh

Вероятно, стоит заменить в статье в формах action на такой же, но без слеша вначале. Иначе не работает, если не в корне сервера.

ProjectSoft

Используйте тег

<base href="http://mydomain/" />

в HTML разметке страницы и вы навсегда забудете о подобных нюансах.

Proger_XP
  1. вы навсегда забудете о подобных нюансах.

...а также об использовании xml<a href="#foo">.

safeacid

а как на счет

php artisan serve

?

pavel_zol

и ни слова про то что доступы к бд настраиваются в корне ларки файлом .env вы же для новичков пишите?

Proger_XP

Это перевод официальных доков, так что все претензии к команде Тейлора.

Unwelt

Так-то вы правы, но если есть такие моменты, то можно в переводе указать

Gilfoyle

Полностью согласен

pixelgoo

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

toorr2p

Практически сплошь и рядом встречаю такие ляпы в документациях и даже видео инструкциях и уроках, что САМОЕ ГЛАВНОЕ без чего не будет ничего работать не упоминается вовсе, или же засунуто в такие дебри что найти информацию которая в первую же очередь потребуется при старте, достаточно сложно.

Видимо не придумали еще какого то «чек листа», по типу Unit тестов для документаций ,при которых будет критический анализ ее практического применения.

barc90
  1. php artisan migrate

Эта команда создаст все наши таблицы БД
Появилась только одна таблица migrations

amijin

и никто не пишет что формы с таким action: "/task" не работают , нужно писать {{ url('task') }} или так "task" без /

Proger_XP

Оно не работает, если проект не в корне сайта. url() выдаёт URL относительно корня проекта (установки Laravel), что может быть равно /task, а может и не быть.

Sakon

спасибо за клевую статью.Буду учить larvel.

Febox

Спасибо за перевод! Laravel крут.

wonalive

Спасибо за перевод

manowar

«По умолчанию все маршруты Laravel определены в файле app/Http/routes.php, который автоматически добавляется в каждый новый проект» — на самом деле роуты лежат в папке routes, там три файла — api.php, web.php и console.php

SashaRV

Спасибо.

manowar

При добавлении @include('errors') в шаблон выдаёт десятки ошибок. (Именно @include('errors'), так как папки common у меня тоже нет)

Emperor

Если ошибка при «php artisan migrate» — Access denied for user 'homestead'@'localhost'
Нужно изменить настройки подключения к БД в файле «.env» в папке проекта

Dildo25cm

Ну а где layout.app???

glebn

layout это папка в которой нужно создать файл app.blade.php

Dobrozhelatel

Статья устарела. И нерабочая для новой версии
В 5.4 маршруты лежат в директории /routes/web.php

loenzpy

Давайте обновим статью с учетом Laravel 5.4 !?

Я «за», чтобы автор перевода ввёл развёрнутые пояснения для новичков в некоторых моментах.

Proger_XP

Документацию уже частично обновили до 5.3, до 5.4 обновим в течении месяца-двух.

На этом сайте можно публиковать статьи после регистрации, так что хотите помочь — переводите и публикуйте, никто не мешает.

  1. Я «за», чтобы автор перевода ввёл развёрнутые пояснения для новичков в некоторых моментах.

Это перевод официальных английских доков с laravel.com, так что претензии надо направлять к ним.

GennadyStolbov

День добрый.
как новичок:
При нажатии добавить:
The requested URL /task was not found on this server.

web.php
Route::post('/task', function (Request $request) {...});

ИЗВИНИТЕ, СЕБЕ ОТВЕЧАЮ. mod_rewrite.so httpd.conf: AllowOverride All. Все работает.

Route:: — зачетная придумка.

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

VladLis

И как запустить созданное приложение, какой у него адрес, если апач настроен на http://localhost:8080 - http://localhost:8080/quickstart/public/index.php? Но ни http://localhost:8080/quickstart/public/index.php, ни http://localhost:8080/quickstart/ не работают, выдают ошибку.

VladLis

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

Proger_XP

В данном случае проблема не перевода, а того, что сама статья была удалена из документации Laravel 5.3 и выше. О чём и написано в самом начале:

  1. Данная статья документации актуальна только для версий 5.2 и 5.1 и была удалена в версии 5.3.

Поэтому она и отстаёт.

MaQ

установить можно конкретно версию 5.2, какая тут и предполагается:

shcomposer create-project laravel/laravel:5.2.* quickstart --prefer-dist

Решает проблему на корню.

danila

В статье часто фигурирует такой путь PHPapp/Http/routes.php а в 5.6 его нет. В 5.6 вряд ли что-то кардинально изменилось, просто расположение файла. Так вот, куда теперь писать код, из вышеуказанного пути?

HaHeyAlexey

+1, вроде бы тут нужно настраивать роуты в /routes/web.php

HaHeyAlexey

Уф... после 4 лет Yii2 это было больно

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.