Hey There,
I am expecting you are familiar with PHP. In this post I will be using the Laravel framework to create a small blog system. I am showing here very simple steps to create blogs, If you want this complete code then please message me.
What are major Prequisites for Laravel: * PHP version >= 5.6
* Composer should be installed in system
Create a project with name tiny_blog with following command
composer create-project laravel/laravel --prefer-dist tiny_blog
enter into the laravel project
cd tiny_blog
create a migration file using following artisan command
<pre>php artisan make:migration create_blog_table</pre>
After this command you will found a new file created in database/migrations folder in your project, Just edit the file having 'create_blog_table' appended in its name
Now replace following code to create table schema with function up(), So now the method will look like following:
public function up()
{
Schema::create('blogs', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id');
$table->string('category');
$table->string('title');
$table->text('description');
$table->timestamps();
});
}
replace following snippet with down method, it will look like following:
public function down()
{
Schema::dropIfExists('blogs');
}
Its time to run the migration file we have created
php artisan migrate
After running,It will create the blogs table in database.Now time to create form and insert data into the table
Laravel itsef provide authentication , use following artisan command :
php artisan make:auth
Now start Larvel:
php artisan serve
it will start the laravel development server at
http://127.0.0.1:8000
Now if you run that url the basic default ui will be created and login & register link you can see in Top right position of header
You can register and login now.this feature is provided by authentication module.
Now we need to create a controller for manage blogs with following command:
php artisan make:controller BlogController
will create a file named
BlogController.php in** app/HTTP/controllers** folder location
Now we need to create a Model also, use following command
php artisan make:model Blog
will create a file named
Blog.php in app folder location
Now in Controller we need to create a method for create blogs and available that method in Routes to access it via url. Just edit
routes/web.php file and add the following line
Route::get('blog/create','BlogController@createBlog');
/create/blog/ will be url route that land on Blog Controller's createBlog method using get method.
Now before running this route just go to the app/Http/Controllers folder and Edit BlogController.php file and Add the createBlog method in that class as following
public function createBlog()
{
return view('blog.create');
}
This code will try to load the view from
/resources/views/blog/create.blade.php In Laravel blade is a template engine. As we had not created the view file yet, so we need to create a blog folder inside
/resources/views/ folder then inside blog folder create a file
create.blade.php with following form
@extends('layouts.app')
@section('content')
<div class="container">
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div><br />
@endif
<div class="row">
<form method="post" action="{{url('blog/create')}}">
<div class="form-group">
<input type="hidden" value="{{csrf_token()}}" name="_token" />
<label for="title">Title:</label>
<input type="text" class="form-control" name="title"/>
</div>
<div class="form-group">
<label for="title">Category/Tags:</label>
<input type="text" class="form-control" name="category"/>
</div>
<div class="form-group">
<label for="description">Description:</label>
<textarea cols="10" rows="10" class="form-control" name="description"></textarea>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</div>
</div>
@endsection
Now we need to add a additional route to handle the post request on blog/create route, Just edit routes/web.php file and just add following line in last:
Route::post('blog/create','BlogController@saveBlog');
post route to handle the form post on route blog/create
Now create a method name saveBlog to save the user input data in the form
public function saveBlog(Request $request)
{
$blog = new Blog();
$this->validate($request, [
'title'=>'required',
'category'=>'required',
'description'=> 'required'
]);
$blog->createBlog($request->all());
return redirect('blog/index')->with('success', 'New blog has been created successfully :)'); }
Notice This method is using Blog object that we don't know that where it comes from? , So to make above code working we need to include the model which we created earlier need to include in our controller file So use following code to include it before the class created.
use App\Blog;
Now following line shows that there is a method named createBlog in
Model(app/Blog.php)
, but in actual it is not there:
$blog->createBlog($data);
So go to the file app/Blog.php and Edit it and inside the class add following method:
public function createBlog($data)
{
$this->user_id = auth()->user()->id;
$this->title = $data['title'];
$this->description = $data['description'];
$this->category = $data['category'];
$this->save();
return 1;
}
Now the creation of blog task has been done , Its time to show the created Entries So just create a route blog/index in routes/web.php
Route::get('blog/index','BlogController@showAllBlogs');
get route blog/index to show all the created blogs by current user
Now just add a method in controller
public function showAllBlogs()
{
$blogs = Blog::where('user_id', auth()->user()->id)->get();
return view('blog.index',compact('blogs'));
}
This method requires to create a index view in blog folder , So create a file named index.blade.php in /resources/views/blog/ folder with following code
@extends('layouts.app')
@section('content')
<div class="container">
@if(\Session::has('success'))
<div class="alert alert-success">
{{\Session::get('success')}}
</div>
@endif
<a type="button" href="{{url('blog/create')}}" class="btn btn-primary">Add New Blog</a>
<br>
<table class="table table-striped">
<thead>
<tr>
<td>ID</td>
<td>Title</td>
<td>Category</td>
<td>Description</td>
<td colspan="2">Action</td>
</tr>
</thead>
<tbody>
@foreach($blogs as $blog)
<tr>
<td>{{$blog->id}}</td>
<td>{{$blog->title}}</td>
<td>{{$blog->category}}</td>
<td>{{$blog->description}}</td>
<td>Edit</td>
<td>Delete</td>
</tr>
@endforeach
</tbody>
</table>
<div>
@endsection
Now all code is ready but we need to add 1 line of code to prevent the blog controller without authentication or without login
just add the following constructor method in BlogController class
public function __construct()
{
$this->middleware('auth');
}
this constructor method will call very first when user will try to access any of BlogController class method, and the middleware will check whether user is logged in then only it will allow to access that method otherwise it will redirect to login page automatically.
After It Run your Code and you will able to create and listing your created blogs/articles. but the Edit and Delete links are not working right now, If you want that also working then please comment here or message me. If we get multiple requests then definitely i will write its part 2 article
Thanks very much for reading this blog, if you have any doubt about it then let me know in comments or by messaging me.
Following is the final code for BlogController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Blog;
class BlogController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function createBlog()
{
return view('blog/create');
}
public function saveBlog(Request $request)
{
$blog = new Blog();
$this->validate($request, [
'title'=>'required',
'category'=>'required',
'description'=> 'required'
]);
$blog->createBlog($request->all());
return redirect('blog/index')->with('success', 'New blog has been created successfully :)');
}
public function showAllBlogs()
{
$blogs = Blog::where('user_id', auth()->user()->id)->get();
return view('blog.index',compact('blogs'));
}
}