লারাভেল প্রজেক্ট নিয়ে যেভাবে কাজ করবো

লারাভেল ইনস্টল এবং প্রজেক্ট সেটআপ

প্রথমে লারাভেল এর প্রজেক্ট তৈরী করতে হবে কম্পোজার দিয়ে । 
composer create-project laravel/laravel example-app

ডাটাবেসের সাথে প্রজেক্ট ফাইল  কানেক্ট করা। প্রজেক্ট এর .env ফাইল ওপেন করে ডাটাবেসের ইনফরমেশন গুলো দিতে হবে 
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database_name
DB_USERNAME=database_user_name
DB_PASSWORD=database_password

কমান্ড প্রম্প এ  নিচের কোড রান  করতে হবে 
php artisan migrate

লগইন রেজিস্ট্রেশন করার জন্য লারাভেল Auth সেটআপ করা কম্পোজার এ নিচের কোড রান করি

লগইন রেজিস্ট্রেশন করার জন্য লারাভেল Auth সেটআপ করা কম্পোজার এ নিচের কোড রান করি 
composer require laravel/ui
php artisan ui bootstrap
php artisan ui bootstrap --auth
npm install
npm run dev
php artisan migrate

যেকোনো টেম্প্লেটকে লারাভেল এ কাজ করা।
html css টেম্পলেট গুলো লারাভেল এর resources/views/ ফোল্ডার এ রাখা হয়।

প্রথমে html টেম্পলেট resources/views/ ফোল্ডার এ রাখি 
এইচটিএমএল ফাইল গুলোকে blade ফাইল এ কনভার্ট করি  index.html  ফাইল সহ  অন্য ফাইল গুলোকে  index.blade.php  এই ভাবে বানাও 
index ফাইলকে url এর মাদ্ধমে শো করার জন্য routes/web.php তে route তৈরী করি। 

Route::get('/sycorax',function(){
    return view('sycorax.index');
});
জাভাস্ক্রিপ্ট ও সিএসএস ফাইলকে লিংক করি 
প্রথমে css ও js ফাইলকে public ফোল্ডার এ মুভ করি assets বা অন্য যেকোনো নামে ফোল্ডারে রাখ .
 <!-- Styles -->
<link rel="stylesheet" href="{{ URL::asset('assets/css/bootstrap.min.css') }}" />
  <!-- Scripts -->
     <!-- Scripts -->
<script src="{{ asset('public/assets/js/jquery.min.js') }}" ></script>
<script src="{{ asset('public/assets/js/bootstrap.min.js') }}"></script> 

লারাভেল ৮ এ কমপ্লিট crud সিস্টেম ডেভেলপ করা

লারাভেল যেহেতু একটি mvc ফ্রেমওয়ার্ক তাই আমরা mvc প্যাটার্ন ফলো করবো। আমাদের এজন্য লাগবে
একটি model ,একটি controller ,একটি route ,একটি view ,একটি migration বা ডাটাবেস ফাইল .ডেমো হিসাবে item নাম এ একটি crud বানাবো

//কম্পোজার এ নিচের কোড রান করি 
php artisan make:model Items -mcr
  • database এ যে কলাম গুলো লাগবে সেগুলো মাইগ্রেশন ফাইল এ অ্যাড করি
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateItemsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('items', function (Blueprint $table) {
            $table->id();
            $table->string('code');
            $table->string('description');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('items');
    }
}

php artisan migrate এই কমান্ড comandprump এ এন্টার করে ডাটাবেস এ কলাম গুলো তৈরী করি।

ডাটাবেস এ মাইগ্রেশন জাতীয় সব ডিটেলস পাওয়া যাবে এই লিংকে

Model মডেল নিয়ে কাজ করা।

ইনসার্ট, আপডেট , ডিলিট কিভাবে কাজ করবে তা আমরা মডেল ফাইল এ বলে দেব (Items.php)


<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Items extends Model
{
    use HasFactory;
    protected $table = 'items'; //কোন টেবিল এ কাজ করবে তা বলে দেয়া। 
    protected $fillable = ['code','description','quantity']; // ইনসার্ট, আপডেট , ডিলিট  কোন কলামে হবে তা বলে দেয়া  
}

ইনসার্ট,আপডেট ,ফাইন্ড , ডিলেট কন্ট্রোলার দ্বারা কাজ করা

প্রথমে ভিউ বানাবো

 প্রথমে আমাদের তিনটি বাটন থাকবে ১.ডিলিট ২.সেভ ৩.ফাইন্ড 

ফাইন্ড এবং সেভ বাটনে ক্লিক করলে route থেকে কন্ট্রোলার ঘুরে যখন ভিউতে আসবে তখন ফর্ম এর ওপেনিং এরিয়া পরিবর্তন হবে

<!-- ফাইন্ড এবং add বাটনে ক্লিক করলে route থেকে কন্ট্রোলার ঘুরে যখন ভিউতে আসবে তখন ফর্ম এর ওপেনিং এরিয়া পরিবর্তন হবে -->

@if(@isset($find) && $find == 'find')   <form action="{{route('items.find')}}" method="post" id="myform" > @csrf @endif

@if(@isset($find) && $find == 'add') <form action="{{route('items.store')}}" method="post" id="myform"  > @csrf @endif

@if(@isset($find  ) && $find == 'edit') <form action="{{route('items.update',$output[0]->id )}}" method="post" id="myform" > @csrf @method('PUT') @endisset

ফর্ম এরিয়া

<div class="card">
    <div class="card-body">
  
        <table class="table table-bordered itemrow" id='rowtable'>
            <thead>
                
                    <th>#</th>
                    <th>Code</th>
                    <th>Description</th>
                    <th>Quantity</th>
                  
              
            </thead>
            <tbody>
                <tr>
                    <td ><i class="fa fa-plus" id='addRowButton'></i> <i class="fa fa-minus ibtnDel"></i></td>
                    <td><input type="text" class="form-control " type="text" name='code[]' value="@isset($output[0]){{$output[0]->code }} @endisset"></td>
                    <td><input type="text" class="form-control" type="text" name="description[]" value="@isset($output[0]){{$output[0]->description }} @endisset"></td>
                    <td><input type="text" class="form-control" type="text" name="quantity[]" value="@isset($output[0]){{$output[0]->quantity }} @endisset"></td>
                 
                </tr>

            </tbody>
        </table>
    </div>
</div>
<div class="text-center">

      @if(@isset($find  ) && $find == 'add') <button class="btn btn-primary btn-2" >ADD</button>   @endisset
      @if(@isset($find  ) && $find == 'find') <button class="btn btn-primary btn-2" >Find</button>   @endisset
      @if(@isset($find  ) && $find == 'OK') <button class="btn btn-primary btn-2" >OK</button>   @endisset
      @if(@isset($find  ) && $find == 'edit') <button class="btn btn-primary btn-2" >Edit</button>   @endisset
      <br>
       
</div>
</form>

অ্যাড ফাইন্ড এডিট ডিলিট নোটিফিকেশ শো করার জন্য ফর্ম এর পরে

@include('sycorax.layout.message')
@include('sycorax.layout.modal')

ফুটার সেকশন

      <!-- Scripts -->
<script src="{{ asset('assets/js/jquery.min.js') }}" ></script>


<script src="{{ asset('assets/js/bootstrap.min.js') }}"></script> 
  <script>

//  Click Plus Icon Add Row As Last Item
 
$(document).on('click', '#addRowButton', function() {
    var table = $('#rowtable'),
        lastRow = table.find('tbody tr:first '),
        rowClone = lastRow.clone();
    table.find('tbody').append(rowClone).val("");
    
});

// delete button click remove row 
$("#rowtable").on("click", ".ibtnDel", function (event) {
        $(this).closest("tr").remove();       
        counter -= 1
    });


/*checkbox hidden field 
 */

$('input[type="checkbox"]').on('change', function(e){
    if($(this).prop('checked'))
    {
        $(this).next($('input[type=hidden]')).removeAttr('name');
        
    } else {
        $(this).next($('input[type=hidden]')).value('1');
    }
});


    $('input[type=checkbox]:checked').each(function(index){
        $(this).next($('input[type=hidden]')).removeAttr('name');
});
   

   /* 
  For Modal Open
 */
$("#myModal").modal('show');

// Click Delete Anchor Button To Submit Delete Form
function myFunction() {
                document.getElementById("myform").submit();
            }
  </script>
</body>
</html>

বাটন দুইটির route তৈরি করি যেটা আমাদের কন্ট্রোলার এর show মেথড কল হবে।

Route::get('items/{btn}', [ItemsController::class, 'show'])->name('items.fbtn');

কন্ট্রোলার এর show মেথড হবে এরকম

public function show($id)
    {
return view('items.index',['find'=> $id]);
        
    }

Full View

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
     <!-- Styles -->
<link rel="stylesheet" href="{{ URL::asset('assets/css/bootstrap.min.css') }}" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
</head>
<body>
<!-- প্রথম এরিয়া শুরু  -->
    <!-- ডিলিট বাটন এরিয়া  -->
    <div class="col-md-1">
        <!-- নরমাল ভাবে ক্লিক করা যাবেনা এমন ডিলিট বাটন শো করবে  -->
        @if(!@isset($deletebtn))<span class=" fa fa-trash text-dark "></span> @endif  
        <!-- যদি ফাইন্ড বাটন ক্লিক করে শো বা এডিট ফর্ম পেজ হয়  -->
        @if(@isset($deletebtn)) 
            <form action="{{ route('items.destroy',$output[0]->id) }}" method="POST" id="myform"> @csrf @method('DELETE')
                <a href="#" onclick="myFunction()"><span class=" fa fa-trash text-dark "></span></a>
            </form>
        @endif   
    </div>
<!-- ফাইন্ড বাটন এরিয়া  -->
    <div class="col-md-1"> <a href="{{route('items.fbtn',['btn' => 'find'])}}" class="" ><span class=" fa fa-binoculars text-dark "></span></a>  </div>
    <!-- সেভ বাটন এরিয়া  -->
    <div class="col-md-1"> <a href="{{route('items.fbtn',['btn' => 'add'])}}" class="" ><span class=" fa fa-save text-dark  "></span></a> </div>
    <div class="col-md-9">
  



    </div>
    <div class="clearfix"></div> 
<!-- প্রথম এরিয়া শেষ  -->

<!-- ফাইন্ড এবং add বাটনে ক্লিক করলে route থেকে কন্ট্রোলার ঘুরে যখন ভিউতে আসবে তখন ফর্ম এর ওপেনিং এরিয়া পরিবর্তন হবে -->

@if(@isset($find) && $find == 'find')   <form action="{{route('items.find')}}" method="post" id="myform" > @csrf @endif

@if(@isset($find) && $find == 'add') <form action="{{route('items.store')}}" method="post" id="myform"  > @csrf @endif

@if(@isset($find  ) && $find == 'edit') <form action="{{route('items.update',$output[0]->id )}}" method="post" id="myform" > @csrf @method('PUT') @endisset

<div class="card">
    <div class="card-body">
  
        <table class="table table-bordered itemrow" id='rowtable'>
            <thead>
                
                    <th>#</th>
                    <th>Code</th>
                    <th>Description</th>
                    <th>Quantity</th>
                  
              
            </thead>
            <tbody>
                <tr>
                    <td ><i class="fa fa-plus" id='addRowButton'></i> <i class="fa fa-minus ibtnDel"></i></td>
                    <td><input type="text" class="form-control " type="text" name='code[]' value="@isset($output[0]){{$output[0]->code }} @endisset"></td>
                    <td><input type="text" class="form-control" type="text" name="description[]" value="@isset($output[0]){{$output[0]->description }} @endisset"></td>
                    <td><input type="text" class="form-control" type="text" name="quantity[]" value="@isset($output[0]){{$output[0]->quantity }} @endisset"></td>
                 
                </tr>

            </tbody>
        </table>
    </div>
</div>
<div class="text-center">

      @if(@isset($find  ) && $find == 'add') <button class="btn btn-primary btn-2" >ADD</button>   @endisset
      @if(@isset($find  ) && $find == 'find') <button class="btn btn-primary btn-2" >Find</button>   @endisset
      @if(@isset($find  ) && $find == 'OK') <button class="btn btn-primary btn-2" >OK</button>   @endisset
      @if(@isset($find  ) && $find == 'edit') <button class="btn btn-primary btn-2" >Edit</button>   @endisset
      <br>
       
</div>
</form>


@include('sycorax.layout.message')
@include('sycorax.layout.modal')

       <!-- Scripts -->
<script src="{{ asset('assets/js/jquery.min.js') }}" ></script>


<script src="{{ asset('assets/js/bootstrap.min.js') }}"></script> 
  <script>

//  Click Plus Icon Add Row As Last Item
 
$(document).on('click', '#addRowButton', function() {
    var table = $('#rowtable'),
        lastRow = table.find('tbody tr:first '),
        rowClone = lastRow.clone();
    table.find('tbody').append(rowClone).val("");
    
});

// delete button click remove row 
$("#rowtable").on("click", ".ibtnDel", function (event) {
        $(this).closest("tr").remove();       
        counter -= 1
    });


/*checkbox hidden field 
 */

$('input[type="checkbox"]').on('change', function(e){
    if($(this).prop('checked'))
    {
        $(this).next($('input[type=hidden]')).removeAttr('name');
        
    } else {
        $(this).next($('input[type=hidden]')).value('1');
    }
});


    $('input[type=checkbox]:checked').each(function(index){
        $(this).next($('input[type=hidden]')).removeAttr('name');
});
   

   /* 
  For Modal Open
 */
$("#myModal").modal('show');

// Click Delete Anchor Button To Submit Delete Form
function myFunction() {
                document.getElementById("myform").submit();
            }
  </script>
</body>
</html>

ফাইন্ড এবং add বাটন ক্লিক করলে ভিউতে ফরম মেথড ও বাটন এর টেক্সট পরিবর্তন হবে

// ফাইন্ড ও add বাটনে ক্লিক করলে route এর মাধ্যমে 
@if(@isset($find) && $find == 'find')   <form action="{{route('items.find')}}" method="post" id="myform" > @csrf @endif

@if(@isset($find) && $find == 'add') <form action="{{route('items.store')}}" method="post" id="myform"  > @csrf @endif
@if (@isset($moreoutput) && count($moreoutput) >0)
<div id="myModal" class="modal fade" >
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h5 class="modal-title">SEARCH RESULT</h5>
                <button type="button" class="close" data-dismiss="modal">&times;</button>
            </div>
            <div class="modal-body">
            @isset($moreoutput)
            <table class="table table-bordered">
                <thead class="">
                    <tr>
                        <th>Entry No</th>
                        <th>Item Code</th>
                        <th>Item Description</th>
                    </tr>
                </thead>
                <tbody>
                    @foreach ($moreoutput as $moreoutput)
                    <tr>
                    <td><a class="" href="{{ route('items.edit',$moreoutput->id) }}">{{$moreoutput->id}}</a></td>
                        <td>{{ $moreoutput->code }}</td>
                        <td>{{ $moreoutput->description }}</td>
                    </tr>
                    
                    @endforeach
                  
                </tbody>
         
            </table>
             
                @endisset
        </div>
    </div>
</div>
@endif

Message.blade.php

<!-- For Flash Meaasge -->
<div id="message">

@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif


      <div style="padding: 5px;">
          @if ($message = Session::get('success'))
          <div class="alert alert-success alert-block sticky-top alert alert-dismissible ">
              <button type="button" class="close" data-dismiss="alert">×</button> 
                  <strong>{{ $message }}</strong>
          </div>
          @endif
           
           
          @if ($message = Session::get('error'))
          <div class="alert alert-danger alert-block sticky-top alert alert-dismissible">
              <button type="button" class="close" data-dismiss="alert">×</button> 
                  <strong>{{ $message }}</strong>
          </div>
          @endif
           
           
          @if ($message = Session::get('warning'))
          <div class="alert alert-warning alert-block sticky-top alert alert-dismissible">
              <button type="button" class="close" data-dismiss="alert">×</button> 
              <strong>{{ $message }}</strong>
          </div>
          @endif
           
           
          @if ($message = Session::get('info'))
          <div class="alert alert-info alert-block sticky-top alert alert-dismissible">
              <button type="button" class="close" data-dismiss="alert">×</button> 
              <strong>{{ $message }}</strong>
          </div>
          @endif
           
           
          @if ($errors->any())
          <div class="alert alert-danger sticky-top alert alert-dismissible">
              <button type="button" class="close" data-dismiss="alert">×</button> 
              Please check the form below for errors
          </div>
          @endif
      </div>
  </div>
 
 
<!-- For Flash Meaasge End -->

ফাইন্ড বাটনে ক্লিক করলে ফর্ম এর মেথড পরিবর্তন হবে এবং সাবমিট বাটনের টেক্সট হবে ফাইন্ড এখন আমরা যদি ফর্ম এ কিছু ফিলাপ করে সাবমিট বাটন ফাইন্ড লিখা অবস্থায় ক্লিক করি তাহলে ফর্ম টি আইটেমস।ফাইন্ড নামের route এ যাবে যা items কন্ট্রোলার এর searchমেথড কল হবে

Route::group(['middleware' => ['web']], function () {
    Route::resources([
        'items' => ItemsController::class
      
    ]);
    Route::get('items/{btn}', [ItemsController::class, 'show'])->name('items.fbtn');

    Route::post('items/find', [ItemsController::class, 'search'])->name('items.find');
});

ITEMSCONTROLLER.php

<?php

namespace App\Http\Controllers;

use App\Models\Items;
use Illuminate\Http\Request;

class ItemsController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $data = Items::all();
        $route= 'store';
        return view('sycorax.items')->with([ 'route'=> $route,'find'=> 'add','data' =>  $data]);
    }


    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        // return view ('create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        
        $items = new Items;
        $validatedData =  $request->validate(
            // ভ্যালিডেটের শর্ত ও ফিল্টার 
            [
                'quantity.*' => 'required|numeric|min:1',
                'code.*' => 'required'
        
        ],

        [ // ভ্যালিডেটের মেসেজ 
            'quantity.required' => '<i class="fa fa-exclamation-triangle"></i>',
            'code.required' => "Item Is Required"
         ]


        );
// টোকেন ছাড়া ফর্ম দ্বারা সাবমিট করা সব ডাটা ভ্যারিয়েবল এ জমা করলাম 
$data = $request->except(['_token']);
$a = count($data['quantity']); // 
$row = array(); // ফাঁকা একটি এরে নিলাম যার মধ্যে ফর্ম থেকে আসা ডাটা  নিজেরমত করে সাজাবো 

/* প্রথমে আমরা ফর্ম হতে ডাটা পাবো  মাল্টিডিমেনশন এরে আকারে যেখানে প্রত্যেকটা ইনপুট একটা এরে হিসাবে ডাটা প্রদান করবে
 Array ( [code] => Array ( [0] => 23 ) [description] => Array ( [0] => 23 ) [quantity] => Array ( [0] => 34 ) ) 
 */

 

foreach( $data  as $key => $value){
    if (is_array($value)) {
        for ($i=0; $i <count($value); $i++) { 
            $row[$key][] = $value[$i];
    
        }
        }

    else{
       
        $items->$key =  $value;
    }

}


for ($i=0; $i < count($row['quantity']) ; $i++) { 
    foreach($row as $key => $value){
        $items->$key = $row[$key ][$i];
    }
    
  }

  try {

    $items->save();
 
    return redirect()->route('items.index')->with('success', 'SAve SuccessFull [Message 200-48]');
 
 } catch (\Exception $e) {
 
   return redirect()->route('items.index')->with('error', 'ISome Error Have ');

 }


    }


public function find(Request $request){

}


public function search(Request $request){
  
      
try {
    $output = array();
    $data = $request->except(['_token']);
 
    foreach( $data  as $key => $value){
        if (is_array($value)) {
            
            for ($i=0; $i <count($value); $i++) { 
                if(!empty($value[$i]) ) {

                    $output= Items::where($key, 'like', '%'.$value[$i].'%')->get() ;
                   
             
            }}
        }

        elseif(!is_array($value)){
            if (!empty($value)) {
                $output = Items::where($key, 'like', '%'.$value.'%')->get() ;

            }
        }
    }

    if (count($output) == 1) {
        
        return view('sycorax.items',['output' => $output,'find'=> 'edit','deletebtn' =>'delete' ]);
    } elseif(count($output) == 0) {
        return view('sycorax.items',['output' => $output]);
    }
    elseif(count($output)>1) {
        return view('sycorax.items',['moreoutput' => $output]);
    }
} catch (\Exception $e) {
    return redirect()->route('items.index')->with('error', 'ISome Error Have ');
}

}
    /**
     * Display the specified resource.
     *
     * @param  \App\Models\Items  $items
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $link = Items::where('id',$id)->first();
        return view('sycorax.items',['find'=> $id,'link' => $link]);
    }

    
    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Models\Items  $items
     * @return \Illuminate\Http\Response
     */
    public function edit(Items $items)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\Items  $items
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $items = Items::find($id);

        $data = $request->except(['_token','_method']);
        $a = count($data['quantity']); // 
        $row = array();


        foreach( $data  as $key => $value){
            if (is_array($value)) {
                for ($i=0; $i <count($value); $i++) { 
                    $row[$key][] = $value[$i];
            
                }
                }
        
            else{
               
                $items->$key =  $value;
            }
        
        }
        
        
        for ($i=0; $i < count($row['quantity']) ; $i++) 
        { 
            foreach($row as $key => $value){
                $items->$key = $row[$key ][$i];
            }
            
          }

          $items->save();

       return route('items.index')->with('success','Update Successfull');
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  \App\Models\Items  $items
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        Items::where('id', $id)->delete();
        return redirect()->route('items.index')
        ->with('success','Post deleted successfully');
    }
}

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.