Changes
Title
unchanged
Yii3 - How to start
Category
unchanged
Tutorials
Yii version
unchanged
3.0
Tags
unchanged
Content
changed
[...]
# Intro
In Yii3 it is not as easy to start as it was with Yii2. You have to install and configure basic things on your own. Yii3 uses the modern approach based on independent packages and dependency injection, but it makes it harder for newcomers. I am here to show all how I did it.
> All the code is available in my new [GitHub repository](https://github.com/rackycz/yii3api). I will be using it as a boiler-plate for my future projects so it should be always up -to
-date and working.
Instead of installing local WAMP- or XAMPP-server I will be using Docker. Do not forget about a modern IDE like PhpStorm, which comes bun
dled with all you will ever need.[...]
Check [this YouTube video](https://www.youtube.com/watch?v=TqMXzEK0nsA) for explanation
## Construct vs Invoke
It may be confusing that some classes contain bothinvoke()
The `__invoke()` public method is called when you call the **instance** as a method
s.
Note that "property promotion" should be only used in `__construct()`.
Magic method `(Therefore the constructor was already executed)
```php
$obj = new MyObj(); // Now the __construct() is executed.
$obj(); // Now the __invoke()
` is
only used if you create an instance and thenexecuted (The instance is needed!)
```
I never use
d it
as a function. Example:
```php
$obj, but prepared a following example that shows when invoking can be applied:
```php
class MyUpper
{
public function __invoke($a) { return $this->go($a); }
public function go($a) { return strtoupper($a); }
}
$instance = new My
ObjUpper();
$
obj(); // Now the __invoke() is executed
```
To be honest, I still do not fully understand the real purpose of this situation.array = ['a', 'B', 1, '1'];
// __invoke is used:
var_dump($instance($array[0]));
var_dump(array_map($instance, $array));
// These do the same without invoking:
var_dump(array_map('strtoupper', $array));
var_dump(array_map([$instance, 'go'], $array));
var_dump(array_map(function($a) use ($instance) { return $instance->go($a); }, ['a','B',1,'1']));
```
## Hash annotations for class attributes
PHP 8 introduces annotations like this (not only for class attributes):
- `#[Column(type: 'primary')]`
- `#[Column(type: 'string(255)', nullable: true)]`
- `#[Entity(repository: UserRepository::class)]`
- `#[ManyToMany(target: Role::class, through: UserRole::class)]`
They should replace the original DocBlock annotatinos and provide more new functionalities.
Learn what they mean and how they are used by Yii3. To me this is a brand new topic as well.
# Yii3 - How to start[...]
## Running the demo application
You may be surprised that docker-compose.yml is missing in the root. Instead the "make up" and "make down" commands are prepared.
If you run both basic commands as mentioned in the documentation:[...]
If you want to modify the data that was returned by the endpoint, just open the action-class `src/Api/IndexAction.php` and add one more element to the returned array.
> You may be missing 'docker compose stop' or 'make stop', because 'make down' removes your containers and drops your DB. In that case you can add it to the Makefile in the root (see below). If you then type 'make help' you will see the new command.
```sh
ifeq ($(PRIMARY_GOAL),stop)
stop: ## Stop the dev environment
$(DOCKER_COMPOSE_DEV) stop
endif
```
## Adding DB into your project
Your project now does not contain any DB. Let's add MariaDB and Adminer (DB browser) into file docker/dev/compose.yml:[...]
composer require yiisoft/db-mysql
composer require yiisoft/cache
composer require yiisoft/db-migration --dev
```
To run composer (or any other command inside your dockerized yii3 application) you have 4 options:
- Make:
The best solution is to prepend the composer commands with "make".[...]