PHP / Laravel үндэс

Laravel үндэс

Laravel бол PHP-ийн хамгийн алдартай, хамгийн их хайлагддаг фреймворк юм. Нэвтрэлт, өгөгдлийн сан, routing, template, тест, queue, email — бүгдийг бэлэн хэрэгсэлтэйгээр өгдөг. Энэ хичээлд Laravel-ийн үндсэн ойлголтуудтай танилцаж, анхны жижиг апп бүтээнэ.

Laravel суулгах

bash
# Composer-ээр шинэ Laravel апп үүсгэнэ
composer create-project laravel/laravel миний-апп
cd миний-апп

# Эсвэл Laravel installer ашиглан
composer global require laravel/installer
laravel new миний-апп

# Хөгжүүлэлтийн сервер ажиллуулах
php artisan serve
# Server running on http://127.0.0.1:8000

.env файлд өгөгдлийн сангийн холболт тохируулна:

ini
APP_NAME="Миний Апп"
APP_ENV=local
APP_KEY=base64:...         # php artisan key:generate-р үүснэ
APP_DEBUG=true
APP_URL=http://localhost

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=миний_апп
DB_USERNAME=root
DB_PASSWORD=

MVC загвар — Laravel-ийн суурь

Laravel нь MVC (Model-View-Controller) загварыг дагадаг:

код
Хэрэглэгч хүсэлт явуулна
        ↓
    Route         ← routes/web.php — URL-ийг controller руу чиглүүлнэ
        ↓
  Controller      ← app/Http/Controllers/ — логик
        ↓
    Model         ← app/Models/ — өгөгдлийн сан
        ↓
    View          ← resources/views/ — Blade template (HTML)
        ↓
Хэрэглэгч хариу хүлээн авна
php
<?php
// routes/web.php — URL ба controller холбоно
use App\Http\Controllers\НийтлэлController;

Route::get('/', fn() => view('welcome'));

Route::get('/нийтлэлүүд',           [НийтлэлController::class, 'жагсаалт']);
Route::get('/нийтлэлүүд/үүсгэх',   [НийтлэлController::class, 'үүсгэх_маягт']);
Route::post('/нийтлэлүүд',          [НийтлэлController::class, 'хадгалах']);
Route::get('/нийтлэлүүд/{id}',      [НийтлэлController::class, 'харуулах']);
Route::delete('/нийтлэлүүд/{id}',   [НийтлэлController::class, 'устгах']);

// Resource route — дээрхийг товчоор бичнэ
Route::resource('нийтлэлүүд', НийтлэлController::class);
?>

Controller — хүсэлт боловсруулах

bash
# Controller үүсгэх
php artisan make:controller НийтлэлController --resource
php
<?php
// app/Http/Controllers/НийтлэлController.php
namespace App\Http\Controllers;

use App\Models\Нийтлэл;
use Illuminate\Http\Request;

class НийтлэлController extends Controller
{
    // GET /нийтлэлүүд — жагсаалт харуулах
    public function index()
    {
        $нийтлэлүүд = Нийтлэл::latest()->paginate(10);
        return view('нийтлэлүүд.жагсаалт', compact('нийтлэлүүд'));
    }

    // GET /нийтлэлүүд/үүсгэх — маягт харуулах
    public function create()
    {
        return view('нийтлэлүүд.үүсгэх');
    }

    // POST /нийтлэлүүд — өгөгдөл хадгалах
    public function store(Request $хүсэлт)
    {
        $хүсэлт->validate([
            'гарчиг' => 'required|min:3|max:255',
            'агуулга' => 'required|min:10',
        ]);

        Нийтлэл::create([
            'гарчиг'  => $хүсэлт->гарчиг,
            'агуулга' => $хүсэлт->агуулга,
            'user_id' => auth()->id(),
        ]);

        return redirect('/нийтлэлүүд')
            ->with('амжилт', 'Нийтлэл амжилттай хадгалагдлаа!');
    }

    // DELETE /нийтлэлүүд/{id}
    public function destroy(Нийтлэл $нийтлэл)
    {
        $нийтлэл->delete();
        return redirect('/нийтлэлүүд')
            ->with('амжилт', 'Нийтлэл устгагдлаа.');
    }
}
?>

Eloquent ORM — өгөгдлийн санд хандах

bash
# Model ба migration хамт үүсгэх
php artisan make:model Нийтлэл -m
php
<?php
// app/Models/Нийтлэл.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Нийтлэл extends Model
{
    protected $table = 'нийтлэлүүд';

    // Массивоор оноохыг зөвшөөрөх талбарууд
    protected $fillable = ['гарчиг', 'агуулга', 'user_id'];

    // Харилцаа — нийтлэл нь нэг хэрэглэгчид харьяалагдана
    public function хэрэглэгч()
    {
        return $this->belongsTo(User::class, 'user_id');
    }
}
?>
php
<?php
// database/migrations/xxxx_create_нийтлэлүүд_table.php
public function up(): void
{
    Schema::create('нийтлэлүүд', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id')->constrained()->cascadeOnDelete();
        $table->string('гарчиг');
        $table->text('агуулга');
        $table->timestamps();
    });
}

// Migration ажиллуулах
// php artisan migrate
?>

Eloquent ORM-ийн үндсэн үйлдлүүд:

php
<?php
// Бүгдийг авах
$нийтлэлүүд = Нийтлэл::all();

// Шүүх ба эрэмбэлэх
$шинэ = Нийтлэл::where('user_id', 1)
                 ->orderBy('created_at', 'desc')
                 ->take(5)
                 ->get();

// ID-аар нэгийг авах
$нийтлэл = Нийтлэл::find(1);
$нийтлэл = Нийтлэл::findOrFail(1);   // Олдохгүй бол 404

// Үүсгэх
$шинэ = Нийтлэл::create(['гарчиг' => 'Тест', 'агуулга' => 'Агуулга...']);

// Шинэчлэх
$нийтлэл->update(['гарчиг' => 'Шинэ гарчиг']);

// Устгах
$нийтлэл->delete();
?>

Blade template — view бичих

blade
{{-- resources/views/нийтлэлүүд/жагсаалт.blade.php --}}
@extends('layouts.app')

@section('content')
    <h1>Нийтлэлүүд</h1>

    @if (session('амжилт'))
        <div class="alert">{{ session('амжилт') }}</div>
    @endif

    @forelse ($нийтлэлүүд as $нийтлэл)
        <article>
            <h2>{{ $нийтлэл->гарчиг }}</h2>
            <p>{{ Str::limit($нийтлэл->агуулга, 150) }}</p>
            <small>{{ $нийтлэл->created_at->diffForHumans() }}</small>
        </article>
    @empty
        <p>Одоогоор нийтлэл байхгүй байна.</p>
    @endforelse

    {{ $нийтлэлүүд->links() }}  {{-- Pagination --}}
@endsection

Дараагийн хичээлд:

Эцсийн төсөл! Энэ курсэд сурсан бүхнээ нэгтгэн жижиг блог апп бүтээнэ. Route, controller, model, Blade view, өгөгдлийн сан, хэлбэрийн баталгаажуулалт, session зэргийг хамтад нь ашиглах болно.