Commit 508ff27c by Carsten Brandt

Merge pull request #6721 from softark/docs-guide-ja-tutorial-advanced

docs/guide-ja/tutorial-advanced-app.md - added [ci skip]
parents b57e068d c9e62378
......@@ -161,16 +161,16 @@ RESTful ウェブサービス
スペシャルトピック
------------------
* **翻訳未着手** [アドバンストアプリケーションテンプレート](tutorial-advanced-app.md)
* **翻訳未着手** [アプリケーションを一から構築する](tutorial-start-from-scratch.md)
* **翻訳未着手** [コンソールコマンド](tutorial-console.md)
* **翻訳未着手** [コアのバリデータ](tutorial-core-validators.md)
* **翻訳未着手** [国際化](tutorial-i18n.md)
* **翻訳未着手** [メール](tutorial-mailing.md)
* **翻訳未着手** [パフォーマンスチューニング](tutorial-performance-tuning.md)
* **翻訳未着手** [共有ホスト環境](tutorial-shared-hosting.md)
* **翻訳未着手** [テンプレートエンジン](tutorial-template-engines.md)
* **翻訳未着手** [サードパーティのコードを扱う](tutorial-yii-integration.md)
* [アドバンストアプリケーションテンプレート](tutorial-advanced-app.md)
* [アプリケーションを一から構築する](tutorial-start-from-scratch.md)
* [コンソールコマンド](tutorial-console.md)
* **翻訳** [コアのバリデータ](tutorial-core-validators.md)
* **翻訳** [国際化](tutorial-i18n.md)
* **翻訳** [メール](tutorial-mailing.md)
* **翻訳** [パフォーマンスチューニング](tutorial-performance-tuning.md)
* **翻訳** [共有ホスト環境](tutorial-shared-hosting.md)
* **翻訳** [テンプレートエンジン](tutorial-template-engines.md)
* **翻訳** [サードパーティのコードを扱う](tutorial-yii-integration.md)
ウィジェット
......
......@@ -226,6 +226,7 @@ data\
(以下は削除または大幅に改稿される可能性が高いので、当面、翻訳を見合わせます)
**To be cleaned up below**
Managing Fixtures
......
アドバンストアプリケーションテンプレート
========================================
> Note|注意: この節はまだ執筆中です。
このテンプレートは、チームによって開発される大規模なプロジェクトのためのもので、バックエンドはフロントエンドから分離され、アプリケーションは複数のサーバに配備されます。
また、このアプリケーションテンプレートは機能に関して少し大きく踏み込んで、不可欠なデータベースやユーザ登録、パスワード回復などをそのまま使える形で提供しています。
次の表はアドバンストとベーシックのアプリケーションテンプレートの違いを比較するものです。
| 機能 | ベーシック | アドバンスト |
|---|:---:|:---:|
| プロジェクト構造 | ✓ | ✓ |
| Site コントローラ | ✓ | ✓ |
| ユーザのログイン/ログアウト | ✓ | ✓ |
| フォーム | ✓ | ✓ |
| DB 接続 | ✓ | ✓ |
| コンソールコマンド | ✓ | ✓ |
| アセットバンドル | ✓ | ✓ |
| Codeception によるテスト | ✓ | ✓ |
| Twitter Bootstrap | ✓ | ✓ |
| フロントエンドとバックエンド | | ✓ |
| すぐに使える User モデル | | ✓ |
| ユーザの登録とパスワード回復 | | ✓ |
インストール
------------
### Composer によってインストールする
[Composer](http://getcomposer.org/) を持っていない場合は、[Yii をインストールする](start-installation.md#installing-via-composer) の節の指示に従ってインストールしてください。
Composer がインストールされていれば、次のコマンドを使ってアプリケーションをインストールすることが出来ます。
composer global require "fxp/composer-asset-plugin:1.0.0-beta4"
composer create-project --prefer-dist yiisoft/yii2-app-advanced yii-application
最初のコマンドは [composer asset plugin](https://github.com/francoispluchino/composer-asset-plugin/) をインストールします。
これにより、Composer を通じて bower と npm の依存パッケージを管理することが出来るようになります。
このコマンドは全体で一度だけ走らせれば十分です。
第二のコマンドは `yii-application` という名前のディレクトリにアドバンストアプリケーションをインストールします。
望むなら別のディレクトリ名を選ぶことも出来ます。
始めよう
--------
アプリケーションをインストールした後に、インストールされたアプリケーションの初期設定をするために、次の各ステップを実行しなければなりません。
これらは全体で一度だけやれば十分です。
1. `init` コマンドを実行して、環境として `dev` を選択します。
```
php /path/to/yii-application/init
```
非対話モードを使っても構いません。本番環境であれば、
```
php /path/to/yii-application/init --env=Production --overwrite=All
```
2. 新しいデータベースを作成し、それに従って `common/config/main-local.php``components.db` の構成情報を修正します。
3. コンソールコマンド `yii migrate` でマイグレーションを適用します。
4. ウェブサーバのドキュメントルートを設定します。
- フロントエンドのパスは `/path/to/yii-application/frontend/web/`、URL は `http://frontend/` を使用
- バックエンドのパスは `/path/to/yii-application/backend/web/`、URL は `http://backend/` を使用
アプリケーションにログインするためには、最初にユーザ登録をする必要があります。
メールアドレス、ユーザ名、パスワードは何でも構いません。
そうすれば、同じメールアドレスとパスワードを使って何時でもアプリケーションにログインすることが出来ます。
ディレクトリ構造
----------------
ルートディレクトリは次のサブディレクトリを含みます。
- `backend` - バックエンドのウェブアプリケーション
- `common` - 全てのアプリケーションに共通なファイル
- `console` - コンソールアプリケーション
- `environments` - 環境設定
- `frontend` - フロントエンドのアプリケーション
ルートディレクトリは次の一連のファイルを含みます。
- `.gitignore` - git バージョン管理システムによって無視されるディレクトリの一覧を含みます。
ソースコードのレポジトリに決して入れたくないものがあれば、それをこれに追加してください。
- `composer.json` - Composer の構成。下の「Composer を構成する」で説明します。
- `init` - 初期化スクリプト。下の「構成情報と環境」で説明します。
- `init.bat` - 同上 (Windows 用)。
- `LICENSE.md` - ライセンス情報。プロジェクトのライセンスを置きます。特にオープンソースにする場合は。
- `README.md` - テンプレートのインストールに関する基本的な情報。
あなたのプロジェクトとそのインストールに関する情報に置き換えることを検討してください。
- `requirements.php` - Yii 必要条件チェッカ。
- `yii` - コンソールアプリケーションのブートストラップスクリプト。
- `yii.bat` - 同上 (Windows 用)。
事前定義されたパスエイリアス
----------------------------
- `@yii` - フレームワークのディレクトリ。
- `@app` - 現在走っているアプリケーションのベースパス。
- `@common` - 共通ディレクトリ。
- `@frontend` - フロントエンドウェブアプリケーションのディレクトリ。
- `@backend` - バックエンドウェブアプリケーションのディレクトリ。
- `@console` - コンソールアプリケーションのディレクトリ。
- `@runtime` - 現在走っているウェブアプリケーションのランタイムディレクトリ。
- `@vendor` - Composer の ベンダーディレクトリ。
- `@bower` - [bower パッケージ](http://bower.io/) を含むベンダーディレクトリ。
- `@npm` - [npm パッケージ](https://www.npmjs.org/) を含むベンダーディレクトリ。
- `@web` - 現在走っているウェブアプリケーションのベース URL。
- `@webroot` - 現在走っているウェブアプリケーションのウェブルートディレクトリ。
アドバンストアプリケーションのディレクトリ構造特有のエイリアス (`@common``@frontend``@backend``@console`) は `common/config/bootstrap.php` で定義されています。
アプリケーション
----------------
アドバンストテンプレートには三つのアプリケーションがあります。
すなわち、フロントエンド、バックエンド、そして、コンソールです。
フロントエンドは典型的にはエンドユーザに提示されるもので、プロジェクトの本体です。
バックエンドは管理パネルや、分析などの機能です。
コンソールは典型的にはクロンジョブや低レベルのサーバ管理に使用されます。
コンソールは、また、アプリケーションの配置の際にも使われ、マイグレーションやアセットを処理します。
さらに、二つ以上のアプリケーションから使われるファイルを含む `common` ディレクトリがあります。
例えば、`User` モデルがそうです。
フロントエンドとバックエンドは両方ともウェブアプリケーションであり、ともに `web` ディレクトリを含んでいます。
これがウェブサーバのウェブルートとすべきディレクトリです。
各アプリケーションはそれ自身の名前空間と、その名前に対応するエイリアスをもっています。
同じことは `common` ディレクトリにも当てはまります。
構成情報と環境
--------------
構成情報に対する典型的なアプローチには、複数の問題があります。
- チームの各メンバーは、自分自身の構成オプションを持っています。
そのような構成をコミットすると、他のメンバーに影響を与えます。
- 本番のデータベースのパスワードと API キーは、レポジトリに入れるべきではありません。
- 複数サーバの環境があります。すなわち、開発、テスト、本番などです。各サーバはそれ自身の構成情報を持たなければなりません。
- 全ての構成オプションを各ケースに対して定義することは反復の多い作業であり、保守するのに時間を取りすぎます。
これらの問題を解決するために、Yii は環境という単純な概念を導入しています。
それぞれの環境は `environments` ディレクトリ配下の一連のファイルとして表現されます。
`init` コマンドが環境を切り替えるのに使用されます。
`init` コマンドが実際にやっていることは、環境ディレクトリから、全てのアプリケーションがあるルートディレクトリへと、すべてをごっそりとコピーすることです。
典型的には、環境ディレクトリは `index.php` のようなアプリケーションブートストラップファイルや、`-local.php` という接尾辞を持つ構成情報ファイルを含んでいます。
これらは `.gitignore` に追加されて、ソースコードレポジトリには決して追加されないようになっています。
重複を避けるために、構成情報はお互いを上書きします。
例えば、フロントエンドは次の順序で構成情報を読み取ります。
- `common/config/main.php`
- `common/config/main-local.php`
- `frontend/config/main.php`
- `frontend/config/main-local.php`
パラメータは次の順序で読まれます。
- `common/config/params.php`
- `common/config/params-local.php`
- `frontend/config/params.php`
- `frontend/config/params-local.php`
後の構成情報ファイルが先のものを上書きするわけです。
全体の枠組みはこのようになります。
![アドバンストアプリケーションの構成情報](images/advanced-app-configs.png)
Composer を構成する
-------------------
アプリケーションテンプレートがインストールされた後に、ルートディレクトリにあるデフォルトの `composer.json` を修正するのは良い考えです。
```json
{
"name": "yiisoft/yii2-app-advanced",
"description": "Yii 2 Advanced Application Template",
"keywords": ["yii2", "framework", "advanced", "application template"],
"homepage": "http://www.yiiframework.com/",
"type": "project",
"license": "BSD-3-Clause",
"support": {
"issues": "https://github.com/yiisoft/yii2/issues?state=open",
"forum": "http://www.yiiframework.com/forum/",
"wiki": "http://www.yiiframework.com/wiki/",
"irc": "irc://irc.freenode.net/yii",
"source": "https://github.com/yiisoft/yii2"
},
"minimum-stability": "dev",
"require": {
"php": ">=5.4.0",
"yiisoft/yii2": "*",
"yiisoft/yii2-bootstrap": "*",
"yiisoft/yii2-swiftmailer": "*"
},
"require-dev": {
"yiisoft/yii2-codeception": "*",
"yiisoft/yii2-debug": "*",
"yiisoft/yii2-gii": "*",
"yiisoft/yii2-faker": "*"
},
"config": {
"process-timeout": 1800
},
"extra": {
"asset-installer-paths": {
"npm-asset-library": "vendor/npm",
"bower-asset-library": "vendor/bower"
}
}
}
```
最初に、基本的な情報を更新しましょう。
`name``description``keywords``homepage` および `support` をあなたのプロジェクトに会うように変更します。
次に興味深い部分です。
あなたは、あなたのアプリケーションが必要とするパッケージを `require` セクションに追加することが出来ます。
追加のパッケージは全て [packagist.org](https://packagist.org/) から取ってくることが出来ます。ウェブサイトを閲覧して、役に立つコードを探してください。
`composer.json` を修正した後、`composer update --prefer-dist` を実行し、パッケージがダウンロードされインストールされるのを待ちます。
後はただ使用するだけです。クラスのオートロードは自動的に処理されます。
バックエンドからフロントエンドにリンクを張る
--------------------------------------------
バックエンドアプリケーションからフロントエンドアプリケーションにリンクを張らなければならないことがよくあります。
フロントエンドアプリケーションはそれ自身の URL マネージャ規則を持っている場合がありますので、それをバックエンドアプリケーションのために別の名前で複製する必要があります。
```php
return [
'components' => [
'urlManager' => [
// ここに通常のバックエンドの URL マネージャの構成
],
'urlManagerFrontend' => [
// ここにフロントエンドの URL マネージャの構成
],
],
];
```
このようにすると、フロントエンドを指す URL を次のようにして取得することが出来ます。
```php
echo Yii::$app->urlManagerFrontend->createUrl(...);
```
コンソールアプリケーション
==========================
> Note|注意: この節はまだ執筆中です。
Yii はフル機能のコンソールアプリケーションをサポートしています。
コンソールアプリケーションの構造は Yii のウェブアプリケーションのそれと非常に良く似ています。
コンソールアプリケーションは一つまたは複数の [[yii\console\Controller]] から構成されます。
コントローラはコンソール環境では通常「コマンド」と呼ばれます。
また、各コントローラは、ウェブのコントローラと全く同じように、一つまたは複数のアクションを持つことが出来ます。
使用方法 <a name="usage"></a>
--------
コンソールのコントローラアクションは次の構文を使って実行します。
```
yii <route> [--option1=value1 --option2=value2 ... argument1 argument2 ...]
```
例えば、[[yii\console\controllers\MigrateController::$migrationTable|MigrateController::$migrationTable]] を指定して [[yii\console\controllers\MigrateController::actionCreate()|MigrateController::actionCreate()]] をコマンドラインから呼び出すためには、次のようにします。
```
yii migrate/create --migrationTable=my_migration
```
上記において `yii` はコンソールアプリケーションのエントリスクリプトです。
これについては下で説明します。
> **注意**: コンソールで `*` を使う場合は、`"*"` として引用符号で囲むことを忘れないでください。
> これは、`*` をカレントディレクトリの全てのファイル名に置き換えられるシェルのグロブとして実行してしまうことを避けるためです。
エントリスクリプト <a name="entry-script"></a>
------------------
コンソールアプリケーションのエントリスクリプトは、ウェブアプリケーションで使用されるブートストラップファイル `index.php` に相当するものです。
コンソールのエントリスクリプトは通常は `yii` と呼ばれるもので、アプリケーションのルートディレクトリに配置されています。
それは次のようなコードを含んでいます。
```php
#!/usr/bin/env php
<?php
/**
* Yii console bootstrap file.
*/
defined('YII_DEBUG') or define('YII_DEBUG', true);
// fcgi では、デフォルトでは、STDIN と STDOUT が定義されていない
defined('STDIN') or define('STDIN', fopen('php://stdin', 'r'));
defined('STDOUT') or define('STDOUT', fopen('php://stdout', 'w'));
require(__DIR__ . '/vendor/autoload.php');
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
$config = require(__DIR__ . '/config/console.php');
$application = new yii\console\Application($config);
$exitCode = $application->run();
exit($exitCode);
```
このスクリプトはアプリケーションの一部として生成されるものです。
あなたの必要を満たすように、自由に編集して構いません。
エラー発生時にスタックトレースを見たくない、または、全体のパフォーマンスを上げたい、という場合は、`YII_DEBUG` 定数を `false` に設定することが出来ます。
ベーシックアプリケーションテンプレートでも、アドバンストアプリケーションテンプレートでも、コンソールアプリケーションのエントリスクリプトは、開発者に優しい環境を提供するために、デフォルトでデバッグを有効にしています。
構成情報 <a name="configuration"></a>
--------
上記のコードで見るように、コンソールアプリケーションは、`console.php` という名前のそれ自身の構成情報ファイルを使用します。
このファイルの中で、さまざまな [アプリケーションコンポーネント](structure-application-components.md)、取り分け、コンソールアプリケーションのためのプロパティを構成しなければなりません。
ウェブアプリケーションとコンソールアプリケーションが構成情報のパラメータと値を数多く共有する場合は、共通の部分を独立したファイルに移動して、そのファイルを両方のアプリケーション (ウェブとコンソール) の構成情報にインクルードすることを検討しても良いでしょう。
その例を「アドバンスト」アプリケーションテンプレートの中で見ることが出来ます。
> Tip|ヒント: 場合によっては、エントリスクリプトで指定されているのとは異なるアプリケーション構成情報を使ってコンソールコマンドを実行したいことがあります。
> 例えば、`yii migrate` コマンドを使ってテストのデータベースをアップグレードするとき、データベースが個々のテストスイートの中で構成されているような場合です。
> 構成情報を動的に変更するためには、コマンドを実行するときに `appconfig` オプションを使ってカスタムの構成情報ファイルを指定するだけで大丈夫です。
>
> ```
> yii <route> --appconfig=path/to/config.php ...
> ```
あなた自身のコンソールコマンドを作成する <a name="create-command"></a>
----------------------------------------
### コンソールのコントローラとアクション
コンソールコマンドは、[[yii\console\Controller]] を拡張するコントローラクラスとして定義することが出来ます。
コントローラクラスの中で、コントローラのサブコマンドに対応する一つまたは複数のアクションを定義します。
各アクションの中で、特定のサブコマンドのために、適切なタスクを実装するコードを書きます。
コマンドを実行するときは、コントローラのアクションに対するルートを指定する必要があります。
例えば、ルート `migrate/create` は、[[yii\console\controllers\MigrateController::actionCreate()|MigrateController::actionCreate()]] アクションメソッドに対応するサブコマンドを呼び出します。
実行時に提供されたルートにアクション ID が含まれない場合は、(ウェブのコントローラの場合と同じように) デフォルトのアクションが実行されます。
### オプション
[[yii\console\Controller::options()]] メソッドをオーバーライドすることによって、コンソールコマンド (controller/actionID) で利用できるオプションを指定することが出来ます。
このメソッドはコントローラクラスのパブリックなプロパティのリストを返さなければなりません。
コマンドを実行するときは、`--OptionName=OptionValue` という構文を使ってオプションの値を指定することが出来ます。これはコントローラクラスの `OptionName` プロパティに `OptionValue` を割り当てるものです。
オプションのデフォルト値が配列型である場合、実行時にこのオプションをセットすると、オプションの値は、入力文字列をカンマで分離することによって、配列に変換されます。
### 引数
オプションに加えてに、コマンドは引数を取ることも出来ます。
引数は、リクエストされたサブコマンドに対応するアクションメソッドへのパラメータとして渡されます。
最初の引数は最初のパラメータに対応し、二番目の引数は二番目のパラメータに対応し、以下同様です。
コマンドが呼び出されたときに十分な数の引数が提供されなかったときは、対応するパラメータは、定義されていれば、宣言されているデフォルト値をとります。
デフォルト値が設定されておらず、実行時に値が提供されなかった場合は、コマンドはエラーで終了します。
`array` タイプヒントを使って、引数が配列として扱われるべきことを示すことが出来ます。
配列は入力文字列をカンマで分割することによって生成されます。
次に引数を宣言する方法を示す例を挙げます。
```php
class ExampleController extends \yii\console\Controller
{
// コマンド "yii example/create test" は "actionCreate('test')" を呼び出す
public function actionCreate($name) { ... }
// コマンド "yii example/index city" は "actionIndex('city', 'name')" を呼び出す
// コマンド "yii example/index city id" は call "actionIndex('city', 'id')" を呼び出す
public function actionIndex($category, $order = 'name') { ... }
// コマンド "yii example/add test" は "actionAdd(['test'])" を呼び出す
// コマンド "yii example/add test1,test2" は "actionAdd(['test1', 'test2'])" を呼び出す
public function actionAdd(array $name) { ... }
}
```
### 終了コード
終了コードを使うことはコンソールアプリケーション開発のベストプラクティスです。
コマンドは何も問題が無かったことを示すために `0` を返すのが慣例です。
コマンドが 1 以上の値を返したときは、何かエラーを示唆するものとみなされます。
返される数値がエラーコードであり、それによってエラーに関する詳細を見出すことが出来る場合もあります。
例えば、`1` は一般的な未知のエラーを示すものとし、`2` 以上の全てのコードは特定のエラー、例えば、入力エラー、ファイルが見つからない、等々を示すものとすることが出来ます。
コンソールコマンドに終了コードを返させるためには、単にコントローラのアクションメソッドで整数を返すようにします。
```php
public function actionIndex()
{
if (/* 何らかの問題が発生 */) {
echo "問題が生じました!\n";
return 1;
}
// 何かをする
return 0;
}
```
いくつか使用できる事前定義された定数があります。
- `Controller::EXIT_CODE_NORMAL` - 値は `0`
- `Controller::EXIT_CODE_ERROR` - 値は `1`
もっと多くのエラーコードの種類がある場合は、コントローラで意味のある定数を定義するのが良いプラクティスです。
### 書式設定と色
Yii のコンソールコマンドは出力の書式設定をサポートしています。
これは、コマンドを走らせている端末がサポートしていない場合は、自動的に書式設定の無い出力にグレードダウンされます。
書式設定された文字列を出力することは簡単です。
ボールドのテキストを出力するには、次のようにします。
```php
$this->stdout("Hello?\n", Console::BOLD);
```
複数のスタイルを動的に結合して文字列を構成する必要がある場合は、`ansiFormat` を使うほうが良いでしょう。
```php
$name = $this->ansiFormat('Alex', Console::FG_YELLOW);
echo "Hello, my name is $name.";
```
あなた自身のアプリケーション構造を作成する
==========================================
> Note|注意: この節はまだ執筆中です。
[ベーシック](https://github.com/yiisoft/yii2/tree/master/apps/basic)[アドバンスト](https://github.com/yiisoft/yii2/tree/master/apps/advanced) のアプリケーションテンプレートは、あなたの要求をほとんどカバーする優れたものですが、あなたのプロジェクトを開始するためのあなた自身のテンプレートを作成したいこともあるでしょう。
Yii におけるアプリケーションテンプレートは、`composer.json` ファイルを含み、Composer パッケージとして登録されたレポジトリであるに過ぎません。
どのようなレポジトリでも、Composer パッケージとして特定し、`create-project` Composer コマンドによってインストール可能なものとすることが可能です。
テンプレート全体を最初から構築するのは少々大変ですので、内蔵のテンプレートの一つを基礎として使うのが良いでしょう。
ここでは、ベーシックテンプレートを使いましょう。
ベーシックテンプレートをクローンする
------------------------------------
最初のステップは、ベーシック Yii テンプレートの Git レポジトリをクローンすることです。
```bash
git clone git@github.com:yiisoft/yii2-app-basic.git
```
そして、レポジトリがあなたのコンピュータにダウンロードされるのを待ちます。
テンプレートに加えた変更はプッシュバックされませんので、ダウンロードしたものから `.git` ディレクトリとその中身を全て削除して構いません。
ファイルを修正する
------------------
次に、あなたのテンプレートに合うように `composer.json` を修正します。
`name``description``keywords``homepage``license` および `support` の値を、あなたの新しいテンプレートを説明するものに変更します。
また、`require``require-dev``suggest` や、その他のオプションも、あなたのテンプレートの要求に合うように調整します。
> Note|注意: `composer.json` ファイルで、`extra` の下の `writable` パラメータを使って、アプリケーションがテンプレートを使って作成された後に設定すべきファイル単位のアクセス権限を指定してください。
次に、あなたがデフォルトとしたいと思うように、アプリケーションの構造と内容を実際に修正します。
最後に、あなたのテンプレートに適用できるように、README ファイルを更新します。
パッケージを作る
----------------
テンプレートが定義できたら、それを基に Git レポジトリを作成して、ファイルをそこにプッシュします。
あなたのテンプレートをオープンソース化するつもりなら、レポジトリをホストするのには [Github](http://github.com) が最適の場所です。
テンプレートを共同作業に使わないつもりであれば、どんな Git レポジトリサイトでも構いません。
次に、Composer のためにパッケージを登録する必要があります。
パブリックなテンプレートであれば、パッケージは [Packagist](https://packagist.org/) に登録すべきです。
プライベートなテンプレートは、パッケージの登録が少々トリッキーです。
その説明については [Composer ドキュメント](https://getcomposer.org/doc/05-repositories.md#hosting-your-own) を参照してください。
テンプレートを使う
------------------
Yii の新しいアプリケーションテンプレートを作成するのに必要なことは以上です。
これで、あなたのテンプレートを使ってプロジェクトを作成することが出来ます。
```
composer global require "fxp/composer-asset-plugin:1.0.0-beta4"
composer create-project --prefer-dist --stability=dev mysoft/yii2-app-coolone new-project
```
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment