PHPackages                             brenofortunato/laravel-quiz - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. brenofortunato/laravel-quiz

ActiveLibrary

brenofortunato/laravel-quiz
===========================

Library for adding questionnaires into a Laravel project.

v2.3.3(5y ago)011MITHTMLPHP &gt;=7.0

Since Sep 11Pushed 5y agoCompare

[ Source](https://github.com/BrenoFortunato/laravel-quiz)[ Packagist](https://packagist.org/packages/brenofortunato/laravel-quiz)[ RSS](/packages/brenofortunato-laravel-quiz/feed)WikiDiscussions master Synced yesterday

READMEChangelog (1)Dependencies (12)Versions (16)Used By (0)

LaravelQuiz
===========

[](#laravelquiz)

Pacote para adicionar questionários a um projeto Laravel.

Requisitos Mínimos
------------------

[](#requisitos-mínimos)

- PHP 7.0
- Laravel 5.8
- Laravel Datatables 9.0

Instalação
----------

[](#instalação)

Para instalar, basta utilizar o comando abaixo:

```
composer require brenofortunato/laravel-quiz
```

Em seguida, publique os assets:

```
php artisan vendor:publish --provider="PandoApps\Quiz\QuizServiceProvider"
```

Configuração
------------

[](#configuração)

Certifique-se de que não existam tabelas com os nomes **questionnaires**, **question\_types**, **questions**, **alternatives**, **executables** e **answers**. Caso existam, remova-as ou renomeie-as, não se esqueça dos models, views e tudo o que tiver relação com as tabelas citadas. Quando estiver pronto, execute a migration:

```
php artisan migrate
```

Em seguida, execute o seeder **QuestionTypeSeeder**:

```
php artisan db:seed --class=QuestionTypeSeeder
```

Abra o arquivo **config/quiz.php** e edite o array models para atender suas necessidades, conforme descrições abaixo:

```
	'models' => [
		'executable'               => App\User::class,      // Model que responderá o questionário
		'executable_column_name'   => 'name',               // Nome da coluna que representa a descrição do model que executa o questionário
		'parent_type'              => App\Holding::class,   // Model que é dono do questionário
		'parent_id'                => 'holding_id',         // Nome da coluna que representa a FK para o model que é dono do questionário
		'parent_url_name'          => 'holdings',           // Nome da tabela do model que é dono do questionário
	]
```

Adicione os relacionamentos abaixo ao model que responderá o questionário (no caso do exemplo acima, em **User**):

```
	/**
     * @return \Illuminate\Database\Eloquent\Relations\MorphMany
     **/
    public function executables()
    {
        return $this->morphMany(\PandoApps\Quiz\Models\Executable::class, 'executable');
	}

	/**
	 * @return \Illuminate\Database\Eloquent\Relations\MorphToMany
	 **/
	public function answeredQuestionnaires()
	{
		return $this->morphToMany(\PandoApps\Quiz\Models\Questionnaire::class, 'executable')->withPivot('id', 'score', 'answered')->withTimestamps();
	}
```

E o relacionamento abaixo ao model que é dono do questionário (no caso do exemplo, em **Holding**):

```
	/**
	* @return \Illuminate\Database\Eloquent\Relations\MorphMany
	**/
	public function questionnaires()
	{
		return $this->morphMany(\PandoApps\Quiz\Models\Questionnaire::class, 'parent');
	}
```

Adicione as rotas em **routes/web.php**:

```
	Route::group(['prefix' => config('quiz.models.parent_url_name'). '/{' . config('quiz.models.parent_id'). '}'], function () {
		Route::group(['prefix' => 'questionnaires'], function () {
			Route::get('/',                                          ['as'=>'questionnaires.index',   'uses'=>'\PandoApps\Quiz\Controllers\QuestionnaireController@index']);
			Route::get('/create',                                    ['as'=>'questionnaires.create',  'uses'=>'\PandoApps\Quiz\Controllers\QuestionnaireController@create']);
			Route::post('/',                                         ['as'=>'questionnaires.store',   'uses'=>'\PandoApps\Quiz\Controllers\QuestionnaireController@store']);
			Route::get('/{questionnaire_id}',                        ['as'=>'questionnaires.show',    'uses'=>'\PandoApps\Quiz\Controllers\QuestionnaireController@show']);
			Route::match(['put', 'patch'], '/{questionnaire_id}',    ['as'=>'questionnaires.update',  'uses'=>'\PandoApps\Quiz\Controllers\QuestionnaireController@update']);
			Route::delete('/{questionnaire_id}',                     ['as'=>'questionnaires.destroy', 'uses'=>'\PandoApps\Quiz\Controllers\QuestionnaireController@destroy']);
			Route::get('/{questionnaire_id}/edit',                   ['as'=>'questionnaires.edit',    'uses'=>'\PandoApps\Quiz\Controllers\QuestionnaireController@edit']);
		});

		Route::group(['prefix' => 'questions'], function () {
			Route::get('/',                                         ['as'=>'questions.index',   'uses'=>'\PandoApps\Quiz\Controllers\QuestionController@index']);
			Route::get('/{question_id}',                            ['as'=>'questions.show',    'uses'=>'\PandoApps\Quiz\Controllers\QuestionController@show']);
			Route::match(['put', 'patch'], '/{question_id}',        ['as'=>'questions.update',  'uses'=>'\PandoApps\Quiz\Controllers\QuestionController@update']);
			Route::delete('/{question_id}',                         ['as'=>'questions.destroy', 'uses'=>'\PandoApps\Quiz\Controllers\QuestionController@destroy']);
			Route::get('/{question_id}/edit',                       ['as'=>'questions.edit',    'uses'=>'\PandoApps\Quiz\Controllers\QuestionController@edit']);
		});

		Route::group(['prefix' => 'alternatives'], function () {
			Route::get('/',                                        ['as'=>'alternatives.index',   'uses'=>'\PandoApps\Quiz\Controllers\AlternativeController@index']);
			Route::get('/{alternative_id}',                        ['as'=>'alternatives.show',    'uses'=>'\PandoApps\Quiz\Controllers\AlternativeController@show']);
			Route::match(['put', 'patch'], '/{alternative_id}',    ['as'=>'alternatives.update',  'uses'=>'\PandoApps\Quiz\Controllers\AlternativeController@update']);
			Route::delete('/{alternative_id}',                     ['as'=>'alternatives.destroy', 'uses'=>'\PandoApps\Quiz\Controllers\AlternativeController@destroy']);
			Route::get('/{alternative_id}/edit',                   ['as'=>'alternatives.edit',    'uses'=>'\PandoApps\Quiz\Controllers\AlternativeController@edit']);
		});

		Route::group(['prefix' => 'executables'], function () {
			Route::get('/',                                     ['as'=>'executables.index',         'uses'=>'\PandoApps\Quiz\Controllers\ExecutableController@index']);
			Route::get('/{questionnaire_id}/questionnaire',     ['as'=>'executables.statistics',    'uses'=>'\PandoApps\Quiz\Controllers\ExecutableController@statistics']);
			Route::get('{executable_id}/',                      ['as'=>'executables.show',          'uses'=>'\PandoApps\Quiz\Controllers\ExecutableController@show']);
			Route::get('{questionnaire_id}/create/{model_id}',  ['as'=>'executables.create',        'uses'=>'\PandoApps\Quiz\Controllers\ExecutableController@create']);
			Route::post('{questionnaire_id}/store',             ['as'=>'executables.store',         'uses'=>'\PandoApps\Quiz\Controllers\ExecutableController@store']);
			Route::post('start',                                ['as'=>'executables.start',         'uses'=>'\PandoApps\Quiz\Controllers\ExecutableController@start']);
		});

		Route::group(['prefix' => 'answers'], function () {
			Route::get('/',                                     ['as'=>'answers.index',   'uses'=>'\PandoApps\Quiz\Controllers\AnswerController@index']);
			Route::get('/{answer_id}',                          ['as'=>'answers.show',    'uses'=>'\PandoApps\Quiz\Controllers\AnswerController@show']);
		});
	});
```

Adicione o questionário ao menu em **resources/views/layouts/menu.blade.php**, substituindo **request()-&gt;PARENT\_ID** pelo correspondente em seu caso (no exemplo, seria **request()-&gt;holding\_id**):

```

		{!! \Lang::choice('tables.questionnaires','p') !!}
		@if(Request::is('*questions*') && request()->questionnaire_id)

					{!! \Lang::choice('tables.questions','p') !!}

		@endisset
		@if(Request::is('*alternatives*') && request()->question_id)

					{!! \Lang::choice('tables.alternatives','p') !!}

		@endisset

```

Adicione as traduções das tabelas em **resources/lang/pt\_BR/tables.php**:

```
	'questionnaires'        => '[s] Questionário         |[p] Questionários',
	'questions'             => '[s] Questão              |[p] Questões',
	'alternatives'          => '[s] Alternativa          |[p] Alternativas',
	'question_types'        => '[s] Tipo da Questão      |[p] Tipo das Questões',
	'answers'               => '[s] Resposta             |[p] Respostas',
```

Personalização
--------------

[](#personalização)

As instruções abaixo não são necessárias, mas servem de orientação para uma maior personalização do pacote.

Caso queira modificar as traduções exibidas nas datatables, edite o arquivo **resources/lang/vandor/pandoapps/pt\_BR/datatable.php**.

Caso queira modificar as views, edite os arquivos no diretório **resources/views/vendor/pandoapps**.

Para modificar as datatables, crie um cópia delas em **app/DataTables**. Utilize os arquivos abaixo como base (não se esqueça de mudar o namespace para **App\\DataTables**):

- [QuestionnaireDataTable](https://github.com/BrenoFortunato/laravel-quiz/blob/master/src/DataTables/QuestionnaireDataTable.php)
- [QuestionDataTable](https://github.com/BrenoFortunato/laravel-quiz/blob/master/src/DataTables/QuestionDataTable.php)
- [AlternativeDataTable](https://github.com/BrenoFortunato/laravel-quiz/blob/master/src/DataTables/AlternativeDataTable.php)
- [ExecutableDataTable](https://github.com/BrenoFortunato/laravel-quiz/blob/master/src/DataTables/ExecutableDataTable.php)
- [AnswerDataTable](https://github.com/BrenoFortunato/laravel-quiz/blob/master/src/DataTables/AnswerDataTable.php)

Para modificar as controllers, crie um cópia delas em **app/Http/Controllers**. Utilize os arquivos abaixo como base (não se esqueça de mudar o namespace para **App\\Http\\Controllers**):

- [QuestionnaireController](https://github.com/BrenoFortunato/laravel-quiz/blob/master/src/Controllers/QuestionnaireController.php)
- [QuestionController](https://github.com/BrenoFortunato/laravel-quiz/blob/master/src/Controllers/QuestionController.php)
- [AlternativeController](https://github.com/BrenoFortunato/laravel-quiz/blob/master/src/Controllers/AlternativeController.php)
- [ExecutableController](https://github.com/BrenoFortunato/laravel-quiz/blob/master/src/Controllers/ExecutableController.php)
- [AnswerController](https://github.com/BrenoFortunato/laravel-quiz/blob/master/src/Controllers/AnswerController.php)

Ao modificar as controllers, não se esqueça de atualizar as rotas. Por exemplo, se **QuestionnaireController** for modificada, altere o atributo **uses** do bloco sob o prefixo **questionnaires** para:

```
	Route::group(['prefix' => 'questionnaires'], function () {
		Route::get('/',                                          ['as'=>'questionnaires.index',   'uses'=>'QuestionnaireController@index']);
		Route::get('/create',                                    ['as'=>'questionnaires.create',  'uses'=>'QuestionnaireController@create']);
		Route::post('/',                                         ['as'=>'questionnaires.store',   'uses'=>'QuestionnaireController@store']);
		Route::get('/{questionnaire_id}',                        ['as'=>'questionnaires.show',    'uses'=>'QuestionnaireController@show']);
		Route::match(['put', 'patch'], '/{questionnaire_id}',    ['as'=>'questionnaires.update',  'uses'=>'QuestionnaireController@update']);
		Route::delete('/{questionnaire_id}',                     ['as'=>'questionnaires.destroy', 'uses'=>'QuestionnaireController@destroy']);
		Route::get('/{questionnaire_id}/edit',                   ['as'=>'questionnaires.edit',    'uses'=>'QuestionnaireController@edit']);
	});
```

###  Health Score

26

—

LowBetter than 43% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity2

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity61

Established project with proven stability

 Bus Factor1

Top contributor holds 54.1% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~27 days

Recently: every ~92 days

Total

15

Last Release

2058d ago

Major Versions

v1.1.2 → v2.02019-09-17

### Community

Maintainers

![](https://www.gravatar.com/avatar/3ad4b21a666ecfc7aea6c02269e596e6d9fbd672e050f3a0817ba19a2c632e3f?d=identicon)[BrenoFortunato](/maintainers/BrenoFortunato)

---

Top Contributors

[![vinicius-o-souza](https://avatars.githubusercontent.com/u/16693608?v=4)](https://github.com/vinicius-o-souza "vinicius-o-souza (20 commits)")[![BrenoFortunato](https://avatars.githubusercontent.com/u/12672996?v=4)](https://github.com/BrenoFortunato "BrenoFortunato (11 commits)")[![devfelipereis](https://avatars.githubusercontent.com/u/5348752?v=4)](https://github.com/devfelipereis "devfelipereis (5 commits)")[![brunoafn](https://avatars.githubusercontent.com/u/5333093?v=4)](https://github.com/brunoafn "brunoafn (1 commits)")

---

Tags

laravelquestionquizquestionnaire

###  Code Quality

TestsPHPUnit

Code StyleECS

### Embed Badge

![Health badge](/badges/brenofortunato-laravel-quiz/health.svg)

```
[![Health](https://phpackages.com/badges/brenofortunato-laravel-quiz/health.svg)](https://phpackages.com/packages/brenofortunato-laravel-quiz)
```

###  Alternatives

[yajra/laravel-datatables

Laravel DataTables Complete Package.

1035.8M52](/packages/yajra-laravel-datatables)[yajra/laravel-datatables-buttons

Laravel DataTables Buttons Plugin.

2629.1M54](/packages/yajra-laravel-datatables-buttons)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
