Если вы пишете статьи для вашего персонального блога или сайта, то вам может потребоваться персональная система тегирования. При созданий записи или статьи например для рецептов можно использовать такие теги как: название, тип и сложность. Также может появиться желание расположить эти теги на видном месте вашей записи используя laravel.
В этой записи мы будем разбирать простой пример генераций тегов в вашей статье используя Laravel и пакета rtconner/laravel-tagging. Также будет рассмотрен пример создания статьи и вывода тегов к ней. Я буду использовать bootstrap tagsinput js library для ввода тегов чтобы придать им более красивый вид.
Когда мы закончим, у нас получится что-то похожее на превью ниже:
Шаг 1: Установка Laravel
В первом шаге, если вы не имеете установленного проекта Laravel вам нужно получить свежую версию фреймворка используя следующую команду в терминале:
composer create-project --prefer-dist laravel/laravel blog
Шаг 2: установка пакета rtconner/laravel-tagging через Composer
В этом шаге, мы устанавливаем composer пакет “rtconner/laravel-tagging” для добавления тегов. Итак, запустим следующую команду:
composer require composer require rtconner/laravel-tagging
После успешной установки пакета, откройте файл config/app.php и добавьте сервис провайдер.
'providers' => [
...
\Conner\Tagging\Providers\TaggingServiceProvider::class,
]
После регистраций провайдера, требуется сделать публичной конфигурацию и запустить миграцию для тегов. Для этого запустим команду:
php artisan vendor:publish --provider="Conner\Tagging\Providers\TaggingServiceProvider"
Для запуска миграций:
php artisan migrate
Шаг 3: создание таблицы и модели статей
В этом шаге мы создаем таблицу Article если она еще не создана. Если создается миграция впервые, то нужно запустить команду ниже:
php artisan make:migration create_articles_table
После запуска команды, вы увидите следующий файл миграций по пути database/migrations. Обновите содержимое файла как в коде ниже для создания модели статей:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateArticlesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('articles', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->text('body');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('articles');
}
}
Примените файл миграций следующей командой:
php artisan migrate
После создания таблицы `articles`, мы должны создать модель для этой таблицы. Создайте файл по следующему пути app/Article.php и вставьте пару строчек кода в файл Article.php, как показано ниже:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
use \Conner\Tagging\Taggable;
protected $fillable = [ 'title', 'body' ];
}
Шаг 4: Добавление маршрутов
Здесь мы будет создавать маршруты для списка статей и роут для создания статей. Откроем файл routes/web.php и добавим следующий код:
Route::get('article', 'ArticleController@index');
Route::post('article', 'ArticleController@store');
Шаг 5: Создание контроллера ArticleController
В этом шаге мы должны создать новый контроллер, такой как ArticleController. В этом контроллере мы запишем два метода index() и store(). Используя эти два метода, мы обрабатываем созданные раннее маршруты. Итак, создадим контроллер ArticleController, как в примере ниже:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Article;
class ArticleController extends Controller
{
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$articles = Article::all();
return view('article',compact('articles'));
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$this->validate($request, [
'title' => 'required',
'body' => 'required',
'tags' => 'required',
]);
$input = $request->all();
$tags = explode(",", $request->tags);
$article = Article::create($input);
$article->tag($tags);
return back()->with('success','Article created successfully.');
}
}
Шаг 7: создание представления article.blade.php
В последнем шаге, мы создаем представление article.blade.php(resources/views/article.blade.php) для слоя. В нем мы будем отображать все статьи и создавать статьи. Код представления:
<!DOCTYPE html>
<html>
<head>
<title>Article Lists</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-tagsinput/0.8.0/bootstrap-tagsinput.css" />
<script src="http://demo.itsolutionstuff.com/plugin/jquery.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-tagsinput/0.8.0/bootstrap-tagsinput.js"></script>
</head>
<body>
<div class="container">
<h1>Add Article</h1>
@if(Session::has('success'))
<div class="alert alert-success">
{{ Session::get('success') }}
@php
Session::forget('success');
@endphp
</div>
@endif
<form action="{{ url('article') }}" method="POST">
{{ csrf_field() }}
<div class="form-group">
<label>Title:</label>
<input type="text" name="title" class="form-control" placeholder="Title">
@if ($errors->has('title'))
<span class="text-danger">{{ $errors->first('<title></title>') }}</span>
@endif
</div>
<div class="form-group">
<strong>Body:</strong>
<textarea class="form-control" name="body" placeholder="Body"></textarea>
@if ($errors->has('body'))
<span class="text-danger">{{ $errors->first('body') }}</span>
@endif
</div>
<div class="form-group">
<label>Tags:</label>
<br/>
<input data-role="tagsinput" type="text" name="tags" >
@if ($errors->has('tags'))
<span class="text-danger">{{ $errors->first('tags') }}</span>
@endif
</div>
<div class="form-group">
<button class="btn btn-success btn-submit">Submit</button>
</div>
</form>
<h1>Article Lists</h1>
@if($articles->count())
@foreach($articles as $key => $article)
<h3>{{ $article->title }}</h3>
<p>{{ $article->body }}</p>
<div>
<strong>Tag:</strong>
@foreach($article->tags as $tag)
<label class="label label-info">{{ $tag->name }}</label>
@endforeach
</div>
@endforeach
@endif
</div>
</body>
</html>
Теперь мы готовы запустить наш пример по следующему маршруту в браузере:
http://localhost:8000/article
Больше информаций по пакету “rtconner/laravel-tagging” находиться в репозиторий rtconner/laravel-tagging.