Главная/Статьи/Начало работы с Laravel / Публикация статей + ЧПУ
Laravel

Начало работы с Laravel / Публикация статей + ЧПУ

Статья охватывает первоначальную установку и настройку Laravel 5+, создание маршрутов и контроллеров, вывод статей из базы данных, открытие статей по ЧПУ и добавление данных в БД.

Требования: PHP 5.6+, MySQL, Composer и терминал.

Установка

Установка Laravel через Composer:

composer global require "laravel/installer"

Создание нового проекта:

laravel new blog

Альтернативный способ:

composer create-project --prefer-dist laravel/laravel blog

Переход в директорию проекта, генерация ключа и запуск встроенного сервера:

cd blog
php artisan key:generate
php artisan serve

Приложение доступно по адресу: http://localhost:8000/

Механизм авторизации

Настройте файл .env с параметрами базы данных, затем установите механизм авторизации и запустите миграции:

php artisan make:auth
php artisan migrate

Установка дебагера

composer require barryvdh/laravel-debugbar

Добавьте провайдер в /config/app.php и опубликуйте конфиг:

php artisan vendor:publish --provider="Barryvdh\\Debugbar\\ServiceProvider"

Структура приложения (MVC)

Laravel следует паттерну MVC. Основные директории:

  • Контроллеры: app\http\Controllers
  • Модели: папка app
  • Представления: resources\views
  • Маршруты: routes\web.php

Роутер

Базовый пример маршрута:

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

Маршрут с параметром:

Route::get('/about', function () {
    return 'Hey this about page';
});

Контроллер

Создание контроллера:

php artisan make:controller StaticController

Маршрут с вызовом контроллера:

Route::get('/about', 'StaticController@about');

Метод контроллера с возвратом представления и передачей данных:

public function about(){
    $myData = "hola! i'm data in passed variable";
    return view('about')->with('myData', $myData);
}

Модель

Создание модели:

php artisan make:model Post

Получение всех записей и передача в представление:

public function blog(){
    $posts = Post::select(['id','title','excerpt','slug'])->get();
    return view('blog')->with('posts', $posts);
}

Представление (Blade)

Базовая структура шаблона:

@extends('layouts.app')
@section('content')

Blog

@endsection

Вывод данных в цикле (с экранированием и без):

@foreach($posts as $post)
    

{{ $post->title }}

{!! $post->body !!}

@endforeach

Отдельные страницы (ЧПУ)

Маршрут с параметром slug:

Route::get('/blog/{url}', 'StaticController@blogPost')->name('postShow');

Метод контроллера с поиском по slug и получением последних статей:

public function blogPost($url){
    $posts = Post::limit(3)
        ->orderBy('id', 'desc')
        ->get();
    $post = Post::all()->where('slug', $url)->first();
    return view('blogPost')->with('post', $post)
        ->with('posts', $posts);
}

Ссылка в представлении:

More

Создание материалов

Маршруты для добавления записей (GET для формы, POST для сохранения):

Route::get('/admin/add/blog', 'StaticController@blogAdd');
Route::post('/admin/add/blog', 'StaticController@blogStore')->name('blogStore');

HTML-форма с CSRF-токеном:

{{ csrf_field() }}

Валидация и сохранение в базу данных

Модель с указанием разрешённых полей и метод сохранения с валидацией:

class Post extends Model
{
    protected $fillable = ['title', 'body', 'slug'];
}

public function blogStore(Request $request){
    $this->validate($request, [
        'title' => 'required|max:255',
        'slug' => 'required|unique:posts',
    ]);
    $data = $request->all();
    $post = new Post;
    $post->fill($data);
    $post->save();
    return redirect('/');
}

Вывод ошибок валидации в шаблоне:

@if(count($errors) > 0)
    
    @foreach($errors->all() as $error)
  • {{ $error }}
  • @endforeach
@endif