====== Yii2 Basic App with Docker ======
This How-To describes setting up a Docker stack with the Yii2 Basic App template.
The application will use a MariaDB database and activate a users management module.
All example commands below were entered in a Windows Command shell.
__**Note:**__
When you have to enter commands spanning over multiple lines, on Windows you have to enter `^` at the end of command lines instead of the backslash `\` shown below.
===== Basic Project Setup =====
* Clone the git repository:
$ git clone https://github.com/yiisoft/yii2-app-basic.git my-yii-app
$ cd my-yii-app
* Update the vendor packages:
$ docker-compose run --rm php composer update --prefer-dist
* Run the installation triggers (e.g. creating cookie validation code):
$ docker-compose run --rm php composer install
* Start the container:
$ docker-compose up -d
You can then access the application through the following URL:
[[http://127.0.0.1:8000]]
* To stop all the services:
$ docker-compose stop
===== Adding a Database =====
* Edit the file ''docker-compose.yaml'':
version: '3'
services:
php:
image: yiisoftware/yii2-php:7.3-apache
volumes:
- ~/.composer-docker/cache:/root/.composer/cache:delegated
- ./:/app:delegated
ports:
- '8000:80'
links:
- mariadb
mariadb:
image: mariadb:10.1
volumes:
- mariadb:/var/lib/mysql
environment:
TZ: "Europe/Berlin"
MYSQL_ALLOW_EMPTY_PASSWORD: "no"
MYSQL_ROOT_PASSWORD: "rootpw"
MYSQL_USER: 'testuser'
MYSQL_PASSWORD: 'testpassword'
MYSQL_DATABASE: 'testdb'
volumes:
mariadb:
* Enter the database credentials in the config file ''db.php'':
'yii\db\Connection',
'dsn' => 'mysql:host=mariadb;dbname=testdb',
'username' => 'testuser',
'password' => 'testpassword',
'charset' => 'utf8',
];
===== Adding Adminer =====
[[https://www.adminer.org/de/|Adminer]] is a handy script to manage databases, tables and data.
* Add the following code to ''docker-compose.yaml'':
services
...
adminer:
image: adminer
restart: always
ports:
- 8081:8080
Now you can open the Adminer app in [[http://127.0.0.1:8081/?server=mariadb&username=testuser&db=testdb]].
* Enter the following credentials:
Server: mariadb
Username: testuser
Password: testpassword
Database: testdb
* Then click on ''[Login]''.
===== Installing Dektrium/yii2-user =====
[[https://github.com/dektrium/yii2-user|Yii2-user]] is a flexible user registration and authentication module for Yii2.
* Install it by running:
$ docker-compose run php composer require dektrium/yii2-user
* Add the following lines to the main configuration file ''config/web.php'':
return [
...
'components' => [
...
/* Comment out to use dektrium user model:
'user' => [
...
],
*/
...
],
'modules' => [
'user' => [
'class' => 'dektrium\user\Module',
'enableFlashMessages' => false, // Don't print flash messages by the module, the app handles printing already
],
],
...
];
* Run the database migrations to install required tables (user, profile, token, social_account):
$ docker-compose run php yii migrate/up \
--migrationPath=@vendor/dektrium/yii2-user/migrations
==== Registering a First User ====
In order to register yourself as a first user, open http://127.0.0.1:8000/index.php?r=user/registration/register .
* Enter your username, email and password, then submit the form.
In the examples below, we use theadminuser as an example username.
* Check the folder ''runtime/mail/'' for a new email file (*.eml)
* Open the email .eml file
* Click the confirmation link which you will find in the email
The link looks something like this::
''http://127.0.0.1:8000/index.php?r=user%2Fregistration%2Fconfirm&id=1&code=...''
The application is opened and a confirmation message is shown:
Thank you, registration is now complete.
==== Changing Menu Links ====
Now some links regarding user functionality in the page template need to be changed, e.g.
* Login
* Logout
* Change user settings
* Edit the file ''views/layout/main.php'':
// Setup menu items
$menuItems = [];
$menuItems[] = ['label' => 'Home', 'url' => ['/site/index']];
if(!Yii::$app->user->isGuest and in_array(Yii::$app->user->identity->username, Yii::$app->params['userAdmins'])) {
$menuItems[] = ['label' => 'Users Admin', 'url' => ['/user/admin']];
}
$menuItems[] = ['label' => 'About', 'url' => ['/site/about']];
$menuItems[] = ['label' => 'Contact', 'url' => ['/site/contact']];
if (Yii::$app->user->isGuest) {
$menuItems[] = ['label' => 'Signup', 'url' => ['/user/registration/register']];
$menuItems[] = ['label' => 'Login', 'url' => ['/user/security/login']];
} else {
$menuItems[] = ['label' => 'Settings', 'url' => ['/user/settings']];
$menuItems[] = ['label' => 'Logout (' . Yii::$app->user->identity->username . ')', 'url' => ['/user/security/logout'], 'linkOptions' => ['data-method' => 'post']];
}
...
echo Nav::widget([
'options' => ['class' => 'navbar-nav navbar-right'],
// Change:
'items' => $menuItems,
]);
==== Adding an Admin User ====
The yii2-user module provides an administration view to manage users.
In order to access it, you need to configure a list of usernames who are allowed to use the view.
* Edit the file ''config/params.php'':
['theadminuser'],
];
* Edit the file ''config/web.php'':
...
'modules' => [
'user' => [
'class' => 'dektrium\user\Module',
// Admin users: see config/params.php
'admins' => $params['userAdmins'],
],
],
...
You may now open the user administration screen using the URL
http://127.0.0.1:8000/index.php?r=user/admin
You will see a GridView with already registered users. From here you can edit users or create new ones.
===== Links =====
* [[https://github.com/yiisoft/yii2-app-basic|Yii2 Basic App on GitHub]]
* [[https://www.diggin-data.de/dd-cms/post/1003/Getting+Started+with+Yii2|Getting Started with Yii2]]