Một ví dụ sử dụng composer (ok)

Bước 1: Tạo file composer.json

 composer init
 Sau đó điền thông tin ví dụ: 
 Package name (<vendor>/<name>) [administrator/windows]: test/one

Bước 2: Bổ sung thông tin psr-4 cho composer.json

{
    "name": "test/one",
    "description": "Test One",
    "authors": [
        {
            "name": "ky anh",
            "email": "phamkyanh8668@gmail.com"
        }
    ],
    "autoload": {
        "psr-4": {
            "Viblo\\": "src/"
        }
    },
    "require": {}
}

\index.php

<?php
require __DIR__ . '/vendor/autoload.php';
use Viblo\Controllers\HomeController;
$homeCtrl = new HomeController;
print_r($homeCtrl->actionIndex());

src/Controllers/HomeController.php

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

src/Models/User.php

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

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

Autoloading với Composer

Để 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