A package to handle the SEO in any Laravel application, big or small.

Related tags

Laravel laravel-seo
Overview

laravel-seo

Never worry about SEO in Laravel again!

Currently there aren't that many SEO-packages for Laravel and the available ones are quite complex to set up and very decoupled from the database. They only provided you with helpers to generate the tags, but you still had to use those helpers: nothing was generated automatically and they almost do not work out of the box.

This package generates valid and useful meta tags straight out-of-the-box, with limited initial configuration, whilst still providing a simple, but powerful API to work with. It can generate:

  1. Robots tag
  2. Title tag (with sitewide suffix)
  3. Meta tags (author, description, image, etc.)
  4. OpenGraph Tags (Facebook, LinkedIn, etc.)
  5. Twitter Tags
  6. Structured data (Article and Breadcrumbs)
  7. Favicon

If you're familiar with Spatie's media-library package, this package works in almost the same way, only then for SEO. I'm sure it will be very helpful for you, as it's usually best to SEO attention right from the beginning.

Here are a few examples of what you can do:

$post = Post::find(1);

$post->addSEO();

$post->seo->update([
   'title' => 'My great post',
   'description' => 'This great post will enhance your live.',
]);

It will render the SEO tags directly on your page:

<!DOCTYPE html>
<html>
<head>
    {!! seo()->for($page) !!}
    
    {{-- No need to separately render a <title> tag or any other meta tags! --}}
</head>

It even allows you to dynamically retrieve SEO data from your model, without having to save it manually to the SEO model. The below code will require zero additional work from you or from your users:

class Post extends Model
{
    use HasSEO;
    
    public function getDynamicSEOData(): SEOData
    {
        // Override only the properties you want:
        return new SEOData(
            title: $this->title,
            description: $this->excerpt,
            image: $this->getMedia('featured_image')->first()->getPath(),
        );
    }
}

Installation

Run the following command to install the package:

composer require ralphjsmit/laravel-seo

Publish the migration and configuration file:

php artisan vendor:publish --tag="seo-migrations"
php artisan vendor:publish --tag="seo-config"

Next, go to the newly published config file in config/seo.php and make sure that all the settings are correct. Those settings are all sort of default values:

<?php

return [
    /**
     * Use this setting to specify the site name that will be used in OpenGraph tags.
     */
    'site_name' => null,

    /**
     * Use this setting to specify the path to the favicon for your website. The url to it will be generated using the `secure_url()` function,
     * so make sure to make the favicon accessibly from the `public` folder.
     *
     * You can use the following file-types: ico, png, gif, jpeg, svg.
     */
    'favicon' => null,

    'title' => [
        /**
         * Use this setting to let the package automatically infer a title from the url, if no other title
         * was given. This will be very useful on pages where you don't have an Eloquent model for, or where you
         * don't want to hardcode the title.
         *
         * For example, if you have a with the url '/foo/about-me', we'll automatically set the title to 'About me' and append the site suffix.
         */
        'infer_title_from_url' => true,

        /**
         * Use this setting to provide a suffix that will be added after the title on each page.
         * If you don't want a suffix, you should specify an empty string.
         */
        'suffix' => '',
    ],

    'description' => [
        /**
         * Use this setting to specify a fallback description, which will be used on places
         * where we don't have a description set via an associated ->seo model or via
         * the ->getDynamicSEOData() method.
         */
        'fallback' => null,
    ],

    'image' => [
        /**
         * Use this setting to specify a fallback image, which will be used on places where you
         * don't have an image set via an associated ->seo model or via the ->getDynamicSEOData() method.
         * This should be a path to an image. The url to the path is generated using the `secure_url()` function (`secure_url($yourProvidedPath)`).
         */
        'fallback' => null,
    ],

    'author' => [
        /**
         * Use this setting to specify a fallback author, which will be used on places where you
         * don't have an author set via an associated ->seo model or via the ->getDynamicSEOData() method.
         */
        'fallback' => null,
    ],

    'twitter' => [
        /**
         * Use this setting to enter your username and include that with the Twitter Card tags.
         * Enter the username like 'yourUserName', so without the '@'.
         */
        '@username' => null,
    ],
];

Now, add the following Blade-code on every page where you want the SEO-tags to appear:

{!! seo() !!}

This will render a lot of sensible tags by default, already greatly improving your SEO. It will also render things like the <title> tag, so you don't have to render that manually.

To really profit from this package, you can associate an Eloquent model with a SEO-model. This will allow you to dynamically fetch SEO data from your model and this package will generate as much tags as possible for you, based on that data.

To associate an Eloquent model with a SEO-model, add the HasSEO trait to your model:

use RalphJSmit\Laravel\SEO\Support\HasSEO;

class Post extends Model
{
    use HasSEO;
    
    // ...

This will automatically create and associate a SEO-model for you when a Post is created. You can also manually create a SEO-model for a Post, use the ->addSEO() method for that ($post->addSEO()).

You'll be able to retrieve the SEO-model via the Eloquent seo relationship:

$post = Post::find(1);

$seo = $post->seo;

On the SEO model, you may update the following properties:

  1. title: this will be used for the <title> tag and all the related tags (OpenGraph, Twitter, etc.)
  2. description: this will be used for the <meta> description tag and all the related tags (OpenGraph, Twitter, etc.)
  3. author: this should be the name of the author and it will be used for the <meta> author tag and all the related tags (OpenGraph, Twitter, etc.)
  4. image: this should be the path to the image you want to use for the <meta> image tag and all the related tags (OpenGraph, Twitter, etc.). The url to the image is generated via the secure_url() function, so be sure to check that the image is publicly available and that you provide the right path.
$post = Post::find(1);

$post->seo->update([
   'title' => 'My title for the SEO tag',
   'image' => 'images/posts/1.jpg', // Will point to `/public/images/posts/1.jpg
]);

However, it can be a bit cumbersome to manually update the SEO-model every time you make a change. That's why I provided the getDynamicSEOData() method, which you can use to dynamically fetch the correct data from your own model and pass it to the SEO model:

public function getDynamicSEOData(): SEOData
{
    return new SEOData(
        title: $this->title,
        description: $this->excerpt,
        author: $this->author->fullName,
    );
}

You are allowed to only override the properties you want and omit the other properties (or pass null to them). You can use the following properties:

  1. title
  2. description
  3. author (should be the author's name)
  4. image (should be the image path)
  5. url (by default it will be url()->current())
  6. enableTitleSuffix (should be true or false, this allows you to set a suffix in the config/seo.php file, which will be appended to every title)
  7. site_name
  8. published_time (should be a Carbon instance with the published time. By default this will be the created_at property of your model)
  9. modified_time (should be a Carbon instance with the published time. By default this will be the updated_at property of your model)
  10. section (should be the name of the section of your content. It is used for OpenGraph article tags and it could be something like the category of the post)
  11. tags (should be an array with tags. It is used for the OpenGraph article tags)
  12. 'schema' (this should be a SchemaCollection instance, where you can configure the JSON-LD structured data schema tags)

Finally, you should update your Blade file, so that it can receive your model when generating the tags:

{!! seo()->for($page) !!}
{{-- Or pass it directly to the `seo()` method: --}}
{!! seo($page ?? null) !!}

The following order is used when generating the tags (higher overwrites the lower):

  1. Any overwrites from the SEOManager::SEODataTransformer($closure) (see below)
  2. Data from the getDynamicSEOData() method
  3. Data from the associated SEO model ($post->seo)
  4. Default data from the config/seo.php file

Generating JSON-LD structured data

This package can also generate structured data for you (also called schema markup). At the moment we support the following types:

  1. Article
  2. BreadcrumbList

However, you can easily send me a (draft) PR with your requested types and I'll (most probably) add them to the package.

Article schema markup

To enable structured data, you need to use the schema property of the SEOData class. To generate Article schema markup, use the ->addArticle() method:

use RalphJSmit\Laravel\SEO\SchemaCollection;

public function getDynamicSEOData(): SEOData
{
    return new SEOData(
        // ...
        schema: SchemaCollection::initialize()->addArticle(),
    );
}

You can pass a closure the the ->addArticle() method to customize the individual schema markup. This closure will receive an instance of ArticleSchema as its argument. You can an additional author by using the ->addAuthor() method:

SchemaCollection::initialize()->addArticle(
    fn (ArticleSchema $article): ArticleSchema => $article->addAuthor('Second author')
);

You can completely customize the schema markup by using the ->markup() method on the ArticleSchema instance:

use Illuminate\Support\Collection;

SchemaCollection::initialize()->addArticle(function(ArticleSchema $article): ArticleSchema {
    return $article->markup(function(Collection $markup): Collection {
        return $markup->put('alternativeHeadline', $this->tagline);
    });
});

At this point, I'm just unable to fluently support every possible version of the structured, so this is the perfect way to add an additional property to the output!

BreadcrumbList schema markup

You can also add BreadcrumbList schema markup by using the ->addBreadcrumbs() function on the SchemaCollection:

SchemaCollection::initialize()->addBreadcrumbs(
    function(BreadcrumbListSchema $breadcrumbs): BreadcrumbListSchema {
        return $breadcrumbs->prependBreadcrumbs([
            'Homepage' => 'https://example.com',
            'Category' => 'https://example.com/test',
        ])->appendBreadcrumbs([
            'Subarticle' => 'https://example.com/test/article/2',
        ])->markup(function(Collection $markup): Collection {
            // ...
        });
    }
);

This code will generate BreadcrumbList JSON-LD structured data with the following four pages:

  1. Homepage
  2. Category
  3. [Current page]
  4. Subarticle

Advanced usage

Sometimes you may have advanced needs, that require you to apply your own logic to the SEOData class, just before it is used to generate the tags.

To accomplish this, you can use the SEODataTransformer() function on the SEOManager facade to register one or multiple closures that will be able to modify the SEOData instance at the last moment:

// In the `boot()` method of a service provider somewhere
use RalphJSmit\Laravel\SEO\Facades\SEOManager;

SEOManager::SEODataTransformer(function (SEOData $SEOData): void {
    // This will change the title on *EVERY* page. Do any logic you want here, e.g. based on the current request.
    $SEOData->title = 'Transformed Title';
});

Modifying tags before they are rendered

You can also register closures that can modify the final collection of generated tags, right before they are rendered. This is useful if you want to add custom tags to the output, or if you want to modify the output of the tags.

SEOManager::tagTransformer(function (TagCollection $tags): TagCollection {
    $tags = $tags->reject(fn(Tag $tag) => $tag instanceof OpenGraphTag);
    
    $tags->push(new MetaTag(name: 'custom-tag', content: 'My custom content'));
    // Will render: <meta name="custom-tag" content="My custom content">
    
    return $tags;
});

Roadmap

I hope this package will be usefull to you! If you have any ideas or suggestions on how to make it more useful, please let me know ([email protected]) or via the issues.

PRs are welcome, so feel free to fork and submit a pull request. I'll be happy to review your changes, think along and add them to the package.

General

🐞 If you spot a bug, please submit a detailed issue and I'll try to fix it as soon as possible.

🔐 If you discover a vulnerability, please review our security policy.

🙌 If you want to contribute, please submit a pull request. All PRs will be fully credited. If you're unsure whether I'd accept your idea, feel free to contact me!

🙋‍♂️ Ralph J. Smit

Comments
  • move prepareForUsage to manager.

    move prepareForUsage to manager.

    move prepareForUsage to manager. so it can detect the model getDynamicSEOData when there is no seo object.

    use case, i have models (ex: Posts) has no SEO related to it

    i add HasSEO trait and adds the method getDynamicSEOData

    expected: it can dynamically get the seo data

    but the results was: No SEO model? okay, not seo at all

    opened by Saifallak 16
  • utf 8 for the Arabic language not work good in seo()

    utf 8 for the Arabic language not work good in seo()

    this code using seo helper and simple $model->seo->title

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <!-- SEO -->
        {!! seo() !!}
        <!-- End SEO -->
    
    
        <!-- simple title -->
        <title>{{$tool->seo->title}}</title>
        <!-- end title -->
    

    this result

    ksnip
    opened by fh32000 9
  • Costume Tags

    Costume Tags

    Hello @ralphjsmit. Thanks for you package How can I add costume meta-tags like og:url , og:type etc storing this data on database. like Costume Proprieties of laravel-Media-library.

    opened by inkomomutane 5
  • robots -  Allow to set values like

    robots - Allow to set values like "noindex" (in RobotsTags)

    I try to set <meta name="robots" content="noindex"> for a Terms & Condition page, but this is not possible.

    This is how I think it should work...

    $SEOData = new SEOData(
        title: 'Terms & Services',
        description: 'These are our T&C.',
        robots => 'noindex',
    );
    

    At the moment, the method RobotsTags::initialize() just pushes the string 'max-snippet:-1,max-image-preview:large,max-video-preview:-1' every time.

    opened by camya 4
  • How to fill seo information on pages without model

    How to fill seo information on pages without model

    Greetings! Thank you for your job, i have one question:

    For example i have Contact page with PagesController@contact method associated with it (it's just returns a view), how can i set own title, description etc. in contact controller method, without model?

    opened by Blinks44 4
  • How to use absolute path to images in seo?

    How to use absolute path to images in seo?

    Hello, we are using Vapor to host our application, and it does not use the relative path to the public folder instead, it uses an absolute path which we can get using asset() helper inside the application.

    How can I use the absolute path for the images of the products.?

    opened by rushi7997 3
  • Open Graph Tags not rendered correctly

    Open Graph Tags not rendered correctly

    It seems the default Open Graph tags aren't rendered as should be.

    Currently it renders the tag <meta name="og:title" content="Title">, but it should be <meta name="title" property="og:title" content="Title">

    So in the OpenGrapTag class, it should not adjust the value of the name, but add property with the value og:[name value].

    Title in this case is just an example. It has to be adjusted for all Open Graph tags.

    opened by tomsonnemans 3
  • "Article Schema Validation": Error for field "dateUpdated" - Should be "dateModified" instead.

    I added an "Article Schema" to my SEOData object.

    Problem: The $article->dateModified property is rendered as invalid schema field dateUpdated in src/Schema/ArticleSchema.php. The field in the schema should be named dateModified too.

    This creates an invalid schema. https://validator.schema.org/ (Article Schema specification: https://schema.org/Article)

    Error message of the Schema Validator: "dateUpdated" - The property dateUpdated is not recognized by the schema (e.g. schema.org) for an object of type Article.

    1. Set the SEOData object with "dateModified"...

    $seoData = new SEOData(
        title: $post->title,
        ...
        schema: SchemaCollection::initialize()->addArticle(
            function (ArticleSchema $article) use ($post) {
                $article->datePublished = $post->published_at;
                $article->dateModified = $post->updated_at;
                $article->addAuthor('Team');
                return $article;
            }
        ),
    );
    

    2. Output is created with wrong "dateUpdated" key.

    See src/Schema/ArticleSchema.php: Line 88 should be updated to 'dateModified' => $this->dateModified->toIso8601String()

    public function generateInner(): string
    {
        return collect([
            '@context' => 'https://schema.org',
            '@type' => $this->type,
            'mainEntityOfPage' => [
                '@type' => 'WebPage',
                '@id' => $this->url,
            ],
            'datePublished' => $this->datePublished->toIso8601String(),
            'dateUpdated' => $this->dateModified->toIso8601String(),
            'headline' => $this->headline,
        ])
            ->when($this->authors, fn (Collection $collection): Collection => $collection->put('author', $this->authors))
            ->when($this->description, fn (Collection $collection): Collection => $collection->put('description', $this->description))
            ->when($this->image, fn (Collection $collection): Collection => $collection->put('image', $this->image))
            ->when($this->articleBody, fn (Collection $collection): Collection => $collection->put('articleBody', $this->articleBody))
            ->pipeThrough($this->markupTransformers)
            ->toJson();
    }
    
    opened by camya 2
  • Robots Tag feature (+ pest tests + documentation)

    Robots Tag feature (+ pest tests + documentation)

    This PR adds the customisable robots meta tag feature to Laravel SEO.

    Config

    This feature adds two new robots related configuration entries. (See updated documentation)

    seo.robots.default: 'max-snippet:-1,max-image-preview:large,max-video-preview:-1'
    seo.robots.force_default: false
    

    Usage model

    $page->seo->update([
        'robots' => '',
    ]);
    
    • The robots string is stored in the database field robots. If field is null, it defaults to seo.robots.default
    • If seo.robots.force_default is true, the value stored in the database is ignored and seo.robots.default is used instead.

    Usage SEOData

    $SEOData = new \RalphJSmit\Laravel\SEO\Support\SEOData(
        title: 'Homepage',
        robots: 'noindex, nofollow'
    );
    

    Notes:

    • In order to make it better testable, I moved RobotsTag, SitemapTag, and CanonicalTag in separate files.
    • The render() methods now does not remove the tailing new lines. This makes it so much easier to debug the output in the rendered HTML site.
    opened by camya 2
  • laravel-seo for static pages (without model)

    laravel-seo for static pages (without model)

    Often I create static pages without any model attached. (See example controller below)

    Feature request: It would be great, if I just can fill the plain SEOData() object and pass this object to the layout template.

    class Homepage extends Controller
    {
        public function index()
        {
            return view('project.frontend.page.homepage.index', [
                'seoData' => new SEOData(
                    title: 'Awesome News - My Project',
                    description: 'Lorem Ipsum',
                ),
            ]);
        }
    }
    

    The $seoData set in the controller is than passed to the layout file and outputted with seo($seoData).

    {!! seo($seoData) !!}
    
    opened by camya 2
  • Bump dependabot/fetch-metadata from 1.3.4 to 1.3.5

    Bump dependabot/fetch-metadata from 1.3.4 to 1.3.5

    Bumps dependabot/fetch-metadata from 1.3.4 to 1.3.5.

    Release notes

    Sourced from dependabot/fetch-metadata's releases.

    v1.3.5

    What's Changed

    New Contributors

    Full Changelog: https://github.com/dependabot/fetch-metadata/compare/v1...v1.3.5

    Commits
    • 5ef0018 Merge pull request #282 from dependabot/v1.3.5-release-notes
    • a9380d2 v1.3.5
    • 404ba25 Merge pull request #280 from dependabot/drop-readme-from-bump-script
    • f40d4c7 Don't bump pin versions in README.md
    • 7db64c3 Merge pull request #252 from dependabot/document-release-steps
    • daa85e7 Add mention of npm run build if dev deps need updating.
    • b768c40 Document steps for cutting a new release
    • 9833f74 Merge pull request #273 from dependabot/dependabot/npm_and_yarn/yargs-and-typ...
    • 32b7ed3 Bump yargs and @​types/yargs
    • 7942397 Merge pull request #271 from dependabot/dependabot/npm_and_yarn/actions/githu...
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    opened by dependabot[bot] 1
  • Huge delay with imageMeta when running tests

    Huge delay with imageMeta when running tests

    Hey 👋

    I use spatie/laravel-medialibrary for managing files including images. And I noticed when I'm running tests there is a huge stall (around 5-6seconds) on the imageMeta creation. I pass the getFirstMediaUrl to the SEOData and it works fine in browser since it returns a full url to the image (like: http://www....)

    view()->share('SEOData', new SEOData(
         image: $category->getFirstMediaUrl(Disk::CategoryPictures),
    ));
    

    But during tests since the storage is faked, the getFirstMediaUrl returns a local path like /storage/1/.... and this seem to confuse this package's imageMeta() inside SEOData class and the test would get delayed for many seconds until it finally passes.

    I wonder if this is something that can be fixed or taken into account for such scenario ? Or is there a different approach I should take for passing the image path. I'm asking this since spatie/laravel-medialibrary is a popular package and people probably might end up with same pitfall.

    Thanks in advance and thank you for your great package 😊🙌

    opened by HassanZahirnia 3
Releases(1.2.2)
Owner
Ralph J. Smit
Laravel Developer. Writer.
Ralph J. Smit
Laravel Seo package for Content writer/admin/web master who do not know programming but want to edit/update SEO tags from dashboard

Laravel Seo Tools Laravel is becoming more and more popular and lots of web application are developing. In most of the web application there need some

Tuhin Bepari 130 Dec 23, 2022
SEO Helper is a package that provides tools and helpers for SEO (Search Engine Optimization).

SEO Helper By ARCANEDEV© SEO Helper is a package that provides tools and helpers for SEO (Search Engine Optimization). Feel free to check out the rele

ARCANEDEV 301 Nov 25, 2022
A Laravel 8 Project Implement with GraphQL With Sanctum APIs Authentications Which utilized in Any Frontend or Any Mobile Application Programs.

A Laravel 8 Project Implement with GraphQL With Sanctum APIs Authentications Which utilized in Any Frontend or Any Mobile Application Programs.

Vikas Ukani 3 Jan 6, 2022
Seo Manager Package for Laravel ( with Localization )

Seo Manager Package for Laravel ( with Localization ) lionix/seo-manager package will provide you an interface from where you can manage all your page

Lionix 205 Dec 23, 2022
A convenient helper for using the laravel-seo package with Filament Admin and Forms

Combine the power of Laravel SEO and Filament PHP. This package is a convenient helper for using the laravel-seo package with Filament Admin and Forms

Ralph J. Smit 39 Dec 21, 2022
Laravel package for manage your URL redirects in database or other sources to get better SEO results

Laravel 8 and 9 package to manage URL redirections inside your Laravel application using different data sources. It allows a better SEO support for your Laravel site.

Siro Díaz Palazón 51 Sep 21, 2022
A laravel package to handle sanitize process of model data to create/update model records.

Laravel Model UUID A simple package to sanitize model data to create/update table records. Installation Require the package using composer: composer r

null 66 Sep 19, 2022
A simple laravel package to handle multiple key based model route binding

Laravel Model UUID A simple package to handle the multiple key/column based route model binding for laravel package Installation Require the package u

null 13 Mar 2, 2022
A laravel package to handle cascade delete and restore on model relations.

Laravel Model Soft Cascade A laravel package to handle cascade delete and restore on model relations. This package not only handle the cascade delete

Touhidur Rahman 18 Apr 29, 2022
A laravel package to handle model specific additional meta fields in an elegant way.

Laravel Meta Fields A php package for laravel framework to handle model meta data in a elegant way. Installation Require the package using composer: c

Touhidur Rahman 26 Apr 5, 2022
Laravel Soulbscription - This package provides a straightforward interface to handle subscriptions and features consumption.

About This package provides a straightforward interface to handle subscriptions and features consumption. Installation You can

Lucas Vinicius 269 Jan 1, 2023
Simple package to handle response properly in your API.

Simple package to handle response properly in your API. This package uses Fractal and is based on Build APIs You Won't Hate book.

Optania 375 Oct 28, 2022
SEO Tools for Laravel

SEOTools - SEO Tools for Laravel and Lumen SEOTools is a package for Laravel 5.8+ and Lumen that provides helpers for some common SEO techniques. Curr

Artesãos 2.7k Dec 31, 2022
This repo is for the Laracon 2021 talk "Manage SEO with Laravel and Nova"

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

Kristin 7 Dec 9, 2022
Easily setup SEO in your laravel project with lara-head :heart: @code4mk

installation composer require code4mk/lara-head usage meta ~ inside controller use Khead; class Test { public function home() { Khead::setMeta

null 173 Dec 23, 2022
Laravel comments - This package enables to easily associate comments to any Eloquent model in your Laravel application

Laravel comments - This package enables to easily associate comments to any Eloquent model in your Laravel application

Rubik 4 May 12, 2022
This is an open source demo of administration panel for polymorphic relationship and SEO content

Laravel SEO admin This application demonstrates usage of polymorphic relationships described at (http://maxoffsky.com/code-blog/using-polymorphic-rela

Maksim Surguy 127 Oct 11, 2022
Laravel 4.* and 5.* service providers to handle PHP errors, dump variables, execute PHP code remotely in Google Chrome

Laravel 4.* service provider for PHP Console See https://github.com/barbushin/php-console-laravel/releases/tag/1.2.1 Use "php-console/laravel-service-

Sergey 73 Jun 1, 2022
A simple laravel state machine to handle model transitions, based on a pre-defined list of rules

A simple state machine that allows transitioning model states based on pre-defined rules. Installation You can install the package via composer: compo

Jack Mollart 18 Apr 2, 2022