Category: technologies

Adding non-PHP libraries to a Laravel project using Composer

Article available in English

Adding a Javascript library to your project might require Javascript-related tools, like NodeJS, npm, Webpack… But if your project happens to be using Laravel as web development framework, you can simply use Composer and Laravel built-in functions to add your new Javascript libraries, or libraries of any languages, to your existing project! Let’s figure out how we can do that.

1. Add your library to your composer.json

First, check if your library is available on packagist.org. If it isn’t, we will make it available!
In this article, I will use this pure-JS library https://github.com/scratchy/jquery-jsonview as an example, and I’m going to add it to my existing project. Fortunately, this library is already available on packagist.org: https://packagist.org/packages/scratchy/jquery-jsonview . What we only have to do is using composer require scratchy/jquery-jsonview command or manually specifying it in our composer.json to prepare for composer update.

If your library is not available on packagist yet, create a composer.json file inside your library, and publish your library to packagist. Since publishing libraries to packagist won’t be covered in this article, please refer to https://packagist.org/ for procedures to upload a library.

2. Run composer update after specifying new libraries in your composer.json

Your newly added libraries will be available at vendor folder.

3. Create a ServiceProvider

The ServiceProvider class is responsible for copying the libraries to the location where your application can use it. If you are adding a CSS/JS library to your project, the destination is likely to be under public folder.

Let’s use artisan to create the responsible ServiceProvider. For this article’s example, it would be:

1
php artisan make:provider JsonViewServiceProvider

In the boot() method inside app/Provider/JsonViewServiceProvider.php, add the following code:

1
$this->publishes([__DIR__ . '/../../vendor/scratchy/jquery-jsonview' => public_path() . '/vendor/jquery-jsonview'], 'debug');

(That /../../ is needed because ServiceProvider class, which will copy folders when artisan vendor:publish command is executed, is lying under app/Provider/, so you have to point it to appropriate direction like you are navigating inside a terminal).
The code above will copy vendor/scratchy/jquery-jsonview folder (which was installed by composer update) to public/vendor/ folder when executing php artisan vendor:publish --tag=debug command. If you would like Laravel to copy the library to different location under public folder, simply change /vendor/jquery-jsonview to an according path.

4. Specify your created ServiceProvider in config/app.php

This is necessary for artisan to recognize your newly created ServiceProvider. Inside provider section of config/app.php, specify your ServiceProvider like this:

1
2
3
4
5
6
7
8
9
return [
// Other configs above
'providers' => [
// Other providers
'App\Providers\JsonViewServiceProvider',
// Other providers
],
// Other configs below
];

5. Run artisan vendor:publish command

At the root of your Laravel project, execute this command:

1
php artisan vendor:publish --tag=debug

The output should be like this:

1
2
Copied Directory [/vendor/scratchy/jquery-jsonview] To [/public/vendor/jquery-jsonview]
Publishing complete for tag [debug]!

6. Verify if your newly added libraries appear under your targeted location!

Congratulation, you have successfully added your non-PHP library to your Laravel project without dealing with npm nodejs gulp webpack stuff!