Home Explore Blog CI



nixpkgs

4th chunk of `doc/languages-frameworks/php.section.md`
df10835d7e6edf88c1372161317060b26634bb87969846ad0000000100000d9d
To use the helper effectively, add the `vendorHash` attribute, which
enables the wrapper to handle the heavy lifting.

Internally, the helper operates in three stages:

1. It constructs a `composerRepository` attribute derivation by creating a
   composer repository on the filesystem containing dependencies specified in
   `composer.json`. This process uses the function
   `php.mkComposerRepository` which in turn uses the
   `php.composerHooks.composerRepositoryHook` hook. Internally this function uses
   a custom
   [Composer plugin](https://github.com/nix-community/composer-local-repo-plugin) to
   generate the repository.
2. The resulting `composerRepository` derivation is then used by the
   `php.composerHooks.composerInstallHook` hook, which is responsible for
   creating the final `vendor` directory.
3. Any "binary" specified in the `composer.json` are linked and made accessible
   in the derivation.

As the autoloader optimization can be activated directly within the
`composer.json` file, we do not enable any autoloader optimization flags.

To customize the PHP version, you can specify the `php` attribute. Similarly, if
you wish to modify the Composer version, use the `composer` attribute. It is
important to note that both attributes should be of the `derivation` type.

Here's an example of working code example using `php.buildComposerProject2`:

```nix
{ php, fetchFromGitHub }:

php.buildComposerProject2 (finalAttrs: {
  pname = "php-app";
  version = "1.0.0";

  src = fetchFromGitHub {
    owner = "git-owner";
    repo = "git-repo";
    tag = finalAttrs.version;
    hash = "sha256-VcQRSss2dssfkJ+iUb5qT+FJ10GHiFDzySigcmuVI+8=";
  };

  # PHP version containing the `ast` extension enabled
  php = php.buildEnv {
    extensions = (
      { enabled, all }:
      enabled
      ++ (with all; [
        ast
      ])
    );
  };

  # The composer vendor hash
  vendorHash = "sha256-86s/F+/5cBAwBqZ2yaGRM5rTGLmou5//aLRK5SA0WiQ=";

  # If the composer.lock file is missing from the repository, add it:
  # composerLock = ./path/to/composer.lock;
})
```

In case the file `composer.lock` is missing from the repository, it is possible
to specify it using the `composerLock` attribute.

The other method is to use all these methods and hooks individually. This has
the advantage of building a PHP library within another derivation very easily
when necessary.

Here's a working code example to build a PHP library using `mkDerivation` and
separate functions and hooks:

```nix
{
  stdenvNoCC,
  fetchFromGitHub,
  php,
}:

stdenvNoCC.mkDerivation (
  finalAttrs:
  let
    src = fetchFromGitHub {
      owner = "git-owner";
      repo = "git-repo";
      rev = finalAttrs.version;
      hash = "sha256-VcQRSss2dssfkJ+iUb5qT+FJ10GHiFDzySigcmuVI+8=";
    };
  in
  {
    inherit src;
    pname = "php-app";
    version = "1.0.0";

    buildInputs = [ php ];

    nativeBuildInputs = [
      php.packages.composer
      # This hook will use the attribute `composerRepository`
      php.composerHooks.composerInstallHook
    ];

    composerRepository = php.mkComposerRepository {
      inherit (finalAttrs) pname version src;
      composerNoDev = true;
      composerNoPlugins = true;
      composerNoScripts = true;
      # Specifying a custom composer.lock since it is not present in the sources.
      composerLock = ./composer.lock;
      # The composer vendor hash
      vendorHash = "sha256-86s/F+/5cBAwBqZ2yaGRM5rTGLmou5//aLRK5SA0WiQ=";
    };
  }
)
```

Title: Customizing and Using `php.buildComposerProject2` and Building PHP Libraries with `mkDerivation`
Summary
This section provides guidance on customizing the PHP and Composer versions used by `php.buildComposerProject2` using the `php` and `composer` attributes, respectively. It includes a detailed code example demonstrating the use of `php.buildComposerProject2`, along with instructions on how to specify a `composer.lock` file if it's missing from the repository. Additionally, it explains an alternative method of building PHP libraries using `mkDerivation` and separate functions and hooks, showcasing a code example that incorporates `mkDerivation`, `php.mkComposerRepository`, and `php.composerHooks.composerInstallHook`.