In this tutorial we will create basic CRUD functionality (Create, Edit,
Update and Delete) using Laravel 5.3. There are a few changes done in
the latest version of Laravel 5.3 that I found that broke my earlier
code. Many tutorials that are available online are not up to date and
were not much helpful so I decided to write a tutorial.
First of all we will have to create a resource route in your routes/web.php. This is one of the change in Laravel 5.3: In earlier versions there was just one routes.php file but in Laravel 5.3 the routes have been split into three files.
Note that I am adding this route to resource controller for an admin section.
------------------------------------------------------------------------------------
First of all we will have to create a resource route in your routes/web.php. This is one of the change in Laravel 5.3: In earlier versions there was just one routes.php file but in Laravel 5.3 the routes have been split into three files.
Note that I am adding this route to resource controller for an admin section.
------------------------------------------------------------------------------------
Route::group(['prefix' => 'admin'], function () { ... Route::resource('/categories', 'admin\CategoryController'); ...});
----------------------------------------------------------------
we have to install a package using composer to make HTML and FORM
functionality work. Laravel 5.3 does not come with HTML and FORM package
installed.
-------------------------------------------------------------------------composer require "laravelcollective/html":"^5.2.0"-------------------------------------------------------------------------
Next in the config/app.php we have to add the following providers and aliases at the end of each arrays like shown below:
------------------------------------------------------------'providers'[
Collective\Html\HtmlServiceProvider::class,],
'aliases' => [
'Form' => Collective\Html\FormFacade::class,
'Html' => Collective\Html\HtmlFacade::class,
'Input' => Illuminate\Support\Facades\Input::class,
],
------------------------------------------------------------
Next, We will have to create a
controller using the following PHP artisan command in the command line
editor. Make sure you are creating this inside your project directory.
------------------------------------------------------------
php artisan make:controller CategoryController --resource |
------------------------------------------------------------
This command will create a Category resource controller with a few
empty functions/methods such as index, create, edit, update, show and
destroy. Note that these are REST functions.
The file will be created in Http/Controllers/CategoryController.php but we need this in the admin section so we will have to create a simple admin folder inside Controllers directory and move the CategoryController.php inside the admin/ folder.
In doing this we have changed its location so now we have to change the namespace as well. The namespace now changes from:
------------------------------------------------------------
namespace App\Http\Controllers;
To
namespace App\Http\Controllers\admin;
------------------------------------------------------------
Remember also to add the following entities and classes at the top of the file
------------------------------------------------------------
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Category;
use Validator;
use DB, Session, Crypt, Hash;
use Illuminate\Support\Facades\Input;
------------------------------------------------------------
Now, since this is an admin section I want to make sure that only the
logged in user can access this page. To do this we will have to add
authentication code inside our constructor in the CategoriesController.php page. You can also write a middleware to achieve this.
------------------------------------------------------------
public function __construct()
{
$this->middleware('auth');
}
------------------------------------------------------------
The Index() function
The below code needs to be added to the index function. The index
function will handle listing of the categories along with the edit and
delete buttons.
------------------------------------------------------------
public function index()
{
// get all the categories
$categories = DB::table('categories')->paginate(15);
// load the view and pass the categories
return view('admin.category.index', ['categories' => $categories]);
}
------------------------------------------------------------
We are simply querying the categories table and trying to paginate the results. The DB::table(‘categories’) part will fetch all the categories and the paginate function will paginate the results in 15 records each.
Next, We have to send the results to the view file. Usually view files goes inside resources/views/ directory but since this is an admin section we have to create a separate admin directory inside resources/views and add all the admin views inside it. So for CategoryController.php the views will be in resources/views/admin/category/ folder.
Lets have a closer look to the following line that we added in the controller.
------------------------------------------------------------
return view('admin.category.index', ['categories' => $categories]);------------------------------------------------------------
|
We are going to send $categories array to admin/category/index.blade.php file. We use a dot notation to separate the directory.
This is what the index.blade.php looks like:
---------------------------------------------------------------
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<h1>All Categories</h1>
<div><a href="{{ URL::to('admin/categories/create') }}">Create a Category</a></div>
<!-- will be used to show any messages -->
@if (Session::has('message'))
<div class="alert alert-info">{{ Session::get('message') }}</div>
@endif
<table class="table table-striped table-bordered">
<thead>
<tr>
<td>ID</td>
<td>Category name</td>
<td>Actions</td>
</tr>
</thead>
<tbody>
@foreach($categories as $key => $value)
<tr>
<td>{{ $value->id }}</td>
<td>{{ $value->name }}</td>
<td>
<a class="btn btn-small btn-info" href="{{ URL::to('admin/categories/' . $value->id . '/edit') }}">Edit</a>
{{ Form::open(array('url' => 'admin/categories/' . $value->id, 'class' => 'btn btn-small')) }}
{{ Form::hidden('_method', 'DELETE') }}
{{ Form::submit('Delete', array('class' => 'btn btn-danger')) }}
{{ Form::close() }}
</td>
</tr>
@endforeach
{{ $categories->links() }}
</tbody>
</table>
</div>
</div>
@endsection
---------------------------------------------------------------
We are extending the default Laravel layouts.app. To generate pagination links the following code needs to be added to the index.blade.php file.
-----------------------------------------------------------{{ $categories->links() }}
-----------------------------------------------------------
The create() function
The create() function
The create function will just display the view at resources/views/admin/category/create.blade.php
-----------------------------------------------------------
public function create()
{
return view('admin.category.create');
}
-----------------------------------------------------------
And the create.blade.php file looks like:
-----------------------------------------------------------
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<h1>Create a Category</h1>
<!-- show errors -->
@if (count($errors) > 0)
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
{{ Form::open(array('url' => 'admin/categories')) }}
<div class="form-group">
{{ Form::label('name', 'Name') }}
{{ Form::text('name', Input::old('name'), array('class' => 'form-control')) }}
</div>
{{ Form::submit('Create Category!', array('class' => 'btn btn-primary')) }}
{{ Form::close() }}
</div>
</div>
@endsection
-----------------------------------------------------------
The store() function
The store function will validate the input and store the data in the categories table.
-----------------------------------------------------------
public function store(Request $request)
{
// validate
// read more on validation at http://laravel.com/docs/validation
$rules = array(
'name' => 'required',
);
$validator = Validator::make(Input::all(), $rules);
$this->validate($request, [
'name' => 'required'
]);
if ($validator->fails()) {
return redirect('admin/categories/create')
->withErrors($validator)
->withInput();
} else {
// store
$category = new Category;
$category->name = Input::get('name');
$category->visible = 1;
$category->save();
// redirect
Session::flash('message', 'Successfully created Category!');
return redirect('admin/categories');
}
}
-----------------------------------------------------------
The edit() function
The edit function displays the existing data in the input fields. It uses the layout resources/views/admin/category/edit.blade.php
-----------------------------------------------------------
public function edit($id)
{
// get the category
$category = Category::find($id);
// show the edit form and pass the category
return view('admin.category.edit')
->with('category', $category);
}
-----------------------------------------------------------
…and the edit.blade.php view looks like below:
-----------------------------------------------------------
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<h1>Edit {{ $category->name }}</h1>
{{ Form::model($category, array('route' => array('categories.update', $category->id), 'method' => 'PUT')) }}
<div class="form-group">
{{ Form::label('name', 'Name') }}
{{ Form::text('name', null, array('class' => 'form-control')) }}
</div>
{{ Form::submit('Edit the Category!', array('class' => 'btn btn-primary')) }}
{{ Form::close() }}
</div>
</div>
@endsection
-----------------------------------------------------------
The update() function
The update function will update the existing category.
-------------------------------------------------------------
public function update($id, Request $request)
{
// validate
// read more on validation at http://laravel.com/docs/validation
$rules = array(
'name' => 'required',
);
$validator = Validator::make(Input::all(), $rules);
$this->validate($request, [
'name' => 'required'
]);
if ($validator->fails()) {
return redirect('admin/categories/create')
->withErrors($validator)
->withInput();
} else {
// store
$category = Category::find($id);
$category->name = Input::get('name');
$category->visible = 1;
$category->save();
// redirect
Session::flash('message', 'Successfully updated category!');
return redirect('admin/categories');
}
}
-------------------------------------------------------------
Finally the destroy() function
The destroy function deletes a category from the categories table.
-------------------------------------------------------------
public function destroy($id)
{
// delete
$category = Category::find($id);
$category->delete();
// redirect
Session::flash('message', 'Successfully deleted the category!');
return redirect('admin/categories')->with('status', 'Category Deleted!');
}
-------------------------------------------------------------
No comments:
Post a Comment