All Projects → goaop → goaop-laravel-bridge

goaop / goaop-laravel-bridge

Licence: MIT License
Integration bridge for Go! AOP framework and Laravel

Programming Languages

PHP
23972 projects - #3 most used programming language

Projects that are alternatives of or similar to goaop-laravel-bridge

Decor.NET
A simple way to decorate a class with additional functionality using attributes.
Stars: ✭ 29 (-68.13%)
Mutual labels:  aop, aspect-oriented-programming
Aspect4Delphi
Concepts of aspect-oriented programming (AOP) in Delphi.
Stars: ✭ 28 (-69.23%)
Mutual labels:  aop, aspect-oriented-programming
Mimick.Fody
An integrated framework for dependency injection and aspect-oriented processing.
Stars: ✭ 15 (-83.52%)
Mutual labels:  aop, aspect-oriented-programming
NCop
Composite-aspect oriented framework for .NET
Stars: ✭ 30 (-67.03%)
Mutual labels:  aop, aspect-oriented-programming
aspectgo
Aspect-Oriented Programming framework for Go
Stars: ✭ 62 (-31.87%)
Mutual labels:  aop, aspect-oriented-programming
CNeptune
CNeptune improve productivity & efficiency by urbanize .net module with meta-code to lay foundation for frameworks
Stars: ✭ 30 (-67.03%)
Mutual labels:  aop, aspect-oriented-programming
AspecTS
An aspect-oriented programming library implemented in TypeScript
Stars: ✭ 21 (-76.92%)
Mutual labels:  aop, aspect-oriented-programming
laravel-crud-generator
Laravel CRUD Generator
Stars: ✭ 181 (+98.9%)
Mutual labels:  laravel-5-package
matrix-puppet-facebook
a puppetted facebook bridge
Stars: ✭ 90 (-1.1%)
Mutual labels:  bridge
laravel-browser-filter
Laravel middleware to filter routes based on browser types & versions.
Stars: ✭ 20 (-78.02%)
Mutual labels:  laravel-5-package
Base62
PHP Base62 encoder and decoder for integers and big integers with Laravel 5 support.
Stars: ✭ 16 (-82.42%)
Mutual labels:  laravel-5-package
docxmustache
laravel 8.x docx template manipulation class, based on mustache templating language
Stars: ✭ 34 (-62.64%)
Mutual labels:  laravel-5-package
core
augejs is a progressive Node.js framework for building applications. https://github.com/augejs/augejs.github.io
Stars: ✭ 18 (-80.22%)
Mutual labels:  aop
mumsi
SIP to Mumble gateway/bridge using PJSUA stack.
Stars: ✭ 33 (-63.74%)
Mutual labels:  bridge
laravel-big
Google BigQuery for Laravel
Stars: ✭ 14 (-84.62%)
Mutual labels:  laravel-5-package
LaravelFtp
Laravel FTP client
Stars: ✭ 15 (-83.52%)
Mutual labels:  laravel-5-package
laravel-garbage-man
Scheduled job to clean out Laravel's soft deleted records at configured interval
Stars: ✭ 33 (-63.74%)
Mutual labels:  laravel-5-package
laravel-video-api
Laravel (Youtube/Vimeo) Video Data API
Stars: ✭ 53 (-41.76%)
Mutual labels:  laravel-5-package
TeamCord
Cross voice communication between Teamspeak and Discord
Stars: ✭ 35 (-61.54%)
Mutual labels:  bridge
laravel-string-similarities
Compare two string and get a similarity percentage
Stars: ✭ 54 (-40.66%)
Mutual labels:  laravel-5-package

GoAopBridge

Scrutinizer Code Quality GitHub release Minimum PHP Version License

The GoAopBridge adds support for Aspect-Oriented Programming via Go! AOP Framework for Laravel5 applications.

Overview

Aspect-Oriented Paradigm allows to extend the standard Object-Oriented Paradigm with special instruments for effective solving of cross-cutting concerns in your application. This code is typically present everywhere in your application (for example, logging, caching, monitoring, etc) and there is no easy way to fix this without AOP.

AOP defines new instruments for developers, they are:

  • Joinpoint - place in your code that can be used for interception, for example, execution of single public method or accessing of single object property.
  • Pointcut is a list of joinpoints defined with a special regexp-like expression for your source code, for example, all public and protected methods in the concrete class or namespace.
  • Advice is an additional callback that will be called before, after or around concrete joinpoint. For PHP each advice is represented as a \Closure instance, wrapped into the interceptor object.
  • Aspect is a special class that combines pointcuts and advices together, each pointcut is defined as an annotation and each advice is a method inside this aspect.

You can read more about AOP in different sources, there are good articles for Java language and they can be applied for PHP too, because it's general paradigm. Alternatively, you can watch a nice presentation about AOP in Laravel

Installation

GoAopBridge can be easily installed with composer. Just ask a composer to download the bundle with dependencies by running the command:

$ composer require goaop/goaop-laravel-bridge

Laravel 5.5+

No action is needed. After the command composer require goaop/goaop-laravel-bridge the package is installed and configured automatically. For a manual configuration, follow these steps.

Laravel 5.4 or less

Add the Go\Laravel\GoAopBridge\GoAopServiceProvider to your config/app.php providers array:

// config/app.php

    'providers' => [
        // Go! Aspect Service Provider
        Go\Laravel\GoAopBridge\GoAopServiceProvider::class,

Make sure that this service provider is the first item in this list. This is required for the AOP engine to work correctly.

Lumen

Register the Go\Laravel\GoAopBridge\GoAopServiceProvider to the app in your bootstrap/app.php:

// bootstrap/app.php
<?php
// After `$app` is created

$app->register(\Go\Laravel\GoAopBridge\GoAopServiceProvider::class);

Make sure that this service provider is the first call to $app->register(). This is required for the AOP engine to work correctly.

Configuration

The default configuration in the config/go_aop.php file. If you want to change any of the default values you have to copy this file to your own config directory to modify the values.

If you use Laravel, you can also publish the config using this command:

./artisan vendor:publish --provider="Go\Laravel\GoAopBridge\GoAopServiceProvider"

If you use Lumen, you have to manually load the config file, example:

// bootstrap/app.php
<?php
// After `$app` is created

$app->configure('go_aop');

Configuration can be used for additional tuning of AOP kernel and source code whitelistsing/blacklisting.

// config/go_aop.php

return [
    /*
     |--------------------------------------------------------------------------
     | AOP Debug Mode
     |--------------------------------------------------------------------------
     |
     | When AOP is in debug mode, then breakpoints in the original source code
     | will work. Also engine will refresh cache files if the original files were
     | changed.
     | For production mode, no extra filemtime checks and better integration with opcache
     |
     */
    'debug' => env('APP_DEBUG', false),

    /*
     |--------------------------------------------------------------------------
     | Application root directory
     |--------------------------------------------------------------------------
     |
     | AOP will be applied only to the files in this directory, change it to app_path()
     | if needed
     */
    'appDir' => base_path(),

    /*
     |--------------------------------------------------------------------------
     | AOP cache directory
     |--------------------------------------------------------------------------
     |
     | AOP engine will put all transformed files and caches in that directory
     */
    'cacheDir' => storage_path('app/aspect'),

    /*
     |--------------------------------------------------------------------------
     | Cache file mode
     |--------------------------------------------------------------------------
     |
     | If configured then will be used as cache file mode for chmod.
     | WARNING! Use only integers here, not a string, e.g. 0770 instead of '0770'
     */
    'cacheFileMode' => null,

    /*
     |--------------------------------------------------------------------------
     | Controls miscellaneous features of AOP engine
     |--------------------------------------------------------------------------
     |
     | See \Go\Aop\Features enumeration for bit mask
     */
    'features' => 0,

    /*
     |--------------------------------------------------------------------------
     | White list of directories
     |--------------------------------------------------------------------------
     |
     | AOP will check this list to apply an AOP to selected directories only,
     | leave it empty if you want AOP to be applied to all files in the appDir
     */
    'includePaths' => [
        app('path')
    ],

    /*
     |--------------------------------------------------------------------------
     | Black list of directories
     |--------------------------------------------------------------------------
     |
     | AOP will check this list to disable AOP for selected directories
     */
    'excludePaths' => [],

    /*
     |--------------------------------------------------------------------------
     | AOP container class
     |--------------------------------------------------------------------------
     |
     | This option can be useful for extension and fine-tuning of services
     */
    'containerClass' => GoAspectContainer::class,
]

Defining new aspects

Aspects are services in the Laravel application and loaded into the AOP container with the help of service provider that collects all services tagged with goaop.aspect tag in the container. Here is an example how to implement a logging aspect that will log information about public method invocations in the app/ directory.

Definition of aspect class with pointuct and logging advice

<?php

namespace App\Aspect;

use Go\Aop\Aspect;
use Go\Aop\Intercept\MethodInvocation;
use Go\Lang\Annotation\Before;
use Psr\Log\LoggerInterface;

/**
 * Application logging aspect
 */
class LoggingAspect implements Aspect
{
    /**
     * @var LoggerInterface
     */
    private $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    /**
     * Writes a log info before method execution
     *
     * @param MethodInvocation $invocation
     * @Before("execution(public **->*(*))")
     */
    public function beforeMethod(MethodInvocation $invocation)
    {
        $this->logger->info($invocation, $invocation->getArguments());
    }
}

To register all application aspects in the container, create a service provider (or use an existing one)

./artisan make:provider AopServiceProvider

Inside register() method for this service provider, add declaration of aspect and tag it with goaop.aspect tag:

namespace App\Providers;

use App\Aspect\LoggingAspect;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Support\ServiceProvider;
use Psr\Log\LoggerInterface;

class AopServiceProvider extends ServiceProvider
{

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton(LoggingAspect::class, function (Application $app) {
            return new LoggingAspect($app->make(LoggerInterface::class));
        });

        $this->app->tag([LoggingAspect::class], 'goaop.aspect');
    }

Don't forget to add this service provider into your config/app.php service providers list!

License

This bridge is under the MIT license. See the complete LICENSE in the root directory

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].