Laravel: Sıfırdan İleri Seviye

Ders 4/17 55 dakika

Controller'lar

Controller oluşturma, resource controller, dependency injection ve best practices.

Controller'lar

Controller'lar HTTP isteklerini işleyen sınıflardır. İlgili request handling logic'ini gruplamak için kullanılır.

Controller Oluşturma

# Temel controller
php artisan make:controller UserController

# Resource controller (CRUD metodları ile)
php artisan make:controller PostController --resource

# API Resource controller
php artisan make:controller Api/PostController --api

# Model binding ile
php artisan make:controller PostController --resource --model=Post

# Invokable controller (tek metod)
php artisan make:controller ShowProfile --invokable

Temel Controller

validate([
            'name' => 'required|string|max:255',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:8|confirmed',
        ]);
        
        $user = User::create([
            'name' => $validated['name'],
            'email' => $validated['email'],
            'password' => bcrypt($validated['password']),
        ]);
        
        return redirect()
            ->route('users.show', $user)
            ->with('success', 'Kullanıcı oluşturuldu!');
    }
}

Resource Controller

paginate(10);
        return view('posts.index', compact('posts'));
    }
    
    /**
     * GET /posts/create - Oluşturma formu
     */
    public function create()
    {
        return view('posts.create');
    }
    
    /**
     * POST /posts - Kaydet
     */
    public function store(Request $request)
    {
        $validated = $request->validate([
            'title' => 'required|max:255',
            'content' => 'required',
        ]);
        
        $post = auth()->user()->posts()->create($validated);
        
        return redirect()->route('posts.show', $post);
    }
    
    /**
     * GET /posts/{post} - Tek kayıt
     */
    public function show(Post $post)
    {
        return view('posts.show', compact('post'));
    }
    
    /**
     * GET /posts/{post}/edit - Düzenleme formu
     */
    public function edit(Post $post)
    {
        return view('posts.edit', compact('post'));
    }
    
    /**
     * PUT /posts/{post} - Güncelle
     */
    public function update(Request $request, Post $post)
    {
        $validated = $request->validate([
            'title' => 'required|max:255',
            'content' => 'required',
        ]);
        
        $post->update($validated);
        
        return redirect()->route('posts.show', $post);
    }
    
    /**
     * DELETE /posts/{post} - Sil
     */
    public function destroy(Post $post)
    {
        $post->delete();
        
        return redirect()->route('posts.index');
    }
}

Dependency Injection

use App\Services\PaymentService;
use App\Repositories\UserRepository;

class PaymentController extends Controller
{
    // Constructor injection
    public function __construct(
        private PaymentService $paymentService,
        private UserRepository $userRepository
    ) {}
    
    public function process(Request $request)
    {
        $user = $this->userRepository->find($request->user_id);
        $result = $this->paymentService->charge($user, $request->amount);
        
        return response()->json($result);
    }
    
    // Method injection
    public function report(Request $request, ReportService $reportService)
    {
        return $reportService->generate($request->all());
    }
}

Invokable Controller

Tek bir işlem yapan controller'lar için:

Response Türleri

// View döndürme
return view('users.index', ['users' => $users]);

// Redirect
return redirect('/dashboard');
return redirect()->route('users.index');
return redirect()->back();
return redirect()->back()->withInput();

// JSON
return response()->json(['status' => 'success']);
return response()->json($data, 201);

// Download
return response()->download($pathToFile);
return response()->download($path, $name, $headers);

// Custom response
return response('Hello World', 200)
    ->header('Content-Type', 'text/plain');

// Flash message ile redirect
return redirect()
    ->route('posts.index')
    ->with('success', 'Post oluşturuldu!')
    ->with('post_id', $post->id);

Önemli Noktalar

  • Controller'lar HTTP isteklerini işler
  • php artisan make:controller ile oluşturulur
  • Resource controller CRUD operasyonları için hazır metodlar içerir
  • Dependency injection ile servisler enjekte edilir
  • Single responsibility prensibi önemli