Laravel Controller’ını Laravel Dışından Çalıştırmak

Merhaba bu makalede laravel ile geliştirme yaparken işinize olukça yarayacağını düşündüğüm bir konudan bahsedeceğim.

Bazen laravel dışındaki bazı bileşenleri kullanırken bileşenin back-and tarafında kullanıcının üye olup olmadığını veya yetkisinin ne olduğunu öğrenmem gerekiyor. Bu durumlarda aşağıdaki adımları izleyerek kendinize ait bit kod oluşturabilirsiniz.

Bu işlemi gerçekleştirebilmek için 1 controller ve içerisinde 1 metod ve bunları dışarı açmak için bir route oluşturmak gerekiyor.

Route dosyamızın içerisine aşağıdaki veya sizin adını değiştirmeyi isteyeceğiniz şekilde bir tanımlama yapıyoruz.

Route::get('sonucual','[email protected]');

Şimdi sırada bu route için bir Controller ve içine işlem yapmak istediğimiz fonksiyonu ekliyoruz.

Ben ziyaretçinin üye olup olmadığını kontrol ettirdim ve buna göre bir sonuç döndürdüm. Siz istediğiniz kodlamayı yapabilirsiniz.

use Illuminate\Support\Facades\Auth; // eklemediyseniz controller'in en başına php etiketin'den sonra bu namespace'yi ekleyin


//controller'in içine işimize yarayan fonksiyonu koyuyoruz
function sonuc(){
    return Auth::check() ? 'uye':'ziyaretci';
}

Bu kodları ekledikten sonra taratıcınıza siteadi.com/sonucal yazdığınızda ekranda üye olduğunuz veya üye olmadığınız yazmalı.

Şimdi sırada bu fonksiyonu laravel dışından çağırmak var. Bunun için laravel projemizin public klasöründeki index.php dosyasının yapısını incelediğimizde laravel’in requestleri nasıl yakaladığını görüyoruz. Biz’de kendi request’imizi oluşturarak laravel içinde istediğimiz fonksiyonu çalıştırabiliriz.

default index.php şu veya benzer şekilde olacakdır

<?php
define('LARAVEL_START', microtime(true));

require __DIR__.'/../vendor/autoload.php';

$app = require_once __DIR__.'/../bootstrap/app.php';


$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response);

Öncelikle kodları açıklayalım require metodu ile otomatik class yükleyiciyi başlatıyor ve sonrasında laravel’in kernel’ini başlatıyor. Buraya kadar sabit kalıcak. Sonrasında bir request oluşturuyor ve bunu handle metodu ile işliyor. Burada request’i capture metodu ile tarayıcıdan alıyor, biz ise create metodu ile kendimize göre aşağıdaki gibi oluşturucaz ve sonrasında cevabı send metodu ile ekrana yazdırmak gerine getContent metodu ile değişkene atayıp controller’dan aldığımız sonucu istediğimiz şekilde kullanacağız.

<?php

function islemyap(){
    define('LARAVEL_START', microtime(true));

    require __DIR__.'/../vendor/autoload.php';

    $app = require_once __DIR__.'/../bootstrap/app.php';

    $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

    $response = $kernel->handle(
        // burada capture fonksiyonu yerine create kullanarak kendi çalışmasını istediğimiz request'i yazıyoruz
        $request = Illuminate\Http\Request::create('/sonucual','GET',[],$_COOKIE)
    );
    
    //send fonksiyonu ile sonucu ekrana yazmak yerine getContent ile değişkene atıyoruz
    $sonuc = $response->getContent();
  
    $kernel->terminate($request, $response);

    return $sonuc;//sonucu döndürüyoruz
}

bu fonksiyondaki dosya yollarını projenize göre düzenleyerek çok rahat bir şekilde laravel de istediğiniz controller’i dışarıdan çalıştırarak sayfayı açan kullanıcının üye olup olmadığını öğrenebilirsiniz. Örneğin ben kcfinder’de kullanıcının üye bilgilerini almak için kullanmıştım.Kcfinder kendi php config dosyasına sahip ve laravel içinden değilde ayrı bir sayfa üzerinden çalışıyor.

Eğer bu konuda daha fazla şey öğrenmek isterseniz örnekteki Request sınıfını incelemenizi öneririm.

Benim çok işime yaradı umarım sizin de yarar.

Görüşmek üzere.

Laravel Yetkilendirme: Kullanıcı İzinleri ve Grupları Oluşturmak

Merhaba bu makalede Laravel’in çok fazla kullanılan paketlerinden biri olan spatie/laravel-permission paketini kullanarak kullanıcı grupları (Rol) ve kullanıcı izinleri (yetkileri) oluşturucaz.

Rol: kullanıcı grubu olarak da adlandırabileceğimiz üyemizin türü.

Permission: adının türkçe karşılığından da anlaşılabileceği gibi rolümüze verevceğimiz izinler.

3 tip kullanıcımız olacak. Yazar yazı okuma, yazma, düzenleme izinlerine sahip olucak, okuyucu sadece okuma iznine sahip olucak. admin ise tüm izinlere sahip olucak.

1.Yazar

2.Okuyucu

3.Admin

Benim kullandığım laravel sürümü 7, bu paket laravel 5.8 ve üzerini destekliyor bunu da bilmenizde yarar var.

Paketimizi laravel projemize aşağıdaki kodu çalıştırarak dahil edebiliriz.

 composer require spatie/laravel-permission

Şu an laravel projemize paketi dahil ettik fakat ufak tefek bazı düzenlemeler daha yapmamız gerekiyor.

İlk düzenleem paketimizin serviceprovider’ini register etmemiz olacak.

Spatie\Permission\PermissionServiceProvider::class,

Yukarıdaki service provider’i eklediğimizde görüntü şu şekilde olmalı.

Şimdi sırada migration işlemimiz var üye tablonuzun kurulu olduğunu varsayıyorum. Daha önceden laravel auth aktif etmediyseniz ve üye giriş – üye ol sayfalarını oluşturmadıysanız oluşturup derse devam edin.

Şimdi öncelikle 3kullanıcı ekliyoruz sisteme laravel hazır üye ol sayfasından üye olabilirsiniz.

User model’e kullanacağımız bazı metodlar için Trait ekliyoruz

use HasRoles;

Üyelerimizin id’leri [1,2,3] olsun

Öncelikle Role ve Permission oluşturmak için namespace’leri sayfamızın en üstüne ekliyoruz.

<?php
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
?>

Şimdi sırada oluşturduğumuz controller içine create adında bir fonksiyon oluşturuyoruz basitçe bu fonksiyon içinde oluşturmak istediğimiz rol ve permissionları oluşturucaz.

<?php
//kullanızı türlerini yani grupları oluşturuyoruz
Role::create(["name" => "writer"]);// id 1
Role::create(["name" => "reader"]);// id 2
Role::create(["name" => "superadmin"]); // id 3

//izinleri oluşturuyoruz
Permission::create(["name" => "edit post"]); // id 1
Permission::create(["name" => "read post"]); // id 2
Permission::create(["name" => "add user"]);// id 3


//yazar'a yazma,okuma iznini veriyoruz

$yazmaizni = Permission::findById(1);
$okumaizni = Permission::findById(2);

$yazar = Role::findById(1);

$yazar->givePermissionTo($yazmaizni);
$yazar->givePermissionTo($okumaizni);

//kullanıcıya yazar rolünü veriyoruz
$user1 = User::findById(1);
$user1->assignRole('writer');

//kullanıcının yazmaizni varmı kontrol ediyoruz 

if($user1->hasRole('writer')){
    //kullanıcı yazma iznine sahip
}else{
    //kullanıcı yazma iznine sahip değil
}

?>

Dosyamızı kaydedip controller’i tarayıcıda çalıştırıyoruz ve role ve izinleri oluşturuyoruz.