xoco70 / laravel-tournaments
A Laravel 5.4+ Package that allows you to generate Tournaments tree
Installs: 22 951
Dependents: 0
Suggesters: 0
Security: 0
Stars: 228
Watchers: 17
Forks: 50
Open Issues: 11
Requires
- php: >=7.4
- kalnoy/nestedset: ^6.0
- laravel/legacy-factories: ^1.3
Requires (Dev)
- fzaninotto/faker: 1.*
- laravel/browser-kit-testing: ^6.0
- orchestra/database: ~6.1
- orchestra/testbench-browser-kit: ~6.0
- phpunit/phpunit: ^8.5
- symfony/var-dumper: ~5.0
- dev-master
- 0.17
- 0.16
- 0.15
- 0.14.3
- 0.14.2
- 0.14.1
- 0.14.0
- 0.13.3
- 0.13.2
- 0.13.1
- 0.13
- 0.12.5
- 0.12.4
- 0.12.3
- 0.12.2
- 0.12.1
- 0.12
- 0.11.19
- 0.11.18
- dev-laravel8
- dev-dependabot/composer/league/flysystem-1.1.4
- dev-dependabot/composer/laravel/framework-7.30.3
- dev-dependabot/composer/symfony/http-kernel-5.1.5
- dev-laravel7
- dev-dependabot/composer/symfony/http-foundation-4.4.7
- dev-develop
This package is auto-updated.
Last update: 2024-10-19 11:29:51 UTC
README
Laravel Tournaments
A Laravel plugin that generate tournaments out of the box
- Features
- Installation
- Demo
- Usage
- Data Model
- Models
- Include views
- Limitations
- Troubleshooting
- Changelog
Features
- Single Elimination Trees Generation
- Single Elimination with Preliminary Round Generation
- Playoff Generation
- Third place fight
- List of Fights Generation
- Customize Preliminary Round Size
- Customize area number (1,2,4,8)
- Modify Single Elimination Tree generation on the fly
- Use teams instead of competitors
Installation
NOTE: Depending on your version of Laravel, you should install a different version of the package:
First, you'll need to install the package via Composer:
composer require "xoco70/laravel-tournaments"
Finally, from the command line again, publish the default configuration file:
php artisan vendor:publish --tag=laravel-tournaments --force
Demo
To run the demo, you need to generate Tournaments, Championships, Users, Competitors and Settings
Run Migrations:
php artisan migrate composer dump-autoload
Seed dummy data:
php artisan db:seed --class=LaravelTournamentSeeder
WARNING: Don't do this in production, it would wipe all your data. Use this line for demo purpose only
Add TreeController ( you can find it in demo repository)
Add your custom routes
Route::get('/', 'App\Http\Controllers\TreeController@index')->name('tree.index'); Route::post('/championships/{championship}/trees', 'App\Http\Controllers\TreeController@store')->name('tree.store'); Route::put('/championships/{championship}/trees', 'App\Http\Controllers\TreeController@update')->name('tree.update');
php artisan db:seed --class=LaravelTournamentSeeder
You will be able to access the demo at http://yourdomain.com/
Usage
// Create a tournament $tournament = factory(Tournament::class)->create(['user_id' => Auth::user()->id]); $championsip = factory(Championship::class)->create(['$tournament_id' => $tournament->id]); // Optional, if not defined, it will take default in ChampionshipSettings $settings = factory(ChampionshipSettings::class)->create(['championship_id' => $championship->id]); // Add competitors to championship $competitors = factory(\App\Competitor::class,10)->create([ 'championship_id' => $championship->id, 'user_id' => factory(User::class)->create()->id ]); // Define strategy to generate $generation = $championship->chooseGenerationStrategy(); // Generate everything $generation->run(); // Just generate Tree $this->generateAllTrees(); // Just generate Fight List $this->generateAllFights();
Data model
Models
Tournament
$tournament->owner; // get owner $tournament->venue; // get venue $tournament->championships; // get championships
Check tournament type:
$tournament->isOpen() $tournament->needsInvitation()
Check tournament level:
$tournament ->isInternational() $tournament->isNational() $tournament->isRegional() $tournament->isEstate() $tournament->isMunicipal() $tournament->isDistrictal() $tournament->isLocal() $tournament->hasNoLevel()
Championship
$championship->competitors; // Get competitors $championship->teams; // Get teams $championship->fighters; // Get fighters $championship->category; // Get category $championship->tournament; // Get tournament $championship->users; // Get users $championship->settings; // Get settings $championship->fightersGroups; // Get groups $championship->groupsByRound($numRound = 1); // Get groups for a specific round $championship->groupsFromRound($numRound = 1); // Get groups from a specific round $championship->fights; // Get fights $championship->firstRoundFights; // Get fights for the first round only ( Useful when has preliminary ) $championship->fights($numRound = 1); // Get fights for a specific round
NOTE: $fighter can be an instance of
Team
orCompetitor
Determine strategy:
$championship->isPlayoffCompetitor() $championship->isPlayoffTeam() $championship->isSingleEliminationCompetitor() $championship->isSingleEliminationTeam()
Determine group size:
$championship->getGroupSize()
Determine championship type:
$championship->hasPreliminary() $championship->isPlayOffType() $championship->isSingleEliminationType()
FightersGroup
$group->championship; // Get championship $group->fights; // Get fights $group->fighters; // Get fighters $group->teams; // Get teams $group->competitors; // Get competitors $group->users; // Get users
NOTE: $fighter can be an instance of
Team
orCompetitor
To get the instance name:
$group->getFighterType() // Should return Team::class or Competitor::class
NOTE: This plugin use laravel-nestedset. This means you can navigate with
$group->children()
or$group->parent()
or use any methods available in this great plugin.
Competitor
$competitor->user; // Get user
Team
// Create a team $team = factory(Team::class) ->create([ championship_id' => $championship->id]);
// Add competitor to team $team->competitors()->attach($competitor->id); // Remove competitor from a team $team->competitors()->detach($competitor->id);
Fight
$fight->group; // Get group $fight->competitor1; // Get competitor1 $fight->competitor2; // Get competitor2 $fight->team1; // Get team1 $fight->team2; // Get team2
Views
Preliminary tree
@include('laravel-tournaments::partials.tree.preliminary') // Preliminary table
Single Elimination tree
@include('laravel-tournaments::partials.tree.singleElimination', ['hasPreliminary' => 0])
Fight List
@include('laravel-tournaments::partials.fights')
Run Functional Tests
vendor/bin/phpunit tests
Limitations
This is a work in progress, and tree creation might be very complex, so there is a bunch of things to achieve.
- Seed fighter
- Manage more than 1 fighter out of preliminary round
- Modify Preliminary Round generation on the fly
- Use any number of area ( restricted to 1,2,4,8)
- Manage n+1 case : When for instance, there is 17 competitors in a direct elimination tree, there will have 15 BYES. We can improve that making the first match with 3 competitors.
- Double elimination
Troubleshooting
Specified key was too long error
For those running MariaDB or older versions of MySQL you may hit this error when trying to run migrations: As outlined in the Migrations guide to fix this all you have to do is edit your AppServiceProvider.php file and inside the boot method set a default string length:
use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); }
With this configuration, you must have at least...
This error means you don't have enough competitors / teams to create given tree Try to increase competitor number, decrease areas or preliminary group size, if preliminary round is active
ChangeLog:
- v0.17: Update to Laravel 8
- v0.16: Update to Laravel 5.8
- v0.15: Update to Laravel 5.7
- v0.14: Update to Laravel 5.6 / PHP 7.2 support
- v0.13: Manage third place fight
- v0.12: Update to Laravel 5.5
- v0.11: Initial Version