Detect flaws in your architecture, before they drag you down into the depths of dependency hell ...

Overview

dePHPend lgo

Build Status Coverage Status Packagist Version License MIT PHP 7.2 Join the chat at Gitter

Detect flaws in your architecture before they drag you down into the depths of dependency hell ...

What it does

dePHPend helps with bringing your PHP projects back in shape. Over the course of a project, we usually keep adding more and more dependencies. Often hidden behind singletons or service locators, these dependencies can quickly become a maintenance (and testing!) nightmare.

dePHPend analyses your app and attempts to find everything you depend on.

With this information you can:

  • get a quick overview of how an application is structured
  • start refactoring where it's needed the most
  • track architecture violations (maybe your view shouldn't be telling the model what to do?)
  • find out why your changes are breaking tests

System Requirements

  • PHP >= 7.2
  • plantuml (UML Class diagram)

Installation

Docker

If you don't want to worry about PHP versions, composer dependencies etc. you can run dePHPend from a docker container:

# replace $PATH_TO_INSPECT with whatever path you would live to inspect
docker run --rm -v $PATH_TO_INSPECT:/inspect mihaeu/dephpend:latest text /inspect

Phive

Phive is the preferred method of installing QA tools which are not linked directly to your code. If you've never heard about it, I'd recommend you check it out. Once installed simply use:

phive install dephpend

# or

phive install --copy dephpend

Composer

You can install dePHPend globally, but this might lead to problems if other globally installed QA tools use different versions of PhpParser for instance.

composer global require dephpend/dephpend:dev-main

Manual .phar download

Download the PHAR file by selecting the latest file from GitHub Releases.

Git

git clone [email protected]:mihaeu/dephpend.git
# or
git clone https://github.com/mihaeu/dephpend.git

cd dephpend
composer install

Usage

You should almost always run QA tools without XDebug (unless you need code coverage of course). You could use a separate php.ini where XDebug is not loaded and pass that to php or you just use the -n option (this will however not load any extensions, so you have to specify those separately).

# or bin/dephpend depending on how you installed this
$ php -n -d extension=tokenizer.so -d extension=json.so -d extension=mbstring.so dephpend.phar                                                                                                 
      _      _____  _    _ _____               _ 
     | |    |  __ \| |  | |  __ \             | |
   __| | ___| |__) | |__| | |__) |__ _ __   __| |
  / _` |/ _ \  ___/|  __  |  ___/ _ \ '_ \ / _` |
 | (_| |  __/ |    | |  | | |  |  __/ | | | (_| |
  \__,_|\___|_|    |_|  |_|_|   \___|_| |_|\__,_| version 0.8.1

Usage:
  command [options] [arguments]

Options:
  -h, --help            Display this help message
  -q, --quiet           Do not output any message
  -V, --version         Display this application version
      --ansi            Force ANSI output
      --no-ansi         Disable ANSI output
  -n, --no-interaction  Do not ask any interactive question
  -v|vv|vvv, --verbose  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Available commands:
  dsm            Generate a Dependency Structure Matrix of your dependencies
  help           Displays help for a command
  list           Lists commands
  metrics        Generate dependency metrics
  test-features  Test support for dependency detection
  text           Prints a list of all dependencies
  uml            Generate a UML Class diagram of your dependencies

Filters

Without filters the output for large apps is too bloated which is why I implemented a couple of filters to help you get the output you want:

      --no-classes                         Remove all classes and analyse only namespaces.
  -f, --filter-from=FILTER-FROM            Analyse only dependencies which originate from this namespace.
      --filter-namespace=FILTER-NAMESPACE  Analyse only classes where both to and from are in this namespace.
  -d, --depth[=DEPTH]                      Output dependencies as packages instead of single classes. [default: 0]
  -e, --exclude-regex=EXCLUDE-REGEX        Exclude all dependencies which match the (PREG) regular expression.

      --dynamic=DYNAMIC                    Adds dependency information from dynamically analysed function traces, for more information check out https://dephpend.com
  -u, --underscore-namespaces              Parse underscores in Class names as namespaces.
      --internals                          Check for dependencies from internal PHP Classes like SplFileInfo.

For more info just run php dephpend.phar help text.

Text

For quick debugging use the text command. Say you want to find out which classes depend on XYZ and what XYZ depends on, you'd run:

php dephpend.phar text src | grep XYZ

# or for more complex applications use filters
php dephpend.phar text symfony --no-classes --depth 3 --exclude-regex='/Test/'

UML

Generates UML class or package diagrams of your source code. Requires PlantUML to be installed.

You can either run

php dephpend.phar uml --output=uml.png src

# or for post-processing
php dephpend.phar uml --output=uml.png --keep-uml src

but most likely what you want to do is to use the --no-classes and --depth[=DEPTH] option. If your app has more than 20 classes, the UML will become messy if you don't use namespace instead of class level. Experiment with different depth values, but usually a depth of 2 or 3 is what you want.

Dependency Structure Matrix

If you've tried decrypting massive UML diagrams before, you know that they become very hard to interpret for large applications. DSMs allow you to get a quick overview of your application and where dependency hotspots are.

This feature is still under construction and right now it's not really fun to use. If you still want to try run

php dephpend.phar dsm src > dependencies.html

php dephpend.phar dsm src --no-classes | bcat

or pipe it to something like bcat.

Metrics

The most common package metrics have already been implemented, but there are more to come. Check them out by running the following command:

php dephpend.phar metrics src

This feature is not production ready and it's better to rely on PHP Depend for this.

Dynamic Analysis

If you want to analyse an old legacy application which makes little use of type hints and other static information and is therefore hard to analyse consider using dynamic analysis.

dePHPend can analyse XDebug trace files and add that information to the static result.

Setup

Make sure you have XDebug installed and included in your php.ini. Also make sure to include the following in the XDebug section of your php.ini:

; you should already have this somewhere in your php.ini
zend_extension=path-to-your-xdebug/xdebug.so

[xdebug]
...

; add this for tracing function calls
xdebug.auto_trace=1
xdebug.collect_params=1
xdebug.collect_return=3
xdebug.collect_assignments=1
xdebug.trace_format=1

This will slow down PHP A LOT so it is best to put it in a separate file like php-with-traces.ini and call dePHPend using php -c /path/to/php-with-traces.ini.

Usage

First create the sample data by running any PHP script (or website) with the above settings in your php.ini (set xdebug.trace_options=1 if you want to track multiple calls, but this will make the trace file grow BIG).

# use your tests (but make sure to exclude unwanted data using filters)
php -c php-with-traces.ini vendor/bin/phpunit

# or using PHP's inbuilt server etc.
php -c php-with-traces.ini -S localhost:8080

The better the sample run and the more of your application it covers, the better the results are going to be. After that process the trace file using the --dynamic option.

php dephpend.phar text src                  \
    --no-classes                            \
    --filter-from=Mihaeu\\PhpDependencies   \
    --exclude-regex='/(Test)|(Mock)/'       \
    --dynamic=/tmp/traces.12345.xt          

You will probably always end up using filters like --filter-from because the dynamic parser parses everything not just the stuff from the directory provided. So all third party stuff is going to show up as well.

The trace file, by default, will be in your system's temporary folder. This can be changed by setting xdebug.trace_output_dir and xdebug.trace_output_name in your php.ini (see XDebug Function Traces).

Examples

Architecture Constraints

Using the text command it is fairly straightforward to create a script which validates your architecture:

#!/usr/bin/env php


$output = shell_exec('php dephpend.phar text src --no-classes');
$constraints = [
    'OS --> .*Analyser',
    'Analyser --> .*OS',
];
if (preg_match('/('.implode(')|(', $constraints).')/', $output)) {
    echo 'Architecture violation'.PHP_EOL;
    exit(1);
}

Save this in your .git/hooks/pre-commit or .git/hooks/pre-push and you'll never violate your project managers trust again. You could also include this on every Travis or Jenkins CI build, but I prefer to not bother the CI when I can check it myself.

Architecture Timeline

Executing dePHPend's metric command on any branch git log --pretty=%H and using convert -delay 100 -loop 0 *.png dephpend-timeline.gif you can create a nice animation detailing the evolution of your architecture:

dePHPend Timeline

How it all works

Basically the process can be broken down into four steps (the actual work is a bit more complicated and for those interested, I'll publish a paper about it, later this year):

  • find all relevant PHP files
  • generate an abstract syntax tree using php-parser by the awesome Nikita Popov
  • traverse the tree, gathering dependencies along the way
  • pass the information to a formatter

Supported Features

Check out tests/features for examples of supported features or run bin/dephpend test-features for a list of supported detection features:

[✓]  creating objects
[✓]  using traits
[✓]  extending other classes
[✓]  type hints in method arguments
[✓]  param return throws in doc comment
[✓]  implementing interfaces
[✓]  php7 return value declaration
[✓]  call to static method
[✗]  return value of known method
[✗]  method arguments and return value from doc
[✗]  known variable passed into method without type hints
[✗]  creating objects from strings

Troubleshooting

Not enough RAM

The PHP-Parser can take up lots of RAM for big applications. You can adjust the RAM limit in your php.ini, but a safer solution would be to call dePHPend by adding php -n -d memory_limit=1024M dephpend.phar ....

License

See LICENSE file

Comments
  • Release Artifact: Can't check signature: No public key

    Release Artifact: Can't check signature: No public key

    I actually like to verify gpg keys. But looks like you did not provide a public key...

    gpg --verify dephpend-0.6.0.phar.asc 
    gpg: assuming signed data in 'dephpend-0.6.0.phar'
    gpg: Signature made Do 11 Apr 2019 17:48:01 CEST
    gpg:                using RSA key 22BD58D0E3B969122E5E1CF22BCCDC2E41A6C1AF
    gpg:                issuer "[email protected]"
    gpg: Can't check signature: No public key
    
    opened by kitingChris 16
  • Error running text mode

    Error running text mode

    I'm running this command

    docker run --rm -v <abs_path>:/inspect mihaeu/dephpend:latest text /inspect

    and I'm getting this output

    `Something went wrong, this shouldn't happen. Please take a minute and report this issue: https://github.com/mihaeu/dephpend/issues

    Argument 1 passed to Mihaeu\PhpDependencies\Analyser\DependencyInspectionVisitor::addName() must be an instance of PhpParser\Node\Name, instance of PhpParser\Node\Expr\PropertyFetch given, called in /dephpend/src/Analyser/DependencyInspectionVisitor.php on line 89

    [/dephpend/src/Analyser/DependencyInspectionVisitor.php at line 97]`

    opened by 155martinmoreno 8
  • Allow filtering out dependencies introduced by deprecated methods and classes.

    Allow filtering out dependencies introduced by deprecated methods and classes.

    When refactoring a code base that needs to maintain a stable interface, it's often necessary to keep undesirable dependencies in deprecated methods until some later release. It would be useful to be able to see what the dependencies would look like with all the deprecated stuff removed. The respective filter would skip all classes and methods with the @deprecated tag in the documentation.

    enhancement prio1 
    opened by brightbyte 7
  • Issue/uml class icons

    Issue/uml class icons

    60% of time was spent to fix broken tests.

    As I undertsand we have here "they are works on my computer".

    Anyway current warning in push hook only "! Line coverage is only 97% but should be 100%".

    But why does it blocks push if there thereshold?

    enhancement 
    opened by garex 7
  • Error in text mode

    Error in text mode

    Similar to #56

    Using: docker, composer: 0.6.2, composer: dev-master

    Argument 1 passed to Mihaeu\PhpDependencies\Analyser\DependencyInspectionVisitor::addName() must be an instance of PhpParser\Node\Name, instance of PhpParser\Node\Expr\ArrayDimFetch given, called in /root/.composer/vendor/dephpend/dephpend/src/Analyser/DependencyInspectionVisitor.php on line 90

    bug 
    opened by williamdes 5
  • Wrong argument on ensureDestinationIsWritable()

    Wrong argument on ensureDestinationIsWritable()

    On version 0.6.1, tried to run bin/dephpend dot myprojectpath and got

    Argument 1 passed to Mihaeu\PhpDependencies\Cli\BaseCommand::ensureDestinationIsWritable() must be of the type string, null given, called in /mydir/dephpend/src/Cli/DotCommand.php on line 51 [/mydir/dephpend/src/Cli/BaseCommand.php at line 138]

    opened by garak 5
  • Improve --underscore-namespaces implementation

    Improve --underscore-namespaces implementation

    Improves implementaion of --underscore-namespaces when applied on classes that already have namespace.

    Current implementation is changing all classnames that contains underscores, even if they already use namespace. That behaviour causes Fatal errors, e.g.: PHP Fatal error: Uncaught InvalidArgumentException: Class name "1" is not valid

    Reproducible e.g. on doctrine2 tests directory (just an example with publicly downloadable project).

    This pull request allows to use dephpend on older projects that combine classes with and without namespaces or projects without namespaces which contains libraries with namespaces in the scr directory.

    opened by tomor 5
  • Don't treat class name literals as dependencies

    Don't treat class name literals as dependencies

    Class name literals, like FooBar::class, should not be treated as a dependency on the class FooBar. Such literals are really just syntactic sugar for string literals like "FooBar", they don't require the class to be loaded, or even to exist at all.

    Technically, class name literals are a dependency on the class name, as they have to be updated when the class is renamed. If this kind of dependency should still be tracked, the mechanism for marking the dependency type suggested in #43 could be used to mark such dependencies as "name".

    enhancement 
    opened by brightbyte 4
  • Optionally mark visibility of a dependency in output

    Optionally mark visibility of a dependency in output

    It would be useful to me to be able to distinguish between dependencies of different visibility, in particular "public" dependencies (subclassing, implemented interfaces, public method signatures) and "private" dependencies (private method signatures, use in method bodies). For a large and messy code base like MediaWiki, this would allow further analysis to distinguish between that are hard to fix (public dependencies) and things that are easy to fix (private dependencies).

    This is a feature I so far have not seen in any static analysis tool. I'm wondering why, I can't be the only one who'd find this useful. Perhaps it's because static analysis tools are mostly used by design purists, and options to filter out some kinds of issues as "less bad" does not appeal to them?... When working with clean code, this kind of thing isn't needed. When trying to clean up an organically grown tangle of half a million lines, it would be great to have...

    Anyway. In addition to "private" and "public", there are a few in-between visibilities to be consider:

    • "constructor" (use in the constructor signature). Technically public, but constructor calls may be restricted to wiring code by convention, making it "internal" in a sense. For this to me useful, constructor usage should not be considered "public".
    • "protected" - may have to be treated as private or public, depending on context.
    • "internal" if the class or method has the @internal tag
    • "deprecated" if the class or method has the @deprecated tag. This essentially makes this an extension of or alternative to issue #42.

    In "text" output, with --visibility enabled, this flags could form a third column, perhaps using the form Foo --> Bar @private FooBar --> Foo @public FooBar --> Frob @protected @deprecated

    In GML (as proposed in #41) this could trivially be represented as additional attributes on the edges.

    enhancement 
    opened by brightbyte 4
  • Uncaught TypeError: Argument 1 passed to Mihaeu\PhpDependencies\Dependencies\DependencyFactory::createClazzFromStringArray() must be of the type array, null given

    Uncaught TypeError: Argument 1 passed to Mihaeu\PhpDependencies\Dependencies\DependencyFactory::createClazzFromStringArray() must be of the type array, null given

    $ git clone [email protected]:mihaeu/dephpend.git
    
    $ cd dephpend
    
    $ composer update
    
    $ cd ...
    
    $ git clone [email protected]:symfony/symfony.git
    
    $ cd symfony
    
    $ composer update
    
    $ ../dephpend/bin/dephpend text .
    PHP Notice:  Undefined property: PhpParser\Node\Stmt\Class_::$namespacedName in /usr/local/src/dephpend/src/Analyser/DependencyInspectionVisitor.php on line 188
    PHP Notice:  Trying to get property of non-object in /usr/local/src/dephpend/src/Analyser/DependencyInspectionVisitor.php on line 188
    PHP Fatal error:  Uncaught TypeError: Argument 1 passed to Mihaeu\PhpDependencies\Dependencies\DependencyFactory::createClazzFromStringArray() must be of the type array, null given, called in /usr/local/src/dephpend/src/Analyser/DependencyInspectionVisitor.php on line 188 and defined in /usr/local/src/dephpend/src/Dependencies/DependencyFactory.php:14
    Stack trace:
    #0 /usr/local/src/dephpend/src/Analyser/DependencyInspectionVisitor.php(188): Mihaeu\PhpDependencies\Dependencies\DependencyFactory->createClazzFromStringArray(NULL)
    #1 /usr/local/src/dephpend/src/Analyser/DependencyInspectionVisitor.php(59): Mihaeu\PhpDependencies\Analyser\DependencyInspectionVisitor->setCurrentClass(Object(PhpParser\Node\Stmt\Class_))
    #2 /usr/local/src/dephpend/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(92): Mihaeu\PhpDependencies\Analyser\DependencyInspectionVisitor->enterNode(Object(PhpParser\Node\Stmt\Class_))
    #3 /usr/local/src/dephpend/vendor/nikic/php-parser/lib/PhpParser/NodeTraverser.php(101): PhpParser\NodeTraverser->traverseNo in /usr/local/src/dephpend/src/Dependencies/DependencyFactory.php on line 14
    
    opened by sebastianbergmann 4
  • Improve --underscore-namespaces to fix invalid class names (^number)

    Improve --underscore-namespaces to fix invalid class names (^number)

    --underscore-namespaces option is very usefull for projects that don't use namespaces to allow component/package level view. Unfortunataly in such project we can have classes like My_Class_2You . When "namespaced", it will result into invalid classname because it starts with number: My/Class/2You

    It causes Fatal error even when I'm not interested in classes (--no-classes used).

    It would be nice to come with solution for this issue.

    Suggestions:

    1. Autofix class names in mapNamespaces() method always
    2. Fix classes when specified e.g. with --underscore-namespaces-fix
    3. Or more specific - prefixing bad class names --underscore-namespaces-classfix-prefix (that would help to classes that start with number)
    4. Or some kind of regular expression modification --underscrore-namespaces-fix-regex of invalid classes?

    .. or maybe you have a better idea how to fix such issue ;)

    There might be another invalid class name situation, but this one with the number at the beginning is the one which currently hinders me from using dephpend on the project I'm dealing with (without being forced to refactor such code).

    opened by tomor 4
  • "PlantUML installation not found" despite PlantUML being globally installed

    Hello! I am trying to run /home/user/dephpend/bin/dephpend uml --output=uml.png --no-classes src but I'm getting the following error:

    Something went wrong, this shouldn't happen. Please take a minute and report this issue: https://github.com/mihaeu/dephpend/issues
    
    PlantUML installation not found.
    
    [/home/user/dephpend/src/OS/PlantUmlWrapper.php at line 57]
    

    I've checked that PlantUML is installed globally so I'm not sure what it could be. dePHPend is working fine for other options (metrics, etc.) Thanks!

    [user@endeavour]$ pacman -Qs plantuml
    local/plantuml 1.2022.7-1
        Component that allows to quickly write uml diagrams
    
    opened by erin-bristow 0
  • Upgrade to PHP8.1

    Upgrade to PHP8.1

    This PR upgrades the entire package and its dependencies to rely on php 8.1. The main drive for the php update is to be able to use all latest versions of the existing packages.

    Special mention

    This specific commit prevents PHP Enum classes from breaking.

    It used to break saying that $node->isAbstract() doesn't exist for Node\Stmt\Enum_.

    This PR includes

    • Added github actions to include tests
    • Updated PHPUnit assertions to work with phpunit 9.5
    • Updated php-cs-fixer --rules label. And updated the codebase afterwards with the new psr12 standard.
    • $method->getReturnType()->getName() update.
    • The Dockerfile is also updated to use PHP8.1 too.

    There are some failing tests that I can't make it work with github actions:

    • Install json.so extension: I added json to the list of extensions, but it didn't seem to work.
    • I added a new test for Enums, and now there is a new error for the test. I couldn't figure out how the tests well too well, but I have a suspicion that the Enums are not printing anything. I run this updated version against my codebase and it was able to generate the Text version correctly.

    I opened it as a draft to get feedback and assistance before committing to fix the tests. Thanks in advance for this package and for the help!

    opened by juampi92 1
  • unexpected T_STRING error reported for php 8.1 enum

    unexpected T_STRING error reported for php 8.1 enum

    Executing dephpend from docker I've received Syntax error, unexpected T_STRING on line 5 in file /inspect/app/Enum/MyClass.php.

    <?php
    
    namespace App\Enum;
    
    enum MyClass: int
    {
    ...
    }
    
    opened by eliseuborges 0
  • Multiple derprecations in php 8.1

    Multiple derprecations in php 8.1

    Hello, first of all, thanks for the great tool, I have been using it for quite a long time.
    But it seems that the library needs to be updated in order to work with PHP 8.1 I get these errors:

    Deprecated: Return type of Mihaeu\PhpDependencies\Util\AbstractMap::count() should either be compatible with Countable::count(): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/dephpend/src/Util/AbstractMap.php on line 132
    
    Deprecated: Return type of Mihaeu\PhpDependencies\Util\AbstractCollection::count() should either be compatible with Countable::count(): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/dephpend/src/Util/AbstractCollection.php on line 84
    
    Deprecated: Return type of Symfony\Component\Console\Helper\HelperSet::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in phar:///usr/local/bin/dephpend/vendor/symfony/console/Helper/HelperSet.php on line 94
    

    Could you please fix that?

    opened by beeyev 1
  • Expired certificate in verification signature

    Expired certificate in verification signature

    The signature on the latest release is signed using an expired certificate.

    Verification

    $ gpg2 --verify dephpend-0.8.0.phar.asc dephpend-0.8.0.phar
    
    gpg: Signature made Sun May  2 14:09:30 2021 BST
    gpg:                using RSA key 44CC65DC01D2FC05AD6F3DBD76835C9464877BDD
    gpg:                issuer "[email protected]"
    gpg: Can't check signature: No public key
    

    Checking the cert provided on OpenPGP

    $ curl -s "https://keys.openpgp.org/pks/lookup?op=get&options=mr&search=44CC65DC01D2FC05AD6F3DBD76835C9464877BDD" | gpg2
    
    gpg: WARNING: no command supplied.  Trying to guess what you mean ...
    pub   rsa4096 2019-07-14 [SC] [expired: 2020-07-13]
          44CC65DC01D2FC05AD6F3DBD76835C9464877BDD
    uid           Michael Haeuslmann <[email protected]>
    sub   rsa4096 2019-07-14 [E] [expired: 2020-07-13]
    

    Also shows as an issue installing with Phive

    $ phive install dephpend
    
    Phive 0.15.0 - Copyright (C) 2015-2021 by Arne Blankerts, Sebastian Heuer and Contributors
    Downloading https://api.github.com/repos/mihaeu/dephpend/releases
    Downloading https://github.com/mihaeu/dephpend/releases/download/0.8.0/dephpend-0.8.0.phar
    Downloading https://github.com/mihaeu/dephpend/releases/download/0.8.0/dephpend-0.8.0.phar.asc
    [ERROR]    Signature could not be verified 
    [ERROR]    unknown error code 
    

    Checking the key pulled by phive

    $ gpg2 --list-keys --no-default-keyring --keyring ${HOME}/.phive/gpg/pubring.kbx | grep "44CC65DC01D2FC05AD6F3DBD76835C9464877BDD" -C2
    
    pub   rsa4096 2019-07-14 [SC] [expired: 2020-07-13]
          44CC65DC01D2FC05AD6F3DBD76835C9464877BDD
    uid           [ expired] Michael Haeuslmann <[email protected]>
    
    opened by RBotfield 0
  • Finalize PHP 8 support

    Finalize PHP 8 support

    I see that https://github.com/mihaeu/dephpend/commit/075d60da5571ad0bd3f1b0fd7607896795a69334 adds PHP 8 support, but some things are still missing:

    1. travis-ci configuration still does not mention PHP 8
    2. composer config does not have PHP 8 support, which means that installing through composer requires --ignore-platform-req php

    Note that Travis CI still breaks on PHP 8 because of code coverage, which is not supported for PHP 8 with the current PHPUnit version. I could upgrade PHPUnit to 9.5 (and make the required fixes in tests), but that would mean PHP 7.2 would no longer be supported (PHP 7.3 would be the minimum version).

    Perhaps we could leave code coverage out? Or what is your preferred way of handling this?

    opened by evll 4
Releases(0.8.0)
Owner
Michael Haeuslmann
Loves coding, traveling, artificial and natural languages and wants to never stop learning ...
Michael Haeuslmann
FFCMS 3 version core MVC architecture. Build-on use with ffcms main architecture builder.

FFCMS 3 version core MVC architecture. Build-on use with ffcms main architecture builder.

FFCMS 0 Feb 25, 2022
salah eddine bendyab 18 Aug 17, 2021
A Laravel 9 package that allows you enforce security of your artisan commands by authenticating users before running.

Introduction This package allows you as a developer to restrict who can and cannot run artisan commands, especially in a production environment. For e

YOo Slim 2 Sep 15, 2022
Disclaimer: The documentation of this plugin is English at the moment, but I might go for Latin later down the line, just for the fun of it.

Quiritibus Plugin This repository is storing the custom plugin developed for the Quiritibus Latin Magazine website, currently being developed at: http

Alkor András 1 Jan 19, 2022
Safely break down arrays or objects, and put them back together in new shapes.

traverse/reshape traverse() and reshape() are companion functions that safely break down arrays or objects and put them back together in new shapes. t

Alley Interactive 2 Aug 4, 2022
The Workflow Package add Drag & Drop Workflows to your Laravel Application.

Workflows add Drag & Drop automation's to your Laravel application. The Workflow Package adds Drag & Drop Workflows to your Laravel Application. A Wor

42coders 196 Dec 29, 2022
Secure the data of your sites by encrypting them. They will be decrypted only in your applications

PHP Crypter Secure the data of your sites by encrypting them. They will be decrypted only in your applications How to use ? You just have to include t

Claude Fassinou 7 Nov 26, 2022
File Upload widget with multiple file selection, drag&drop support, progress bar, validation and preview images, audio and video for jQuery

File Upload widget with multiple file selection, drag&drop support, progress bar, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.

Sebastian Tschan 31.1k Dec 30, 2022
Keep control over the complexity of your methods by checking that they do not have too many arguments.

php arguments detector The ideal number of arguments for a function is zero. ~ Robert C. Martin Keep control over the complexity of your methods by ch

DeGraciaMathieu 13 Dec 26, 2022
Talkino allows you to integrate multi social messengers and contact into your website and enable your users to contact you using multi social messengers' accounts.

Talkino Welcome to our GitHub Repository Talkino is a click to chat plugin to show your agents’ multiple social messengers, phone and emails on the ch

Traxconn 2 Sep 21, 2022
Test and enforce architectural rules in your Laravel applications. Keep your app's architecture clean and consistent!

Laravel Arkitect Laravel Arkitect lets you test and enforce your architectural rules in your Laravel applications, and it's a PHPArkitect wrapper for

SMorteza Ebadi 55 Dec 17, 2022
An installer package that let's you install NodeJS and NPM as a Composer dependency.

NodeJS installer for Composer This is an installer that will download NodeJS and NPM and install them in your Composer dependencies. Installation is s

TheCodingMachine 106 Sep 30, 2022
Allow players to see how well they are doing while pvping with the help of a combo counter

Combo-Counter Allow players to see how well they are doing while pvping with the help of a combo counter Settngs / Config #set to false if you dont wa

null 3 Jun 1, 2022
Silverstripe-tinytidy - Control which styles are available in TinyMCE's style dropdown menu and what elements they can be applied to

TinyTidy for SilverStripe This module mainly serves as an example of how to customise the 'styles' dropdown menu in the TinyMCE editor to control whic

Jono Menz 30 Jul 30, 2020
QuestionApp - a platform where users can ask questions and discuss about the subject they are curious about

QuestionApp About The Project It can be a trend according to the number of likes and comments that members can ask questions. ![Alt Text] Ask your any

Tolga Bayrak 4 Oct 7, 2022
My intention with this app is that new developers can have a concrete application with Laravel + VueJS where they can use it as example to learn the right way

My intention with this app is that new developers can have a concrete application with Laravel + VueJS where they can use it as example to learn the right way, implementing the best practices possible and at the same time learn how TDD is done. So this will be an example application but completely usable for any similar case.

Eng Hasan Hajjar 2 Sep 30, 2022
Library for PHP 7.4+ to detect Browsers and Devices

This library requires PHP 7.4+. Also a PSR-3 compatible logger and a PSR-16 compatible cache are required. In

Thomas Müller 37 Oct 2, 2022
Rules to detect game engines and other technologies based on Steam depot file lists

SteamDB File Detection Rule Sets This is a set of scripts that are used by SteamDB to make educated guesses about the engine(s) & technology used to b

Steam Database 103 Dec 14, 2022