Skip to content

Laravel 5 ToDo aplikacija

Nermin Šehić edited this page Jun 9, 2016 · 15 revisions

Dokumentacija TODO aplikacije iz Lekcije 14

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.

Instalacija Composer-a

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.

Instalacija Laravel projekta

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.

Podesavanje .env

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 i databaza

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

Modeli

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

Rute

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.

TaskController

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.

Blade & HTML

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