Laravel Kurulum Hataları ve Çözümleri: Failed to download doctrine/inflector from dist:

laravel kurulumunda cmd composer komutunda hata mesajı aldım

composer global require "laravel/installer" 

komutunu çalıştırdığımda aldığım hata mesajı:

Failed to download doctrine/inflector from dist: The zip extension and unzip/7z commands are both missing, skipping.
The php.ini used by your command-line PHP is: C:\xampp\php\php.ini
Now trying to download from source

In GitDownloader.php line 82:

git was not found in your PATH, skipping source download

Çözümüne gelecek olursak

Bu hata mesajları, sisteminizde belirli araçların eksik olduğunu ve bu nedenle Laravel kurulumunun tamamlanamadığını gösteriyor. İşte bu hataları çözmek için yapmanız gerekenler:

1 PHP Zip Uzantısını Yükleme:

php.ini dosyanızı düzenleyin ve zip uzantısının etkinleştirildiğinden emin olun.
C:\xampp\php\php.ini dosyasını bir metin düzenleyici ile açın.
;extension=zip satırını bulun ve başındaki ; işaretini kaldırarak satırı şu şekilde değiştirin:
ini
Kodu kopyala
extension=zip
Değişiklikleri kaydedin ve Apache’yi yeniden başlatın.

2 unzip veya 7z Yükleme:

Eğer Windows kullanıyorsanız, 7-Zip uygulamasını indirip yükleyebilirsiniz.

7-Zip yüklendikten sonra, 7z komutunun sistem PATH değişkenine eklendiğinden emin olun.
7z kurulum klasörünü (genellikle C:\Program Files\7-Zip\) sistem PATH değişkenine eklemek için:
Windows Başlat menüsünden “Sistem Özellikleri”ni açın.
Gelişmiş sistem ayarlarını seçin.
Ortam Değişkenleri’ni tıklayın.
Path değişkenini seçin ve düzenleyin.
Yeni bir satır ekleyin ve C:\Program Files\7-Zip\ yolunu girin.
Değişiklikleri kaydedin ve çıkın.

Git Yükleme ve PATH Ayarlama:

Git yüklü değilse, Git uygulamasını indirip yükleyin.
Kurulum sırasında “Git Bash Here” ve “Git GUI Here” seçeneklerini etkinleştirin.
Git yüklendikten sonra, Git’in PATH değişkenine eklendiğinden emin olun. Bu genellikle otomatik olarak yapılır, ancak emin olmak için:
Komut İstemcisine git –version yazın ve çalışıp çalışmadığını kontrol edin.

Eğer çalışmıyorsa, Git kurulum yolunu (C:\Program Files\Git\bin) PATH değişkenine ekleyin.

Yukarıdaki adımları tamamladıktan sonra, komut istemcisini yeniden açın ve composer global require “laravel/installer” komutunu tekrar çalıştırmayı deneyin. Bu adımlar sorunlarınızı çözmeli ve Laravel kurulumunu başarıyla tamamlamanıza yardımcı olacaktır.

Laravel 8 Table Seeder içinde Faker Kullanımı

Örnek çalışma aşağıdadır.

<?php
use App\Models\Category;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
use Faker\Factory as Faker;
use Illuminate\Support\Str;
class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
 
     //   DB::table('categories')->truncate(); bunun yerine model kullanabiliriz
 
       Category::truncate();
       $faker = Faker::create();
        for($i=0; $i<30; $i++) {
           $category_name = rtrim($faker->sentence(1), '.');
            Category::create([
            'name' => $category_name,
            'slug' => Str::slug($category_name)
            ]);
        }
 
        //
    }
    }
}
?>

CategoriesTableSeeder isimli class yapısıyla beraber seed işlemi yapmak için örnek komut satırı:

 php artisan db:seed --class=CategoriesTableSeeder

DatabaseSeeder ile komut yazmak ve çalıştırmak (Laravel 8)

Laravel 8 ile DatabaseSeeder kullanabilmek için daha önce Factory oluşturmak gerekiyor bunu yaptığınızı varsayıyorum. (Laravel 8 Factory Oluşturmak)

Örnek Seeder yapısı

<?php
 
namespace Database\Seeders;
 
use App\Models\Product;
use App\Models\User;
use Illuminate\Database\Seeder;
 
class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        // \App\Models\User::factory(10)->create();
 
 
        User::factory()->count(100)->create();
        Product::factory()->count(100)->create();
 
    }
}

rastgele 100 kullanıcı oluşturmak ve veritabanına kaydetmek için:
factory(User::class, 100)->create();

rastgele 100 ürün oluşturmak ve kaydetmek için
Product::factory()->count(100)->create();

Çalıştırmak için terminalden:

php artisan db:seed

Laravel 8 Route::resource Controller Tanımlaması nasıl yapılır?

Sorunsuz bir şekilde OrnekController isimli bir controller oluşturduktan sonra route tanımlaması aşağıdaki gibi yapılması uygun olacaktır.

Route::resource('/products','App\Http\Controllers\OrnekController');

Eski sürümlerde yapılan tanımlama ise şöyleydi:

Route::resource('/products','OrnekController');

Bu şekilde yapacağınız tanımlar laravel 8 ve sonrasında sorun oluşturabilir.

Laravel 8 Tinker Terminal ile Product factory oluşturmak

Öncelikle Product isminde Model oluşturmanız gerekiyor isimler birebir aynı olursa hata almaycaksınız komut satırında vereceğim komutlar Laravel 8’e göredir.

ProductFactory adında factory oluşturmak için:

php artisan make:factory ProductFactory

Oluşan dosyanız database->factories içinde yer alan ProductFactory.php şeklinde olacaktır. Örnek içerik:

<?php
 
namespace Database\Factories;
 
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;
 
class ProductFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array
     */
 
 
    public function definition()
    {
        $product_name = $this->faker->sentence(3);
 
        return [
            'name' => $product_name,
            'slug' => Str::slug($product_name),
            'description' => $this->faker->paragraph(5) ,
            'price' => mt_rand(10,100) / 10
        ];
    }
}

Okumaya devam et Laravel 8 Tinker Terminal ile Product factory oluşturmak

En Çok Kullanılan Laravel Mysql Terminal Komutları, Veritabanı işlemleri (Tinker)

Mysqle root ile bağlantı kurmak

mysql -u root

UTF8 formatında Veritabanı oluşturmak:

 CREATE DATABASE laravel_api CHARACTER SET utf8 COLLATE utf8_general_ci;

İşlem yapmak üzere İlgili veritabanını seçmek

USE DATABASEADI

Migrate dosyalarını çalıştırmak için

php artisan migrate

Yeni Migrate oluşturmak için

 php artisan make:migration create_products_table --create=products

Çalıştırılan Son Migrate işlemini geri almak için

php artisan migrate:ROLLBACK

Çalıştırılan TÜM Migrate işlemini geri almak için

php artisan migrate:reset

Hem reset Hem de migrate işlemini tek seferde yapmak için

php artisan migrate:refresh

Bütün tabloları silmek için

php artisan migrate:fresh

Migrate işleminde ilgili alanı Boş kalabilir yapmak için

$table->text('ornekalan')->NULLABLE();

Laravelde DB sınıfına ait hazır metodları kullanmak için

php artisan tinker

Tinker terminalden kayıt eklemek için

DB::INSERT('insert into tabloadi (sutun1, sutun2, sutun3) values (?, ?, ?), ['aciklama 1 ', 'aciklama 2', 'aciklama 3'] ');

Tinker terminalden kayıtları listelemek için

 DB::SELECT('select * from products');

Tablodaki verileri listelemenin diğer yolu:

DB::TABLE('urunler')->GET();

Tablodaki tek bir kaydı çekmek için

>>> DB::TABLE('urunler')->WHERE('kolonadi','icerik1')->GET()

Tablodaki verilerden tek bir şarta göre veri çekmek için
Örn: fiyatı 10 üzerinde olanları listelemek:

DB::TABLE('urunler')->WHERE('fiyat','>', 10)->GET()

Tablodaki verilerden tek bir şarta göre tek veri çekmek için
Örn: fiyatı 10 üzerinde olanlardan ilkini almak için

DB::TABLE('urunler')->WHERE('fiyat','>', 10)->FIRST()

Doğrudan ID’ye ait değere göre veri çekmek için:

DB::TABLE('urunler')->find(1);

Dizi halinde veri eklemek:

DB::TABLE('urunler')->INSERT(['name'=>'Product 10', 'slug'=> 'product-10', 'price'=>100])

Tablodaki kayıt sayısını bulmak

 DB::TABLE('urunler')->COUNT()

Her tabloya karşılık gelecek model oluşturmak:

php artisan make:model modelAdi

modelAdi İsimli Modeldeki Verileri Listelemek

 \App\Models\modelAdi::GET()

Laravel 8’de tinker kullanarak nesne oluşturmak:

$product = NEW \App\Models\Product;

Laravel 8 Tinker nesne içindeki verilerin veritabanına kaydedilmesi

 $product->save()

Tablodaki bütün kolonlara veri ekleme yapılabilmesine olacak sağlayan kod model içinde kullanımı

protected $guarded = [];

Tabloda seçili bir alanı güncellemek;

 App\Models\Urun::find(2)->UPDATE(['price' =>45.50]);

factory ile fake veriler oluşturmak

User::factory()->make();

Kullanım örneği:

use App\Models\User;

public function test_models_can_be_instantiated()
{
    $user = User::factory()->make();

    // Use model in tests...
}

Çoklu kullanım örneğin 3 adet kullanıcı oluşturmak için


User::factory()->count(3)->make();

Veritabanına eklemek için


User::factory()->count(3)->create();

Tabloyu boşlatmak için

DB::table('users')->truncate();

Factory Template Dosyası oluşturmak için

php artisan make:factory OrnekFactory

OrnekFactory içindeki ayarlamaları yaptıktan sonra tinker çalıştırmadan önce

composer dump-autoload

komutunu çalıştırmakta fadya var aksi halde hata alabilirsiniz.

seeders çalıştırmak

seed yapısı için run fonksiyonu içine
– 10 kullanıcı oluşturmak için
– bunu yapabilmek için daha önce UserFactory.php dosyasının olması ve gerekli düzenlemenin yapılmış olması gerekiyor.

 User::factory()->count(10)->create();

Terminalden bu komutu çalıştırmak için

php artisan db:seed

DatabaseSeeder.php içinden işlemler;

– Tabloyu boşaltmak için

DB::statement("Truncate table users");

Özel Seeder Yapısı oluşturmak:

 php artisan make:seeder OrnekTableSeeder

Harici seeder dosyalarını çağırmak:

Yukarıdaki gibi oluşturulan OrnekTableSeeder dosyasını DatabaseTableSeeder.php içine aşağıdaki gibi çağırarak kullanabiliriz:

 $this->call(OrnekTableSeeder::class);

Tabloların içini tamamen silmek:

php artisan migrate:fresh

Tüm tabloları silmek ve ardından seed işlemiyle otomatik doldurmak için

php artisan migrate:fresh --seed

Controller’dan uyeler.blade.php’ye veri göndermek için

$uyeler = Uyeler::find(3);
return view('uyeler', array('uyeler'=>$uyeler));

Şarta göre veri listelemek

$uyeler = Uyeler::where('id',4)->first();
return view('uyeler', array('uyeler'=>$uyeler));

WhereRaw fonksiyonu ile şarta göre veri listelemek

$uyeler = Uyeler::whereRaw('id=?', array(1))->first();
return view('uyeler', array('uyeler'=>$uyeler));

Birden fazla satır veri listelemek

$uyeler = Uyeler::all();

satır sayısını bulmak

$uyeSayisi = Uyeler::where('id', '>', 0)->count();

Yukarıda değişkene aktarılanları uyeler blade sayfasına postalamak için

return view('uyeler', array('uyeler'=>$uyeler, 'uyeSayisi' =>$uyeSayisi));

Route yapısı içinde factory kullanımı

Route::get('/users', function (){

    return User::factory()->count(10)->make();

});

Controller oluştururken Otomatik model ve metodları oluşturmak

php artisan make:controller ProductController --resource --model=Product

Route Tanımlarını Listelemek

 php artisan route:list

Api Klasörü içinde model tanımlı oluşturmak

php artisan make:controller Api\ProductController --api --model=
product

apiResources Toplu Tanımlama Örneği:

Route::apiResources([
    'products' => 'App\Http\Controllers\Api\ProductController',
    'users' => 'App\Http\Controllers\Api\UserController'

]);

Product isimli modeldeki dataların hepsini listelemek

  return Product::all();
 

Product isimli modeldeki dataların hepsini listelemek 2. yol

  return response()->json(Product::all(), 200);
 

ID’ye dayalı veri kontrolü yapmak (girilen id değerine karşılık veritabanında veri yoksa hata mesajı vermek)

    public function show($id)
    {
        $product = Product::find($id);
 
        if ($product)
            return response($product, 200);
        else
            return response(['message' => 'Product not found'], 404);
 
       // return $product;
 
    }

Laravel 8 PUT / update işlemi için aşağıdaki yöntemler kullanılabilir

    public function update(Request $request, product $product)
    {
        //

          $input = $request->all();
          $product->update($input);

        return response([
            'data' => $product,
            'message' => 'Product updated.'
             ], 200);

    }

yada

    public function update(Request $request, product $product)
    {
        //


        $product->name = $request->name;
        $product->slug = Str::slug($request->name);
        $product->price = $request->price;
        $product->save();

        return response([
            'data' => $product,
            'message' => 'Product updated.'
             ], 200);

    }

Laravel 8 DELETE / silme işlemi için aşağıdaki yöntemi kullanabilirsiniz.

public function destroy(product $product)
{
//

$product->delete();

return response([

‘message’ => ‘Product deleted’
], 200);

}

Laravel 8 Paginate sayfalama kullanımı

– her sayfada 5 adet gösterim için

  return response(Product::paginate(5),200);

Laravel 8 Paginate Offset ve limit kullanımı:
– varsayılan değerleri girerek sayfalama

        $offset = $request->offset ? $request->offset: 0;
        $limit = $request->limit ? $request->limit: 10;

        return response(Product::offset($offset)->limit($limit)->get(),200);

Get kullanımı örnek:
– 11’den itibaren 5 kayıt ekrana gelecektir

http://127.0.0.1:8000/api/products?offset=10&limit=5

Call to undefined function factory() in Psy Shell code ÇÖZÜMÜ

Laravel 8 sonrası factory kullanımıyla alakalı gelebilecek hatalardan birisi;

PHP Fatal error: Call to undefined function factory() in Psy Shell code on line 1

bu hatanın oluşmasına sebep olan komut satırı

factory(App\Models\User::class)->make();

ÇÖZÜM:
Laravel 8’de güncel olarak YUKARIDAKİ kod yerine aşağıdakini kullanarak sorunu çözebilirsiniz.

User::factory()->make();

Kullanım örneği:

use App\Models\User;

public function test_models_can_be_instantiated()
{
    $user = User::factory()->make();

    // Use model in tests...
}

Çoklu kullanım örneğin 3 adet oluşturmak için


User::factory()->count(3)->make();

Veritabanına eklemek için


User::factory()->count(3)->create();

Tinker Terminal üzerinden model kullanarak veri ekleme işlemi

Modele dizi halinde veri ekleme işlemi için

\App\Models\Product::create(['name'=>'Product 6', 'slug'=>'product-6', 'price'=>88 ])

kullanabilirsiniz.

Şöyle bir hata alıyorsanız;

Illuminate\Database\Eloquent\MassAssignmentException with message 'Add [name] to fillable property to allow mass assignment on [App\Models\Product].'

Product isimli model dosyasına eklenmesi gereken kod blogu;

 protected $fillable = ['name', 'slug', 'price'];

** 3 adet veri ekleme denemesi yaptığımız sütunların isimlerini örnekteki gibi yapmamız gerekiyor.

Eğer Tinker kullanarak ekleme işlemi yapmaya çalışıyorsanız hatanın düzelmesi için tinkerı kapatıp tekrar başlatmanız gerekecektir.

Laravel 8 Target class [xxxController] does not exist. HATA ÇÖZÜMÜ

hata kodu:

  * @throws \Illuminate\Contracts\Container\BindingResolutionException
 
     * @throws \Illuminate\Contracts\Container\CircularDependencyException
 
     */
 
    public function build($concrete)
 
    {
 
        // If the concrete type is actually a Closure, we will just execute it and
 
        // hand back the results of the functions, which allows functions to be
 
        // used as resolvers for more fine-tuned resolution of these objects.
 
        if ($concrete instanceof Closure) {
 
            return $concrete($this, $this->getLastParameterOverride());
 
        }
 
 
 
        try {
 
            $reflector = new ReflectionClass($concrete);
 
        } catch (ReflectionException $e) {
 
            throw new BindingResolutionException("Target class [$concrete] does not exist.", 0, $e);
 
        }
 
 
 
        // If the type is not instantiable, the developer is attempting to resolve
 
        // an abstract type such as an Interface or Abstract Class and there is
 
        // no binding registered for the abstractions so we need to bail out.
 
        if (! $reflector->isInstantiable()) {
 
            return $this->notInstantiable($concrete);
 
        }
 
 
 
        // if (in_array($concrete, $this->buildStack)) {
 
        //     throw new CircularDependencyException("Circular dependency detected while resolving [{$concrete}].");
 
        // }
 
 
 
        $this->buildStack[] = $concrete;

web.php’de hata almama sebep olan route yapısı:

Route::get('/xxx/{id}/', 'xxxController@show');

Hatanın düzelmesi için eklenmesi gereken kod: App\Http\Controllers\

Düzeltmeden sonrası:

Route::get('/xxx/{id}/', 'App\Http\Controllers\xxxController@show');