-
Notifications
You must be signed in to change notification settings - Fork 4
Laravel 5 ToDo aplikacija
TODO aplikacija je zamisljena kao uvod u Laravel framework i pokriva osnove stvari kao sto su instalacija composer-a, instalacija Laravel projekta, migracije, rute, blade, content layout, modele, controller-e, relacije izmedju modela te osnovnu CRUD funkcionalnost.
Composer je dependency manager za PHP, ekvivalent npm, Carthage-u, ili Bundleru. Composer sluzi za upravljanje svim bibliotekama unutar frameworka. Proces instalacije Composer-a zavisi od operativnog sistema koji se koristi i instrukcije za instalaciju se mogu pronaci na linku: https://getcomposer.org/doc/00-intro.md Composer je prijeko potreban alat pri razvoju aplikacije u Laravel framework-u.
Koristeci prethodno instalirani Composer, unutar terminala(ili CommandPrompt-a) ukucati komandu:
composer create-project laravel/laravel todo "5.1.*"
Navedena komanda ce skinuti sve neophodne packag-e i library-e za Laravel i spasiti ih pod imenom "todo". Zadnji parameter specificira minimalnu verziju frameworka.
ENV file unutar Laravel Frameworka sluzi za modifikaciju default-nih postavki bez da se mijenja kod unutar Laravel config fajlova. Uzimajuci u obzir da se .env fajl gotovo uvijek nalazi u .gitignore listi nemoguce je da dodje do konflikta ukoliko na aplikaciji radi vise od clanova tima. Takodjer originalni kod se ne mijenja sto smanjuje prostor za potencijalne bug-ove. Linije koje je potrebno dodati u .env file a koji se ticu ToDo aplikacije su:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_DATABASE=todo
DB_USERNAME=root
DB_PASSWORD=root
Navedenim modifikacijama definisemo tip baze, username, host, password i ime baze.
Migracije u Laravel framework-u sluze kao version control za databazu. Koristeci artisan komandu make:migration Laravel automatski kreira migraciju sa jedinstvenim imenom koristeci timestamp.
php artisan make:migration create_tasks_table --create=tasks
Kreirana migracija ce se naci u folderu database/migrations. Laravel je predefinisao odredjene kolone za tabelu kao sto su id i timestamp. Za potrebe ToDo aplikacije tabela Task treba da ima property name koji je tip string. Kompletan kod migracije:
public function up()
{
Schema::create('tasks', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->timestamps();
});
}
public function down()
{
Schema::drop('tasks');
}
Izvrsavanje migracije se takodjer pokrece koristeci artisan komandu:
php artisan migrate
Na slican nacin kao sto smo kreirali migraciju, koristeci artisan moguce je kreirati modele i controllere unutar Laravel frameworka. Benefit koristenja navedenih komandi jesu predefinisane stvari unutar samih klasa koje omogucavaju brzi development. Npr ukoliko se controller generise koristeci php artisan: create controller, kreirace se klasa sa svim CRUD metodama (index, create, destroy...).
php artisan make:model Task
Laravel ima vrlo jednostavan routing sistem. Za potrebe ToDo aplikacije potrebno je da registrujemo 3 rute:
- Home ruta, koja prikazuje sve taskove
- Create ruta, koja ce obavljati posao upisa novog task-a u bazu
- Delete ruta, koja ce obavljati posao brisanja rute iz baze
Rute definisemo unutar routes.php file-a.
Route::get('/', ['uses' => 'TaskController@index', 'as' =>'showTasks']);
Route::post('/task', ['uses' => 'TaskController@create', 'as' =>'createTasks']);
Route::delete('/task/{task}/delete', ['uses' => 'TaskController@delete', 'as' =>'deleteTasks']);
Definisane rute trenutno pokazuju na controller koji jos uvijek nije napravljen, sto je naredni korak.
Unutar task controllera potrebno je definisati tri metode.
public function index () {
$tasks = Task::orderBy('created_at', 'asc')->get();
return view('tasks', [
'tasks' => $tasks
]);
}
Metoda index izvlaci iz baze sve unesene tasko-ve koristeci Eloquent klasu iz Laravel framework-a.
public function create(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('/');
}
Metoda create kao parameter prima request objekat koji u sebi sadrzi informacije iz forme, validira input koristeci Validator klasu takodjer iz Laravel framework-a, upise podatke u bazu ukoliko nema errora ili ispise error poruku na ekran.
public function delete($id) {
$task = Task::findOrFail($id);
$task->delete();
return redirect('/');
}
Metoda delete kao parametar primi id task-a, pronadje ga u bazi i obrise ili u slucaju da task nije pronadjen ispise error poruku na ekran.
Varijable iz controller-a se proslijede u view koristeci Blade, templating jezik koji omogucava koristenje for petlji, if uslova, te pozivanja PHP metoda. Takodjer, omogucava kreiranje template-a pa tako na vrlo jednostavan nacin dijelovi koda kao sto je HTML head se mogu napisati samo jednom i iskoristiti na svakom view-u. Jos jedna prakticna primjena Blade-a su tzv, sekcije, tacnije dijelovi koda koji se mogu ubaciti u neki view. U primjeru ToDo aplikacije error poruka je napisana u formi sekcije te importovana u glavni task.blade.php view.
@extends('layouts.app')
@section('content')
<div class="panel-body">
<!-- Display Validation Errors -->
@include('common.errors')
<!-- New Task Form -->
<form action="{{ url('task') }}" method="POST" class="form-horizontal">
<!-- Creates hidden key for the form -->
{!! csrf_field() !!}
<!-- Task Name -->
<div class="form-group">
<label for="task" class="col-sm-3 control-label">Task</label>
<div class="col-sm-6">
<input type="text" name="name" id="task-name" class="form-control">
</div>
</div>
<!-- Add Task Button -->
<div class="form-group">
<div class="col-sm-offset-3 col-sm-6">
<button type="submit" class="btn btn-default">
<i class="fa fa-plus"></i> Add Task
</button>
</div>
</div>
</form>
</div>
<!-- Current Tasks, shows only if there is at least one task -->
@if (count($tasks) > 0)
<div class="panel panel-default">
<div class="panel-heading">
Current Tasks
</div>
<div class="panel-body">
<table class="table table-striped task-table">
<!-- Table Headings -->
<thead>
<th>Task</th>
<th> </th>
</thead>
<!-- Table Body -->
<tbody>
@foreach ($tasks as $task)
<tr>
<!-- Task Name -->
<td class="table-text">
<div>{{ $task->name }}</div>
</td>
<!-- Delete Button -->
<td>
<form action="{{ url('task/'.$task->id.'/delete') }}" method="POST">
{!! csrf_field() !!}
{!! method_field('DELETE') !!}
<button class="btn btn-danger btn-sm">Delete Task</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
@endif
@endsection