Приветствую всех.
Статья является частью серии "Тестирование PHP фреймворков". Начал писать статью о результатах тестирования Laravel. И решил вкратце описать процесс создания тестового приложения. В итоге вылилось все в отдельную статью.
Установка и настройка laravel версии 5.4
composer global require "laravel/installer"
laravel new laravel-5.4 // laravel-5.4 название директории куда будет установлен код laravel
переходим на новый сайт. В моем случае это - http://php-frameworks.semasping.info/laravel-5.4/public/
Видим что все ок:
Далее разбираемся с подключением к базе данных.В файле .env
добавляем параметры базы данных
DB_DATABASE=admin_pte
DB_USERNAME=admin_default
DB_PASSWORD=ZDQTKJOTig
И в этом же файле пропишем ссылку на приложение
APP_URL=http://php-frameworks.semasping.info/laravel-5.4
Генерация кода
Теперь можно приступать к генерации наших страниц. В Laravel есть миграции, которые позволяют вносить изменения в базу данных из кода. Но у нас база данных уже готова (Общая с другими фреймворками.) PS: И тут вопрос для специалистов в laravel, а если будет генерироваться через миграции может будет лучше структура? ключи там различные иначе может встанут?
В laravel применяется паттерн проектирования MVC (подробнее об MVC в статье PHP - Урок 12. Обзор модели MVC. Добавляем шаблоны страниц в наше приложение автора @rusldv )
Так как бд есть, то мы генерируем сразу модели, а заодно и контроллеры.
php artisan make:model Posts -crm
php artisan make:model Authors -crm
php artisan make:model Categoies -crm
php artisan make:model PostCategories -crm
php artisan make:model PostTypes -crm
Ключ -r генерирует "ресурс" контроллер - я так предположил что это views, но там их не было. А это оказалось RESTful-контроллеры ресурсов [index,create,store,show,edit,update,destroy] - нам пока это не нужно.
В результате мы получили 10 файлов. 5 файлов моделей и 5 контроллеров. Модели лежат в /app
. Контроллеры в /app/Http/Controllers
. Все можно посмотреть на github, пути кликабельны.
Далее нам нужно прописать обработку путей в файле /routes/web.php
Route::get('/', function () {
return view('welcome');
});
Route::get('/posts/','PostsController@index');
Route::get('/categories/','CategoriesController@index');
Route::get('/authors/','AuthorsController@index');
Пропишем обработку в контроллерах
//AuthorsController.php
public function index()
{
$authors = Authors::withCount('posts')->get();
return view('authors.index', compact('authors'));
}
//CategoriesController.php
public function index()
{
$categories = Categories::withCount('posts')->get();;
return view('categories.index', compact('categories'));
}
//PostsController.php
public function index()
{
$posts = Posts::all();
//return $posts;
return view('posts.index', compact('posts'));
}
Остальные контроллеры нам пока не нужны.
Переходим к моделям. В Laravel все модели наследуются от ларавелевского класса Model. В нем уже есть всевозможные выборки и обработки данных. Так что если нужно просто выбрать данные из одной таблицы - то изменений в модели вносить не надо. Например если бы нам нужны были просто имена авторов, то модель была бы такой:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Authors extends Model
{
}
Но у нас есть еще связь с постами. Добавим в нашу модель эту связь
public function posts(){
return $this->hasMany(Posts::class, 'author_id');
}
Аналогично по остальным моделям.
//Categories.php
class Categories extends Model
{
public function posts(){
return $this->belongsToMany(Posts::class, 'post_categories', 'categories_id', 'posts_id');
}
}
//Posts.php
class Posts extends Model
{
public function author(){
return $this->belongsTo(Authors::class, 'author_id');
}
public function postType(){
return $this->belongsTo(PostTypes::class, 'post_type_id');
}
public function categories(){
return $this->belongsToMany(Categories::class, 'post_categories', 'posts_id', 'categories_id');
}
}
//PostTypes.php
class PostTypes extends Model
{
public function posts(){
return $this->hasMany( Posts::class );
}
}
В постах у нас связей больше.
Отображение данных.
Переходим к представлениям (views). Они у нас определяются в /resources/views
Сделаем общий шаблон /layout.blade.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Phalcon PHP Framework</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
@include('layouts.nav')
<div class="container">
@yield('content')
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</body>
</html>
И далее по представлению на каждый метод в контроллере
// resources/views/authors/index.blade.php
@extends ('layout')
@section ('content')
<div class="page-header">
<h1>
Authors list
</h1>
</div>
<div class="row">
<ul>
@foreach ( $authors as $author )
<li><pre>id: {{$author->id}} 	 Name:{{$author->name_f_l }} 	 CountPosts: {{$author->posts_count}}</pre></li>
@endforeach
</ul>
</div>
@endsection
// resources/views/categories/index.blade.php
@extends ('layout')
@section ('content')
<div class="page-header">
<h1>
Categories list
</h1>
</div>
<div class="row">
<ul>
@foreach ( $categories as $category )
<li><pre>id: {{$category->id}} 	 Name:{{$category->name }} 	 CountPosts: {{$category->posts_count}}</pre></li>
@endforeach
</ul>
</div>
@endsection
// resources/views/posts/index.blade.php
@extends ('layout')
@section ('content')
<div class="page-header">
<h1>
Posts list
</h1>
</div>
<div class="row">
<table class="table table-bordered">
<thead>
<tr>
<th>Id</th>
<th>Title</th>
<th>Body</th>
<th>Slug</th>
<th>Author</th>
<th>Post Of Type</th>
<th>Categories</th>
</tr>
</thead>
<tbody>
@foreach ( $posts as $post )
<tr>
<td> {{$post->id}} </td>
<td> {{$post->title}} </td>
<td> {{$post->body}} </td>
<td> {{$post->slug}} </td>
<td> {{$post->author->name_f_l}}</td>
<td> {{$post->postType->name}} </td>
<td></td>
</tr>
@endforeach
</tbody>
</table>
</div>
@endsection
Теперь можно приступать к тестированию. Ссылку на Результаты тестирования добавлю как опубликую статью.
Код представленный в статье выложен на github: https://github.com/semasping/php_frameworks_for_tests
Ваш пост поддержали следующие Инвесторы Сообщества "Добрый кит":
tristamoff, semasping, on1x, vika-teplo, dzen
Поэтому я тоже проголосовал за него!
Если Вы проголосуете за этот комментарий, то поможете сделать "Доброго Кита" сильнее!