Install local packages on your laravel project
Lately, I started to create some packages for Laravel and PHP. And of course as always, when developing, you should be able to create and test your packages locally.
Also when you want to make a DRY approach to some of your code and prevent yourself from repeating the same code in multiple projects, you can extract it into a package and load it locally.
They are also a great way to make your code sharable and reusable.
Composer offers a useful way to install and load local packages.
First, create a directory on your root project folder. I prefer packages/vendor-name/package-name
.
For the laravel packages by convention is better to use laravel
prefix.
For example:
Let’s create the first package
Create a folder called laravel-hello
inside packages/vendor-name/laravel-hello
on the root folder of a laravel project.
The folder structure will look something like this:
The vendor-name
usually, should correspond with your GitHub username.
The src
folder is where all the magic is.
Now we go inside the laravel-hello
package by running the following:
cd ./packages/erlandmuchasaj/laravel-hello
Then we initialize the composer by running the following command:
composer init
This command will prompt you with some questions regarding the package being created but for now, you can accept the default one. You can always edit them later on composer.json
.
Here is an example of how the composer.json file would look like.
After the initialization we can go to packages/erlandmuchasaj/laravel-hello/composer.json
and edit it as follows:
{
"name": "erlandmuchasaj/laravel-hello",
"description": "A simple Laravel package showing rock paper scissors lizard spock rules..",
"type": "project",
"license": "MIT",
"authors": [
{
"name": "Erland Muchasaj",
"email": "erland.muchaasaj@gmail.com"
}
],
"autoload": {
"psr-4": {
"ErlandMuchasaj\\LaravelHello\\": "src/"
}
},
"require": {
"php": "^8.1"
},
"minimum-stability": "dev",
"prefer-stable": false
}
The last two attributes are not required, but they could help us if we run into any errors getting our local package to load in composer.
Pay close attention to autoload
object.
This composer.json
file specifies that the package has a namespace ErlandMuchasaj\LaravelHello
and that any classes in that namespace should be loaded from the src/
directory. It also specifies that the package requires PHP version 8.1 or higher.
Inside the /src folder we create a PHP class called RockPaperScissorsLizardSpock.php
.
<?php
namespace ErlandMuchasaj\LaravelHello;
class RockPaperScissorsLizardSpock
{
public function rules(): string
{
return 'Scissors cuts paper,
Paper covers rock,
Rock crushes lizard,
Lizard poisons Spock,
Spock smashes scissors,
Scissors decapitates lizard,
Lizard eats paper,
Paper disproves Spock,
Spock vaporizes rock,
and as it always has, rock crushes scissors.';
}
}
Keep in mind that the package
composer.json
is different from projectcomposer.json
.
Now open the root directory composer.json file and add repositories
section. This section should include a reference to your local package directory.
{
...
"repositories": [
{
"type": "path",
"url": "./packages/erlandmuchasaj/laravel-hello",
"options": {
"symlink": true
}
}
]
}
Passing in the "symlink": true
option means that our package's source folder will be symlinked into the vendor
directory of our PHP project and we don't need to make composer update
each time we make an update to the package.
After that, we just need t update our require
list with our newly created package.
"require": {
"php": "^8.1",
"erlandmuchasaj/laravel-hello": "@dev", // <== load package
"guzzlehttp/guzzle": "^7.2",
"laravel/framework": "^10.0",
"laravel/sanctum": "^3.2",
"laravel/tinker": "^2.8",
},
Notice as the package name that we used in the require list corresponds with the name of the package in the composer.json above.
Now all you need to do is run composer update
and voilà.
Testing if it works
You can now use your local package in your project just like any other package like this:
<?php
use ErlandMuchasaj\LaravelHello\RockPaperScissorsLizardSpock;
$game= new RockPaperScissorsLizardSpock();
echo $game->rules();
Scissors cuts paper,
paper covers rock,
rock crushes lizard,
lizard poisons Spock,
Spock smashes scissors,
scissors decapitates lizard,
lizard eats paper,
paper disproves Spock,
Spock vaporizes rock,
and as it always has, rock crushes scissors.
After you have finished developing your package locally, you can remove it from repositories
section of your project composer.json
file and publish it to a package repository like Packagist so others can also use it.
Publishing the package in Packagist is not in the scope of this article but you can read more about it here.
Feel free to Subscribe for more content like this 🔔, clap 👏🏻 , comment 💬 and share the article with anyone you’d like
And as it always has been, I appreciate your support, and thanks for reading.