Hujjatlar ro'yxati

Qadamchi — tushunchalar bo'yicha qo'llanma

Har bir bo'lim: Qadamchi'da qanday + Laravel'da bu ... eslatmasi. Batafsil o'tish xaritasi uchun laravel-otish.md.


Sozlash va ishga tushirish

php install.php            # bitta fayldan to'liq loyiha
php qadamchi key:generate  # APP_KEY
php qadamchi migrate       # jadvallar
php qadamchi db:seed        # namuna ma'lumot
php qadamchi serve         # http://localhost:8080
Laravel'da bu: php artisan key:generate, php artisan migrate --seed, php artisan serve. Buyruq nomlari deyarli bir xil.

Route

routes/web.php:

Route::get('/', [WelcomeController::class, 'index'])->name('home');
Route::get('/about/{slug}', [WelcomeController::class, 'about'])->name('about');
Route::post('/posts', [PostController::class, 'store'])->middleware('auth');
  • Parametrli route: /about/{slug}$request->routeParam('slug').
  • Named route: route('posts.show', ['id' => 1]) → URL.
  • Middleware alias: 'auth', 'guest', 'csrf'.
Laravel'da bu: bir xil Route::get/post/..., named routes, route() helper. Qo'shimcha: route model binding, resource controllers.

Controller + DI

class PostController extends \Qadamchi\Http\Controller {
    public function __construct() { $this->middleware('auth', ['only' => ['create','store']]); }
    public function show(Request $request) {
        return view('posts.show', ['post' => Post::find($request->routeParam('id'))]);
    }
}

Controller metodlariga Request (va boshqa sinflar) Container orqali avtomatik inject qilinadi (reflection autowire).

Laravel'da bu: bir xil method injection. Qo'shimcha: route model binding (show(Post $post)).

Blade view

app/Views/*.blade.php. Sintaksis Laravel Blade bilan bir xil:

  • {{ $x }} — escape; {!! $x !!} — xom.
  • @if/@elseif/@else/@endif, @foreach/@endforeach, @forelse/@empty/@endforelse, @isset/@endisset.
  • @extends('layouts.app'), @section('content')...@endsection, @yield('content') — layout inheritance.
  • @include('partials.nav'), @csrf, @method('PUT'), @auth/@guest, @php/@endphp, {{-- comment --}}.
  • Compile + cache: storage/framework/views/.
Laravel'da bu: Blade — deyarli 100% bir xil sintaksis. Qo'shimcha: class-based components, @props, @stack/@push.

Model / QueryBuilder (Eloquent'ga o'xshash)

class User extends \Qadamchi\Database\Model {
    protected $fillable = ['name','email','password'];
    protected $hidden = ['password'];
    public function posts() { return $this->hasMany(Post::class); }
}

User::all();
User::where('active', 1)->orderBy('id','DESC')->paginate(15);
User::find(1)->posts;                    // lazy relation
User::create(['name'=>'Ali','email'=>'a@b.c','password'=>bcrypt('123')]);
$user->save();  $user->delete();
$user->toArray();                        // hidden (password) yo'q

Relations: hasOne, hasMany, belongsTo, belongsToMany. Accessors: getNameAttribute.

Laravel'da bu: Eloquent — API deyarli bir xil. Qo'shimcha: scopes, factories, with() eager loading, soft deletes.

Request / Validation

$request->input('name');   $request->all();   $request->only(['name','email']);
$request->method();        $request->isAjax(); $request->file('avatar');
$request->validate(['email' => 'required|email']);   // ValidationException → redirect back

FormRequest:

class CreateUserRequest extends \Qadamchi\Validation\FormRequest {
    public function rules(): array { return ['email'=>'required|email|unique:users,email','password'=>'required|min:8|confirmed']; }
    public function messages(): array { return ['email.unique'=>'Bu email band']; }
}
// controller: $data = (new CreateUserRequest)->validate();

Xato bo'lsa: _errors + _old_input flash, ValidationException, redirect back. Blade'da old('email') va $errors.

Laravel'da bu: FormRequest — bir xil rules()/messages()/authorize(). Laravel controller'ga avtomatik inject qiladi va middleware kabi to'xtatadi.

Middleware / CSRF

class AuthMiddleware extends \Qadamchi\Http\Middleware {
    public function handle($request, \Closure $next) {
        if (!Auth::check()) return redirect('/login');
        return $next($request);
    }
}

Onion pipeline: $next($request) chaqirig'i orqali "oldin/so'ng" qatlamlari. Global VerifyCSRF POST/PUT/PATCH/DELETE'ni token bo'yicha tekshiradi (hash_equals timing-safe). Formda @csrf.

Laravel'da bu: bir xil handle($request, Closure $next). Laravel PSR-15 emas, o'z interface. Global VerifyCsrfToken — bir xil g'oya.

Auth / Session

Auth::attempt(['email'=>$e,'password'=>$p]);   // qidir + parol + login + session regenerate
Auth::user();  Auth::id();  Auth::check();  Auth::guest();
Auth::logout();

Session: session()->put('key',$v), session()->get('key'), session()->flash('success','...'). Flash keyingi so'rovda yashaydi.

Laravel'da bu: Auth::attempt/user/logout — bir xil. Guard'lar (web/api), multiple providers.

Migration / Schema

class CreateUsersTable extends Migration {
    public function up(): void {
        Schema::create('users', function (Blueprint $t) {
            $t->id();
            $t->string('name');
            $t->string('email')->unique();
            $t->string('password');
            $t->timestamps();
        });
    }
    public function down(): void { Schema::drop('users'); }
}

Blueprint: id, string, text/longText, integer/bigInt, float/decimal, boolean, datetime/date/timestamp, enum, json, foreignId, nullable, default, unique, index. Buyruqlar: migrate, migrate:rollback, migrate:reset, migrate:fresh.

Laravel'da bu: Blueprint — bir xil API. Qo'shimcha: foreignId()->constrained(), polymorphic.

CLI (qadamchi)

php qadamchi <buyruq>:

  • migrate, migrate:fresh, migrate:rollback, migrate:reset
  • db:seed [--class=]
  • make:controller/model/migration/seeder/middleware/request/view/command
  • key:generate, route:list, cache:clear, session:clear, log:clear
  • serve, test, build:installer, list
Laravel'da bu: php artisan ... — buyruq nomlari deyarli bir xil. Qadamchi har bir buyruq alohida app/Cli/*.php fayl (o'rganish uchun ochiq).

Service Container / DI

$container = app();
$container->singleton(Logger::class, fn() => new Logger(...));
$repo = $container->make(UserRepository::class);   // reflection autowire
$container->call([$controller, 'method'], $params);

PSR-11 mos imzo (get, has). B versiyasida league/container ga almashtirish mumkin.

Laravel'da bu: app(), app()->bind/singleton/make — bir xil. Qo'shimcha: service providers, contextual binding.

Config / Env

config/app.php, config/db.php, ... + .env:

config('app.name');          // dot notation
config('db.host');
env('APP_DEBUG', false);
Laravel'da bu: bir xil config() va env().

Lang (tarjima)

app/Lang/uz/messages.php:

return ['welcome' => 'Xush kelibsiz, :name'];
trans('messages.welcome', ['name' => 'Ali']);   // "Xush kelibsiz, Ali"
Laravel'da bu: lang/uz/messages.php + __('messages.welcome', ['name'=>'Ali']). Bir xil interpolation.

Misol blog ilovasi

Repo'ning o'zi to'liq misol: routes/web.php + app/Controllers/{Welcome,Auth,Post}Controller + app/Models/{User,Post} (hasMany/belongsTo relation) + app/Views/* Blade + app/Migrations/* + app/Seeders/* + Auth (register/login/logout) + CSRF + validation. Shu oqimni o'qib chiqish = butun fremvorkni tushunish.


Bitta-fayl o'rnatish

php qadamchi build:installer   # repo -> install.php (gzdeflate+base64)
# install.php ni serverga tashlang:
php install.php                 # 155 fayl unpack + .env + APP_KEY
Laravel'da bu ekvivalenti yo'q (Composer orqali). Bu Qadamchi'ning ta'lim/oddiy-deploy konsepsiyasi.
Qadamchi