Autoload PSR-4 với Composer (ok)

https://viblo.asia/p/php-autoloading-psr4-and-composer-V3m5Wy0QZO7

C:\xampp\htdocs\php\composer.json

{
  "autoload":
  {
    "psr-4":
    {
      "Viblo\\": "src/"
    }
  }
}

C:\xampp\htdocs\php\src\Controllers\HomeController.php

<?php
namespace Viblo\Controllers;
use Viblo\Models\User;
class HomeController {
  public function actionIndex() {
    return (new User)->list();
  }
}

C:\xampp\htdocs\php\src\Models\User.php

<?php
namespace Viblo\Models;
class User {
  public function list() {
    // TODO: get actual data
    return [1, 2, 3];
  }
}

Để thực hiện autoloading với Composer bạn cần khai báo trong file composer.json. Composer hỗ trợ các kiểu autoload PSR-4, PSR-0, classmap và files, các bạn có thể tham khảo tài liệu gốc.

Ở đây, mình sẽ ví dụ autoload PSR-4 với Composer.

Ví dụ bạn có cấu trúc thư mục như sau:

.
├── composer.json
├── index.php
└── src
    ├── Controllers
    │   └── HomeController.php
    ├── Models
    │   └── User.php
    └── Views
        └── home.php

File src/Models/User.php:

<?php
namespace Viblo\Models;

class User
{
    public function list()
    {
        // TODO: get actual data
        return [1, 2, 3];
    }
}

Tương tự file src/Controllers/HomeController.php sẽ có namespace Viblo\Controllers.

<?php
namespace Viblo\Controllers;

use Viblo\Models\User;

class HomeController 
{
    public function actionIndex()
    {
        return (new User)->list();
    }
}

Thư mục Views gồm những file markup PHP, Html nên sẽ không thực hiện autoload.

Tiếp theo, chúng ta có file composer.json:

{
    "autoload": {
        "psr-4": {
            "Viblo\\": "src/"
        }
    }
}

Sau đó chạy lệnh:

composer dump-autoload

Câu lệnh này sẽ tạo ra file autoloader vendor/autoload.php, autoloader này sẽ load các rule được implement trong vendor/composer/autoload_*.php.

vendor/composer
├── autoload_classmap.php
├── autoload_files.php
├── autoload_namespaces.php
├── autoload_psr4.php
├── autoload_real.php
├── autoload_static.php
├── ca-bundle
├── ClassLoader.php
├── installed.json
├── installers
└── LICENSE

Sử dụng index.php:

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

use Viblo\Controllers\HomeController;

$homeCtrl = new HomeController;

print_r($homeCtrl->actionIndex());

// ...

Last updated