mirror of
https://github.com/yiisoft/yii2.git
synced 2025-08-18 01:07:37 +08:00
Merge pull request #8176 from yiijan/docs-ja-0423
docs/guide-ja updats [ci skip]
This commit is contained in:
@ -213,7 +213,7 @@ $data = $cache->get($key);
|
||||
|
||||
クエリキャッシュは、データキャッシュ上に構築された特別なキャッシュ機能で、データベースのクエリ結果をキャッシュするために提供されています。
|
||||
|
||||
クエリキャッシュは [[yii\db\Connection|データベース接続]] と有効な `cache` アプリケーションコンポーネントを必要とします。
|
||||
クエリキャッシュは [[yii\db\Connection|データベース接続]] と有効な `cache` [アプリケーションコンポーネント](#cache-components) を必要とします。
|
||||
`$db` を [[yii\db\Connection]] のインスタンスと仮定した場合、クエリキャッシュの基本的な使い方は以下のようになります:
|
||||
|
||||
```php
|
||||
|
@ -1253,3 +1253,72 @@ $customers = Customer::find()->with([
|
||||
> Info|情報: Yii 1.1 には、*スコープ* と呼ばれる概念がありました。
|
||||
Yii 2.0 では、スコープはもはや直接にはサポートされません。
|
||||
同じ目的を達するためには、カスタマイズされたクエリクラスとクエリメソッドを使わなければなりません。
|
||||
|
||||
|
||||
## 追加のフィールドを選択する
|
||||
|
||||
アクティブレコードのインスタンスにクエリ結果からデータが投入されるときは、受け取ったデータセットのカラムの値が対応する属性に入れられます。
|
||||
|
||||
クエリ結果から追加のカラムや値を取得して、アクティブレコードの内部に格納することが出来ます。
|
||||
例えば、ホテルの客室の情報を含む 'room' という名前のテーブルがあるとしましょう。
|
||||
そして、全ての客室のデータは 'length' (長さ)、'width' (幅)、'height' (高さ) というフィールドを使って、部屋の幾何学的なサイズに関する情報を格納しているとします。
|
||||
空いている全ての部屋の一覧を容積の降順で取得する必要がある場合を考えて見てください。
|
||||
レコードをその値で並べ替える必要があるので、PHP を使って容積を計算することは出来ません。
|
||||
しかし、同時に、一覧には 'volume' (容積) も表示したいでしょう。
|
||||
目的を達するためには、'Room' アクティブレコードクラスにおいて追加のフィールドを宣言し、'volume' の値を格納する必要があります。
|
||||
|
||||
```php
|
||||
class Room extends \yii\db\ActiveRecord
|
||||
{
|
||||
public $volume;
|
||||
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
そして、部屋の容積を計算して並べ替えを実行するクエリを構築しなければなりません。
|
||||
|
||||
```php
|
||||
$rooms = Room::find()
|
||||
->select([
|
||||
'{{room}}.*', // 全てのカラムを選択
|
||||
'([[length]] * [[width]].* [[height]]) AS volume', // 容積を計算
|
||||
])
|
||||
->orderBy('volume DESC') // 並べ替えを適用
|
||||
->all();
|
||||
|
||||
foreach ($rooms as $room) {
|
||||
echo $room->volume; // SQL によって計算された値を含んでいる
|
||||
}
|
||||
```
|
||||
|
||||
追加のフィールドが選択できることは、集計クエリに対して特に有効に機能します。
|
||||
注文の数とともに顧客の一覧を表示する必要がある場合を想定してください。
|
||||
まず初めに、`Customer` クラスの中で、'orders' リレーションと、注文数を格納するための追加のフィールドを宣言しなければなりません。
|
||||
|
||||
```php
|
||||
class Customer extends \yii\db\ActiveRecord
|
||||
{
|
||||
public $ordersCount;
|
||||
|
||||
// ...
|
||||
|
||||
public function getOrders()
|
||||
{
|
||||
return $this->hasMany(Order::className(), ['customer_id' => 'id']);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
そして、order を結合して注文数を計算するクエリを構築することが出来ます。
|
||||
|
||||
```php
|
||||
$customers = Customer::find()
|
||||
->select([
|
||||
'{{customer}}.*', // 顧客の全てのフィールドを選択
|
||||
'COUNT({{order}}.id) AS ordersCount' // 注文数を計算
|
||||
])
|
||||
->joinWith('orders') // テーブルの結合を保証する
|
||||
->groupBy('{{customer}}.id') // 結果をグループ化して、集計関数の動作を保証する
|
||||
->all();
|
||||
```
|
||||
|
@ -30,6 +30,9 @@ Yii は一連のマイグレーションコマンドラインツールを提供
|
||||
この節では、これらのツールを使用して、さまざまなタスクをどうやって達成するかを詳細に説明します。
|
||||
各ツールの使用方法は、ヘルプコマンド `yii help migrate` によっても知ることが出来ます。
|
||||
|
||||
> Note|注意: マイグレーションはデータベーススキーマに影響を及ぼすだけでなく、既存のデータを新しいスキーマに合うように修正したり、RBAC 階層を作成したり、キャッシュをクリーンアップしたりすることも出来ます。
|
||||
|
||||
|
||||
## マイグレーションを作成する <span id="creating-migrations"></span>
|
||||
|
||||
新しいマイグレーションを作成するためには、次のコマンドを実行します。
|
||||
|
@ -494,7 +494,7 @@ $query1->union($query2);
|
||||
これらのメソッドでは、`$q` パラメータは必須であり、カラム名または DB 式とすることが出来る。
|
||||
|
||||
上記のメソッドの全ては、オプションで、DB クエリの実行に使用されるべき [[yii\db\Connection|DB 接続]] を表す `$db` パラメータを取ることが出来ます。
|
||||
このパラメータを省略した場合は、DB 接続として `db` アプリケーションコンポーネントが使用されます。
|
||||
このパラメータを省略した場合は、DB 接続として `db` [アプリケーションコンポーネント](structure-application-components.md) が使用されます。
|
||||
次に `count()` クエリメソッドを使う例をもう一つ挙げます。
|
||||
|
||||
```php
|
||||
|
@ -1,150 +1,240 @@
|
||||
データプロバイダ
|
||||
================
|
||||
|
||||
> Note|注意: この節はまだ執筆中です。
|
||||
[ページネーション](output-pagination.md) と [並べ替え](output-sorting.md) の節において、エンドユーザが特定のページのデータを選んで表示し、いずれかのカラムによってデータを並べ替えることが出来るようにする方法を説明しました。
|
||||
データのページネーションと並べ替えは非常によくあるタスクですから、Yii はこれをカプセル化した一連の *データプロバイダ* を提供しています。
|
||||
|
||||
データプロバイダは、 [[yii\data\DataProviderInterface]] によってデータセットを抽象化し、ページネーションと並べ替えを処理します。
|
||||
[グリッドやリストなどのデータウィジェット](output-data-widgets.md) で使用することが出来ます。
|
||||
データプロバイダは [[yii\data\DataProviderInterface]] を実装するクラスであり、主として、ページ分割され並べ替えられたデータの取得をサポートするものです。
|
||||
通常は、[データウィジェット](output-data-widgets.md) と共に使用して、エンドユーザが対話的にデータのページネーションと並べ替えをすることが出来るようにします。
|
||||
|
||||
Yii は三つのデータプロバイダを内蔵しています。すなわち、[[yii\data\ActiveDataProvider]]、[[yii\data\ArrayDataProvider]] そして [[yii\data\SqlDataProvider]] です。
|
||||
Yii のリリースには次のデータプロバイダのクラスが含まれています。
|
||||
|
||||
アクティブデータプロバイダ
|
||||
--------------------------
|
||||
* [[yii\data\ActiveDataProvider]]: [[yii\db\Query]] または [[yii\db\ActiveQuery]] を使ってデータベースからデータを取得して、配列または [アクティブレコード](db-active-record.md) インスタンスの形式でデータを返します。
|
||||
* [[yii\data\SqlDataProvider]]: SQL 文を実行して、データベースのデータを配列として返します。
|
||||
* [[yii\data\ArrayDataProvider]]: 大きな配列を受け取り、ページネーションと並べ替えの指定に基づいて、一部分を切り出して返します。
|
||||
|
||||
`ActiveDataProvider` は [[yii\db\Query]] および [[yii\db\ActiveQuery]] を使って DB クエリを実行して、データを提供します。
|
||||
|
||||
次のコードは、これを使って、ActiveRecord のインスタンスを提供する例です。
|
||||
これら全てのデータプロバイダの使用方法は、次の共通のパターンを持っています。
|
||||
|
||||
```php
|
||||
$provider = new ActiveDataProvider([
|
||||
'query' => Post::find(),
|
||||
'pagination' => [
|
||||
'pageSize' => 20,
|
||||
],
|
||||
// ページネーションと並べ替えのプロパティを構成してデータプロバイダを作成する
|
||||
$provider = new XyzDataProvider([
|
||||
'pagination' => [...],
|
||||
'sort' => [...],
|
||||
]);
|
||||
|
||||
// 現在のページの投稿を取得する
|
||||
$posts = $provider->getModels();
|
||||
// ページ分割されて並べ替えられたデータを取得する
|
||||
$models = $provider->getModels();
|
||||
|
||||
// 現在のページにあるデータアイテムの数を取得する
|
||||
$count = $provider->getCount();
|
||||
|
||||
// 全ページ分のデータアイテムの総数を取得する
|
||||
$totalCount = $provider->getTotalCount();
|
||||
```
|
||||
|
||||
そして次の例は、ActiveRecord なしで ActiveDataProvider を使う方法を示すものです。
|
||||
データプロバイダのページネーションと並べ替えの振る舞いを指定するためには、その [[yii\data\BaseDataProvider::pagination|pagination]] と [[yii\data\BaseDataProvider::sort|sort]] のプロパティを構成します。
|
||||
二つのプロパティは、それぞれ、[[yii\data\Pagination]] と [[yii\data\Sort]] の構成情報に対応します。
|
||||
これらを false に設定して、ページネーションや並べ替えの機能を無効にすることも出来ます。
|
||||
|
||||
[データウィジェット](output-data-widgets.md)、例えば [[yii\grid\GridView]] は、`dataProvider` という名前のプロパティを持っており、これにデータプロバイダのインスタンスを受け取らせて、それが提供するデータを表示させることが出来ます。
|
||||
例えば、
|
||||
|
||||
```php
|
||||
$query = new Query();
|
||||
$provider = new ActiveDataProvider([
|
||||
'query' => $query->from('post'),
|
||||
'sort' => [
|
||||
// デフォルトのソートを name ASC, created_at DESC とする
|
||||
'defaultOrder' => [
|
||||
'name' => SORT_ASC,
|
||||
'created_at' => SORT_DESC
|
||||
]
|
||||
],
|
||||
'pagination' => [
|
||||
'pageSize' => 20,
|
||||
],
|
||||
echo yii\grid\GridView::widget([
|
||||
'dataProvider' => $dataProvider,
|
||||
]);
|
||||
|
||||
// 現在のページの投稿を取得する
|
||||
$posts = $provider->getModels();
|
||||
```
|
||||
|
||||
配列データプロバイダ
|
||||
--------------------
|
||||
これらのデータプロバイダの主たる相異点は、データソースがどのように指定されるかという点にあります。
|
||||
次に続く項において、各データプロバイダの詳細な使用方法を説明します。
|
||||
|
||||
ArrayDataProvider はデータの配列に基づいたデータプロバイダを実装するものです。
|
||||
|
||||
[[yii\data\ArrayDataProvider::$allModels]] プロパティが、並べ替えやページネーションの対象となるデータの全てのモデルを含みます。
|
||||
ArrayDataProvider は、並べ替えとページネーションを実行した後に、データを提供します。
|
||||
[[yii\data\ArrayDataProvider::$sort]] および [[yii\data\ArrayDataProvider::$pagination]] のプロパティを構成して、並べ替えとページネーションの動作をカスタマイズすることが出来ます。
|
||||
## アクティブデータプロバイダ <span id="active-data-provider"></span>
|
||||
|
||||
[[yii\data\ArrayDataProvider::$allModels]] 配列の要素は、オブジェクト (例えば、モデルのオブジェクト) であるか、連想配列 (例えば、DAO のクエリ結果) であるかの、どちらかです。
|
||||
[[yii\data\ArrayDataProvider::$key]] プロパティには、必ず、データレコードを一意的に特定出来るフィールドの名前をセットするか、そのようなフィールドがない場合は `false` をセットするかしなければなりません。
|
||||
|
||||
`ActiveDataProvider` と比較すると、`ArrayDataProvider` は、[[yii\data\ArrayDataProvider::$allModels]] を準備して持たなければならないため、効率が良くありません。
|
||||
|
||||
`ArrayDataProvider` は次のようにして使用することが出来ます。
|
||||
[[yii\data\ActiveDataProvider]] を使用するためには、その [[yii\data\ActiveDataProvider::query|query]] プロパティを構成しなければなりません。
|
||||
これは、[[yii\db\Query]] または [[yii\db\ActiveQuery]] のオブジェクトを取ることが出来ます。
|
||||
前者であれば、返されるデータは配列になります。
|
||||
後者であれば、返されるデータは配列または [アクティブレコード](db-active-record.md) インスタンスとすることが出来ます。
|
||||
例えば、
|
||||
|
||||
```php
|
||||
$query = new Query();
|
||||
$provider = new ArrayDataProvider([
|
||||
'allModels' => $query->from('post')->all(),
|
||||
'sort' => [
|
||||
'attributes' => ['id', 'username', 'email'],
|
||||
],
|
||||
use yii\data\ActiveDataProvider;
|
||||
|
||||
$query = Post::find()->where(['status' => 1]);
|
||||
|
||||
$provider = new ActiveDataProvider([
|
||||
'query' => $query,
|
||||
'pagination' => [
|
||||
'pageSize' => 10,
|
||||
],
|
||||
'sort' => [
|
||||
'defaultOrder' => [
|
||||
'created_at' => SORT_DESC,
|
||||
'title' => SORT_ASC,
|
||||
]
|
||||
],
|
||||
]);
|
||||
// 現在のページの投稿を取得する
|
||||
|
||||
// Post オブジェクトの配列を返す
|
||||
$posts = $provider->getModels();
|
||||
```
|
||||
|
||||
> Note|注意: 並べ替えの機能を使いたいときは、どのカラムがソート出来るかをプロバイダが知ることが出来るように、[[sort]] プロパティを構成しなければなりません。
|
||||
|
||||
SQL データプロバイダ
|
||||
--------------------
|
||||
|
||||
SqlDataProvider は、素の SQL 文に基づいたデータプロバイダを実装するものです。
|
||||
これは、各要素がクエリ結果の行を表す配列の形式でデータを提供します。
|
||||
|
||||
他のプロバイダ同様に、SqlDataProvider も、並べ替えとページネーションをサポートしています。
|
||||
並べ替えとページネーションは、与えられた [[yii\data\SqlDataProvider::$sql]] 文を "ORDER BY" 句および "LIMIT" 句で修正することによって実行されます。
|
||||
[[yii\data\SqlDataProvider::$sort]] および [[yii\data\SqlDataProvider::$pagination]] のプロパティを構成して、並べ替えとページネーションの動作をカスタマイズすることが出来ます。
|
||||
|
||||
`SqlDataProvider` は次のようにして使用することが出来ます。
|
||||
上記の例における `$query` が次のコードによって作成される場合は、提供されるデータは生の配列になります。
|
||||
|
||||
```php
|
||||
use yii\db\Query;
|
||||
|
||||
$query = (new Query())->from('post')->where(['status' => 1]);
|
||||
```
|
||||
|
||||
> Note|注意: クエリが既に `orderBy` 句を指定しているものである場合、(`sort` の構成を通して) エンドユーザによって与えられる並べ替えの指定は、既存の `orderBy` 句に追加されます。
|
||||
一方、`limit` と `offset` の句が存在している場合は、(`pagenation` の構成を通して) エンドユーザによって指定されるページネーションのリクエストによって上書きされます。
|
||||
|
||||
デフォルトでは、[[yii\data\ActiveDataProvider]] はデータベース接続として `db` アプリケーションコンポーネントを使用します。
|
||||
[[yii\data\ActiveDataProvider::db]] プロパティを構成すれば、別のデータベース接続を使用することが出来ます。
|
||||
|
||||
|
||||
## SQL データプロバイダ <span id="sql-data-provider"></span>
|
||||
|
||||
[[yii\data\SqlDataProvider]] は、生の SQL 文を使用して、必要なデータを取得します。
|
||||
このデータプロバイダは、[[yii\data\SqlDataProvider::sort|sort]] と [[yii\data\SqlDataProvider::pagination|pagination]] の指定に基づいて、SQL 文の `ORDER BY` と `OFFSET/LIMIT` の句を修正し、指定された順序に並べ替えられたデータを要求されたページの分だけ取得します。
|
||||
|
||||
[[yii\data\SqlDataProvider]] を使用するためには、[[yii\data\SqlDataProvider::sql|sql]] プロパティだけでなく、[[yii\data\SqlDataProvider::totalCount|totalCount]] プロパティを指定しなければなりません。
|
||||
例えば、
|
||||
|
||||
```php
|
||||
use yii\data\SqlDataProvider;
|
||||
|
||||
$count = Yii::$app->db->createCommand('
|
||||
SELECT COUNT(*) FROM user WHERE status=:status
|
||||
SELECT COUNT(*) FROM post WHERE status=:status
|
||||
', [':status' => 1])->queryScalar();
|
||||
|
||||
$dataProvider = new SqlDataProvider([
|
||||
'sql' => 'SELECT * FROM user WHERE status=:status',
|
||||
$provider = new SqlDataProvider([
|
||||
'sql' => 'SELECT * FROM post WHERE status=:status',
|
||||
'params' => [':status' => 1],
|
||||
'totalCount' => $count,
|
||||
'pagination' => [
|
||||
'pageSize' => 10,
|
||||
],
|
||||
'sort' => [
|
||||
'attributes' => [
|
||||
'age',
|
||||
'name' => [
|
||||
'asc' => ['first_name' => SORT_ASC, 'last_name' => SORT_ASC],
|
||||
'desc' => ['first_name' => SORT_DESC, 'last_name' => SORT_DESC],
|
||||
'default' => SORT_DESC,
|
||||
'label' => 'Name',
|
||||
'title',
|
||||
'view_count',
|
||||
'created_at',
|
||||
],
|
||||
],
|
||||
],
|
||||
'pagination' => [
|
||||
'pageSize' => 20,
|
||||
],
|
||||
]);
|
||||
|
||||
// 現在のページの user のレコードを取得する
|
||||
$models = $dataProvider->getModels();
|
||||
// データ行の配列を返す
|
||||
$models = $provider->getModels();
|
||||
```
|
||||
|
||||
> Note|注意: ページネーションの機能を使いたい場合は、[[yii\data\SqlDataProvider::$totalCount]] プロパティに (ページネーション無しの) 総行数を設定しなければなりません。
|
||||
そして、並べ替えの機能を使いたい場合は、どのカラムがソート出来るかをプロバイダが知ることが出来るように、[[yii\data\SqlDataProvider::$sort]] プロパティを構成しなければなりません。
|
||||
> Info|情報: [[yii\data\SqlDataProvider::totalCount|totalCount]] プロパティは、データにページネーションを適用しなければならない場合にだけ要求されます。
|
||||
これは、[[yii\data\SqlDataProvider::sql|sql]] によって指定される SQL 文は、現在要求されているページのデータだけを返すように、データプロバイダによって修正されてしまうからです。
|
||||
データプロバイダは、総ページ数を正しく計算するためには、データアイテムの総数を知る必要があります。
|
||||
|
||||
|
||||
あなた自身のカスタムデータプロバイダを実装する
|
||||
----------------------------------------------
|
||||
## 配列データプロバイダ <span id="array-data-provider"></span>
|
||||
|
||||
Yii はあなた自身のカスタムデータプロバイダを導入することを許容しています。
|
||||
そうするためには、下記の `protected` メソッドを実装する必要があります。
|
||||
[[yii\data\ArrayDataProvider]] は、一つの大きな配列を扱う場合に最も適しています。
|
||||
このデータプロバイダによって、一つまたは複数のカラムで並べ替えた配列データの 1 ページ分を返すことが出来ます。
|
||||
[[yii\data\ArrayDataProvider]] を使用するためには、全体の大きな配列として [[yii\data\ArrayDataProvider::allModels|allModels]] プロパティを指定しなければなりません。
|
||||
この大きな配列の要素は、連想配列 (例えば [DAO](db-dao.md) のクエリ結果) またはオブジェクト (例えば [アクティブレコード](db-active-record.md) インスタンス) とすることが出来ます。
|
||||
例えば、
|
||||
|
||||
- `prepareModels` - 現在のページで利用できるデータモデルを準備して、それを配列として返します。
|
||||
- `prepareKeys` - 現在利用できるデータモデルの配列を受け取って、それと関連付けられるキーの配列を返します。
|
||||
- `prepareTotalCount` - データプロバイダにあるデータモデルの総数を示す値を返します。
|
||||
```php
|
||||
use yii\data\ArrayDataProvider;
|
||||
|
||||
$data = [
|
||||
['id' => 1, 'name' => 'name 1', ...],
|
||||
['id' => 2, 'name' => 'name 2', ...],
|
||||
...
|
||||
['id' => 100, 'name' => 'name 100', ...],
|
||||
];
|
||||
|
||||
$provider = new ArrayDataProvider([
|
||||
'allModels' => $data,
|
||||
'pagination' => [
|
||||
'pageSize' => 10,
|
||||
],
|
||||
'sort' => [
|
||||
'attributes' => ['id', 'name'],
|
||||
],
|
||||
]);
|
||||
|
||||
// 現在リクエストされているページの行を返す
|
||||
$rows = $provider->getModels();
|
||||
```
|
||||
|
||||
> Note|注意: [アクティブデータプロバイダ](#active-data-provider) および [SQL データプロバイダ](#sql-data-provider) と比較すると、配列データプロバイダは効率の面では劣ります。
|
||||
何故なら、*全ての* データをメモリにロードしなければならないからです。
|
||||
|
||||
|
||||
## データのキーを扱う <span id="working-with-keys"></span>
|
||||
|
||||
データプロバイダによって返されたデータアイテムを使用する場合、各データアイテムを一意のキーで特定しなければならないことがよくあります。
|
||||
例えば、データアイテムが顧客情報を表す場合、顧客 ID を各顧客データのキーとして使用したいでしょう。
|
||||
データプロバイダは、[[yii\data\DataProviderInterface::getModels()]] によって返されたデータアイテムに対応するそのようなキーのリストを返すことが出来ます。
|
||||
例えば、
|
||||
|
||||
```php
|
||||
use yii\data\ActiveDataProvider;
|
||||
|
||||
$query = Post::find()->where(['status' => 1]);
|
||||
|
||||
$provider = new ActiveDataProvider([
|
||||
'query' => Post::find(),
|
||||
]);
|
||||
|
||||
// Post オブジェクトの配列を返す
|
||||
$posts = $provider->getModels();
|
||||
|
||||
// $post に対応するプライマリキーの値を返す
|
||||
$ids = $provider->getKeys();
|
||||
```
|
||||
|
||||
上記の例では、[[yii\data\ActiveDataProvider]] に対して [[yii\db\ActiveQuery]] オブジェクトを供給していますから、キーとしてプライマリキーの値を返すのが理にかなっています。
|
||||
キーの値の計算方法を明示的に指定するために、[[yii\data\ActiveDataProvider::key]] にカラム名を設定したり、キーの値を計算するコーラブルを設定したりすることも出来ます。
|
||||
例えば、
|
||||
|
||||
```php
|
||||
// "slug" カラムをキーの値として使用する
|
||||
$provider = new ActiveDataProvider([
|
||||
'query' => Post::find(),
|
||||
'key' => 'slug',
|
||||
]);
|
||||
|
||||
// md5(id) の結果をキーの値として使用する
|
||||
$provider = new ActiveDataProvider([
|
||||
'query' => Post::find(),
|
||||
'key' => function ($model) {
|
||||
return md5($model->id);
|
||||
}
|
||||
]);
|
||||
```
|
||||
|
||||
|
||||
## カスタムデータプロバイダを作成する <span id="custom-data-provider"></span>
|
||||
|
||||
あなた自身のカスタムデータプロバイダクラスを作成するためには、[[yii\data\DataProviderInterface]] を実装しなければなりません。
|
||||
[[yii\data\BaseDataProvider]] を拡張するのが比較的簡単な方法です。
|
||||
そうすれば、データプロバイダのコアのロジックに集中することが出来ます。
|
||||
具体的に言えば、実装する必要があるのは、主として次のメソッドです。
|
||||
|
||||
- [[yii\data\BaseDataProvider::prepareModels()|prepareModels()]]: 現在のページで利用できるデータモデルを準備して、それを配列として返します。
|
||||
- [[yii\data\BaseDataProvider::prepareKeys()|prepareKeys()]]: 現在利用できるデータモデルの配列を受け取って、それと関連付けられるキーの配列を返します。
|
||||
- [[yii\data\BaseDataProvider::prepareTotalCount()|prepareTotalCount]]: データプロバイダにあるデータモデルの総数を示す値を返します。
|
||||
|
||||
下記は、CSV ファイルを効率的に読み出すデータプロバイダのサンプルです。
|
||||
|
||||
```php
|
||||
<?php
|
||||
class CsvDataProvider extends \yii\data\BaseDataProvider
|
||||
use yii\data\BaseDataProvider;
|
||||
|
||||
class CsvDataProvider extends BaseDataProvider
|
||||
{
|
||||
/**
|
||||
* @var string 読み出すファイルの名前
|
||||
* @var 読み出す CSV ファイルの名前
|
||||
*/
|
||||
public $filename;
|
||||
|
||||
|
@ -19,7 +19,7 @@ Yii は上記の全ての認証方法をサポートしています。新しい
|
||||
|
||||
あなたの API に対して認証を有効にするためには、次のステップを実行します。
|
||||
|
||||
1. `user` アプリケーションコンポーネントを構成します。
|
||||
1. `user` [アプリケーションコンポーネント](structure-application-components.md) を構成します。
|
||||
- [[yii\web\User::enableSession|enableSession]] プロパティを `false` に設定します。
|
||||
- [[yii\web\User::loginUrl|loginUrl]] プロパティを `null` に設定し、ログインページにリダイレクトする代りに HTTP 403 エラーを表示します。
|
||||
2. REST コントローラクラスにおいて、`authenticator` ビヘイビアを構成することによって、どの認証方法を使用するかを指定します。
|
||||
@ -29,7 +29,7 @@ Yii は上記の全ての認証方法をサポートしています。新しい
|
||||
[[yii\web\User::enableSession|enableSession]] が false である場合、ユーザの認証ステータスがセッションを使ってリクエストをまたいで存続することはありません。
|
||||
その代りに、すべてのリクエストに対して認証が実行されます。このことは、ステップ 2 と 3 によって達成されます。
|
||||
|
||||
> Tip|情報: RESTful API をアプリケーションの形式で開発する場合は、アプリケーションの構成情報で `user` アプリケーションコンポーネントの [[yii\web\User::enableSession|enableSession]] プロパティを構成することが出来ます。
|
||||
> Tip|情報: RESTful API をアプリケーションの形式で開発する場合は、アプリケーションの構成情報で `user` アプリケーションコンポーネント(structure-application-components.md) の [[yii\web\User::enableSession|enableSession]] プロパティを構成することが出来ます。
|
||||
RESTful API をモジュールとして開発する場合は、次のように、モジュールの `init()` メソッドに一行を追加することが出来ます。
|
||||
> ```php
|
||||
public function init()
|
||||
|
@ -74,7 +74,7 @@ return [
|
||||
'class' => 'yii\web\Response',
|
||||
'on beforeSend' => function ($event) {
|
||||
$response = $event->sender;
|
||||
if ($response->data !== null && !empty(Yii::$app->request->get('suppress_response_code'))) {
|
||||
if ($response->data !== null && Yii::$app->request->get('suppress_response_code')) {
|
||||
$response->data = [
|
||||
'success' => $response->isSuccessful,
|
||||
'data' => $response->data,
|
||||
|
@ -19,12 +19,12 @@ Yii は、RESTful ウェブサービス API を実装する仕事を簡単にす
|
||||
以下においては、例を使って、どのようにして最小限のコーディング労力で一組の RESTful API を構築することが出来るかを説明します。
|
||||
|
||||
ユーザのデータを RESTful API によって公開したいと仮定しましょう。
|
||||
ユーザのデータは `user` という DB テーブルに保存されており、それにアクセスするための [[yii\db\ActiveRecord|ActiveRecord]] クラス `app\models\User` が既に作成済みであるとします。
|
||||
ユーザのデータは `user` という DB テーブルに保存されており、それにアクセスするための [アクティブレコード](db-active-record.md) クラス `app\models\User` が既に作成済みであるとします。
|
||||
|
||||
|
||||
## コントローラを作成する <span id="creating-controller"></span>
|
||||
|
||||
最初に、コントローラクラス `app\controllers\UserController` を次のようにして作成します。
|
||||
最初に、[コントローラ](structure-controllers.md) クラス `app\controllers\UserController` を次のようにして作成します。
|
||||
|
||||
```php
|
||||
namespace app\controllers;
|
||||
@ -37,8 +37,11 @@ class UserController extends ActiveController
|
||||
}
|
||||
```
|
||||
|
||||
このコントローラクラスは、[[yii\rest\ActiveController]] を拡張するものです。
|
||||
このコントローラクラスは、よく使用される一揃いの RESTful アクションを実装した [[yii\rest\ActiveController]] を拡張するものです。
|
||||
[[yii\rest\ActiveController::modelClass|modelClass]] を `app\models\User` と指定することによって、データの取得と操作にどのモデルが使用できるかをコントローラに教えてやります。
|
||||
The controller class extends from [[yii\rest\ActiveController]], which implements a common set of RESTful actions.
|
||||
By specifying [[yii\rest\ActiveController::modelClass|modelClass]]
|
||||
as `app\models\User`, the controller knows which model can be used for fetching and manipulating data.
|
||||
|
||||
|
||||
## URL 規則を構成する <span id="configuring-url-rules"></span>
|
||||
@ -61,7 +64,7 @@ class UserController extends ActiveController
|
||||
|
||||
## JSON の入力を可能にする <span id="enabling-json-input"></span>
|
||||
|
||||
API が JSON 形式で入力データを受け取ることが出来るように、`request` アプリケーションコンポーネントの [[yii\web\Request::$parsers|parsers]] プロパティを構成して、JSON 入力のために [[yii\web\JsonParser]] を使うようにします。
|
||||
API が JSON 形式で入力データを受け取ることが出来るように、`request` [アプリケーションコンポーネント](structure-application-components.md) の [[yii\web\Request::$parsers|parsers]] プロパティを構成して、JSON 入力のために [[yii\web\JsonParser]] を使うようにします。
|
||||
|
||||
```php
|
||||
'request' => [
|
||||
|
@ -8,8 +8,7 @@ RESTful API のリクエストを処理するとき、アプリケーション
|
||||
2. リソースオブジェクトを配列に変換します。
|
||||
[リソース](rest-resources.md) の節で説明したように、この作業は [[yii\rest\Serializer]] によって実行されます。
|
||||
3. 配列をコンテントネゴシエーションのステップで決定された形式の文字列に変換します。
|
||||
この作業は、[[yii\web\Response::formatters|response]] アプリケーションコンポーネントに登録された [[yii\web\ResponseFormatterInterface|レスポンスフォーマッタ]] によって実行されます。
|
||||
|
||||
この作業は、`response` [アプリケーションコンポーネント](structure-application-components.md) の [[yii\web\Response::formatters|formatters]] プロパティに登録された [[yii\web\ResponseFormatterInterface|レスポンスフォーマッタ]] によって実行されます。
|
||||
|
||||
## コンテントネゴシエーション <span id="content-negotiation"></span>
|
||||
|
||||
|
@ -5,7 +5,7 @@
|
||||
|
||||
実際には、綺麗な URL を有効にして HTTP 動詞を利用したいというのが普通でしょう。
|
||||
例えば、`POST /users` というリクエストが `user/create` アクションへのアクセスを意味するようにする訳です。
|
||||
これは、アプリケーションの構成情報で `urlManager` アプリケーションコンポーネントを次のように構成することによって容易に達成することが出来ます。
|
||||
これは、アプリケーションの構成情報で `urlManager` [アプリケーションコンポーネント](structure-application-components.md) を次のように構成することによって容易に達成することが出来ます。
|
||||
|
||||
```php
|
||||
'urlManager' => [
|
||||
|
@ -9,7 +9,7 @@ Yii のアプリケーションがリクエストされた URL の処理を開
|
||||
これは、与えられたルートとそれに結び付けられたクエリパラメータから URL を生成するものです。
|
||||
生成された URL が後でリクエストされたときには、ルーティングのプロセスがその URL を解決して元のルートとクエリパラメータに戻すことが出来ます。
|
||||
|
||||
ルーティングと URL 生成について主たる役割を果たすのが `urlManager` アプリケーションコンポーネントとして登録されている [[yii\web\UrlManager|URL マネージャ]] です。
|
||||
ルーティングと URL 生成について主たる役割を果たすのが `urlManager` [アプリケーションコンポーネント](structure-application-components.md) として登録されている [[yii\web\UrlManager|URL マネージャ]] です。
|
||||
[[yii\web\UrlManager|URL マネージャ]] は、入ってくるリクエストをルートとそれに結び付けられたクエリパラメータとして解析するための [[yii\web\UrlManager::parseRequest()|parseRequest()]] メソッドと、与えられたルートとそれに結び付けられたクエリパラメータから URL を生成するための [[yii\web\UrlManager::createUrl()|createUrl()]] メソッドを提供します。
|
||||
|
||||
アプリケーション構成情報の `urlManager` コンポーネントを構成することによって、既存のアプリケーションコードを修正することなく、任意の URL 形式をアプリケーションに認識させることが出来ます。
|
||||
|
@ -25,6 +25,7 @@
|
||||
|
||||
namespace app\models;
|
||||
|
||||
use Yii;
|
||||
use yii\base\Model;
|
||||
|
||||
class EntryForm extends Model
|
||||
|
@ -229,6 +229,6 @@ foreach ($posts as $post) {
|
||||
代りに、いつでも、何かを変更する前にはコードをプロファイルしてください。
|
||||
次のツールが役に立つでしょう。
|
||||
|
||||
- [Yii のデバッグツールバーとデバッガ](tool-debugger.md)
|
||||
- [Yii のデバッグツールバーとデバッガ](https://github.com/yiisoft/yii2-debug/blob/master/docs/guide/README.md)
|
||||
- [XDebug プロファイラ](http://xdebug.org/docs/profiler)
|
||||
- [XHProf](http://www.php.net/manual/en/book.xhprof.php)
|
||||
|
Reference in New Issue
Block a user