Creating a support ticket with laravel lucid architecture part 6
In our last tutorial, we learnt how to create the ListTicketsByAuthUser Feature, the feature that is responsible for listing all the tickets by the authenticated user. To achieve the previous task, we built the following;
- We needed the category repository and lastly
- We needed the ListAllCategoryJob.
Here we are again, another feature, ListTicketByIdFeature
you can take a look at the course curriculum to catch up with us.
Requirements
the following are the requirements for this tutorial
- Download php 7.2.1
- Download Composer.exe
- Download xampp or wamp for windows.
Difficulty level
This tutorial is rated as intermediate.
What's our task for today?
Our tasks today is to build the ListTicketByIdFeature, which is responsible for getting a specific users ticket using the id
in the model to fetch the ticket
to achieve this we are going to build the LIstTicketByIdJob, as the name implies, the jobs list the ticket using the id
.
We are going to learn how to pass the id
from a model to a feature.
Lets begin
We going to start by initiating the route
Ok route where are you, yeep it in web.php
of the web service. Head over there.
add the code below
Route::get('tickets/{ticket_id}', 'TicketController@show');
This time around, we are passing the ticket_id
as a variable to the TicketController's show method. Our route url
would look like localhost:8000/tickets/1
Passing the ticket_id
to the controller
Open the ticket controller and add the code below in the show method
the remember to use the ListTicketByIdFeature
at the top
use App\Services\Web\Features\ListTicketByIdFeature;
*/
public function show($ticket_id)
{
return $this->serve(ListTicketByIdFeature::class,[
'id' => $ticket_id,
]);
}
Let's explain this piece of code.
We are setting the id
in the ListTicketFeature to the ticket_id
of the route from the ticket model in the constructor method of the ListTicketFeature.
Feature time!!!! (ListTicketByIdFeature)
We would start by hitting the command line to generate our feature
Enter lucid make:feature ListTicketById web
Boom!!!!!!!!! generated.
Open the generated feature
and add the code.
<?php
namespace App\Services\Web\Features;
use Lucid\Foundation\Feature;
use Illuminate\Http\Request;
use App\Domains\Tickets\Jobs\ListTicketByIdJob;
class ListTicketByIdFeature extends Feature
{
public function __construct($id)
{
$this->id = $id;
}
public function handle(Request $request)
{
$ticket = $this->run(ListTicketByIdJob::class,[
'id' => $this->id,
'field' => 'ticket_id'
]);
$category = $ticket->category;
$comments = $ticket->comments;
return view('tickets.show', compact('ticket', 'category', 'comments'));
}
}
Now, lets talk about this section
Notice the construct accepts the id
we passed from the controller.
In this section below, we are running a ListTicketByJob and we don't have this particular job
$ticket = $this->run(ListTicketByIdJob::class,[
'id' => $this->id,
'field' => 'ticket_id'
]);
So we are going create the job
lucid make:job ListTicketByIdJob
find the generated job at Domains/Tickets/Jobs/ListTicketByIdJob.php
paste below snippet
<?php
namespace App\Domains\Tickets\Jobs;
use Lucid\Foundation\Job;
use App\Data\Repositories\TicketRepository;
class ListTicketByIdJob extends Job
{
/**
* Create a new job instance.
*
* @return void
*/
protected $id;
protected $field;
public function __construct($id, $field)
{
$this->id = $id;
$this->field = $field;
}
/**
* Execute the job.
*
* @return void
*/
public function handle(TicketRepository $repo)
{
return $repo->model->where($this->field, $this->id)->firstOrFail();
}
}
This jobs go to the repository and get the tickets with the id
, the job, uses a the where method of the repository class, which accepts two variables, a ticket itselt, and the ID we are looking for.
Back to the Feature (ListTicketByIdFeature)
We ran the ListTicketJob, next we save the category of a particular ticket to the variable $category
through the relationship between tickets and category.
lastly the both data "$ticket and $category
" are sent to the tickets/show.blade.php
view
@extends('layouts.app')
@section('title', $ticket->title)
@section('content')
<div class="row">
<div class="col-md-10 col-md-offset-1">
<div class="panel panel-default">
<div class="panel-heading">
#{{ $ticket->ticket_id }} - {{ $ticket->title }}
</div>
<div class="panel-body">
@include('includes.flash')
<div class="ticket-info">
<p>{{ $ticket->message }}</p>
<p>Categry: {{ $category->name }}</p>
<p>
@if ($ticket->status === 'Open')
Status: <span class="label label-success">{{ $ticket->status }}</span>
@else
Status: <span class="label label-danger">{{ $ticket->status }}</span>
@endif
</p>
<p>Created on: {{ $ticket->created_at->diffForHumans() }}</p>
</div>
<hr>
<div class="comments">
@foreach ($comments as $comment)
<div class="panel panel-@if($ticket->user->id === $comment->user_id) {{"default"}}@else{{"success"}}@endif">
<div class="panel panel-heading">
{{ $comment->user->name }}
<span class="pull-right">{{ $comment->created_at->format('Y-m-d') }}</span>
</div>
<div class="panel panel-body">
{{ $comment->comment }}
</div>
</div>
@endforeach
</div>
<div class="comment-form">
<form action="{{ url('comment') }}" method="POST" class="form">
{!! csrf_field() !!}
<input type="hidden" name="ticket_id" value="{{ $ticket->id }}">
<div class="form-group{{ $errors->has('comment') ? ' has-error' : '' }}">
<textarea rows="10" id="comment" class="form-control" name="comment"></textarea>
@if ($errors->has('comment'))
<span class="help-block">
<strong>{{ $errors->first('comment') }}</strong>
</span>
@endif
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</form>
</div>
</div>
</div>
</div>
@endsection
Booom, yayayaya, we done.
previous series below
Posted on Utopian.io - Rewarding Open Source Contributors
Thank you for the contribution. It has been approved.
You can contact us on Discord.
[utopian-moderator]
You got upvoted from @adriatik bot! Thank you to you for using our service. We really hope this will hope to promote your quality content!
You got a 31.14% upvote from @allaz courtesy of @sirfreeman!
Hey @sirfreeman I am @utopian-io. I have just upvoted you!
Achievements
Suggestions
Get Noticed!
Community-Driven Witness!
I am the first and only Steem Community-Driven Witness. Participate on Discord. Lets GROW TOGETHER!
Up-vote this comment to grow my power and help Open Source contributions like this one. Want to chat? Join me on Discord https://discord.gg/Pc8HG9x