1 | <?php |
||
2 | /** |
||
3 | * @link http://www.yiiframework.com/ |
||
4 | * @copyright Copyright (c) 2008 Yii Software LLC |
||
5 | * @license http://www.yiiframework.com/license/ |
||
6 | */ |
||
7 | |||
8 | namespace yii\rest; |
||
9 | |||
10 | use Yii; |
||
11 | use yii\data\ActiveDataProvider; |
||
12 | use yii\data\DataFilter; |
||
13 | |||
14 | /** |
||
15 | * IndexAction implements the API endpoint for listing multiple models. |
||
16 | * |
||
17 | * For more details and usage information on IndexAction, see the [guide article on rest controllers](guide:rest-controllers). |
||
18 | * |
||
19 | * @author Qiang Xue <[email protected]> |
||
20 | * @since 2.0 |
||
21 | */ |
||
22 | class IndexAction extends Action |
||
23 | { |
||
24 | /** |
||
25 | * @var callable a PHP callable that will be called to prepare a data provider that |
||
26 | * should return a collection of the models. If not set, [[prepareDataProvider()]] will be used instead. |
||
27 | * The signature of the callable should be: |
||
28 | * |
||
29 | * ```php |
||
30 | * function (IndexAction $action) { |
||
31 | * // $action is the action object currently running |
||
32 | * } |
||
33 | * ``` |
||
34 | * |
||
35 | * The callable should return an instance of [[ActiveDataProvider]]. |
||
36 | * |
||
37 | * If [[dataFilter]] is set the result of [[DataFilter::build()]] will be passed to the callable as a second parameter. |
||
38 | * In this case the signature of the callable should be the following: |
||
39 | * |
||
40 | * ```php |
||
41 | * function (IndexAction $action, mixed $filter) { |
||
42 | * // $action is the action object currently running |
||
43 | * // $filter the built filter condition |
||
44 | * } |
||
45 | * ``` |
||
46 | */ |
||
47 | public $prepareDataProvider; |
||
48 | /** |
||
49 | * @var callable a PHP callable that will be called to prepare query in prepareDataProvider |
||
50 | * Should return $query |
||
51 | * For example: |
||
52 | * |
||
53 | * ```php |
||
54 | * function ($query, $requestParams) { |
||
55 | * $query->andFilterWhere(['id' => 1]); |
||
56 | * ... |
||
57 | * return $query; |
||
58 | * } |
||
59 | * ``` |
||
60 | * |
||
61 | * @since 2.0.42 |
||
62 | */ |
||
63 | public $prepareSearchQuery; |
||
64 | /** |
||
65 | * @var DataFilter|null data filter to be used for the search filter composition. |
||
66 | * You must setup this field explicitly in order to enable filter processing. |
||
67 | * For example: |
||
68 | * |
||
69 | * ```php |
||
70 | * [ |
||
71 | * 'class' => 'yii\data\ActiveDataFilter', |
||
72 | * 'searchModel' => function () { |
||
73 | * return (new \yii\base\DynamicModel(['id' => null, 'name' => null, 'price' => null])) |
||
74 | * ->addRule('id', 'integer') |
||
75 | * ->addRule('name', 'trim') |
||
76 | * ->addRule('name', 'string') |
||
77 | * ->addRule('price', 'number'); |
||
78 | * }, |
||
79 | * ] |
||
80 | * ``` |
||
81 | * |
||
82 | * @see DataFilter |
||
83 | * |
||
84 | * @since 2.0.13 |
||
85 | */ |
||
86 | public $dataFilter; |
||
87 | |||
88 | |||
89 | /** |
||
90 | * @return ActiveDataProvider |
||
91 | */ |
||
92 | 1 | public function run() |
|
93 | { |
||
94 | 1 | if ($this->checkAccess) { |
|
95 | call_user_func($this->checkAccess, $this->id); |
||
96 | } |
||
97 | |||
98 | 1 | return $this->prepareDataProvider(); |
|
99 | } |
||
100 | |||
101 | /** |
||
102 | * Prepares the data provider that should return the requested collection of the models. |
||
103 | * @return ActiveDataProvider |
||
104 | */ |
||
105 | 1 | protected function prepareDataProvider() |
|
106 | { |
||
107 | 1 | $requestParams = Yii::$app->getRequest()->getBodyParams(); |
|
108 | 1 | if (empty($requestParams)) { |
|
109 | 1 | $requestParams = Yii::$app->getRequest()->getQueryParams(); |
|
110 | } |
||
111 | |||
112 | 1 | $filter = null; |
|
113 | 1 | if ($this->dataFilter !== null) { |
|
114 | $this->dataFilter = Yii::createObject($this->dataFilter); |
||
115 | if ($this->dataFilter->load($requestParams)) { |
||
116 | $filter = $this->dataFilter->build(); |
||
117 | if ($filter === false) { |
||
118 | return $this->dataFilter; |
||
119 | } |
||
120 | } |
||
121 | } |
||
122 | |||
123 | 1 | if ($this->prepareDataProvider !== null) { |
|
124 | return call_user_func($this->prepareDataProvider, $this, $filter); |
||
125 | } |
||
126 | |||
127 | /* @var $modelClass \yii\db\BaseActiveRecord */ |
||
128 | 1 | $modelClass = $this->modelClass; |
|
129 | |||
130 | 1 | $query = $modelClass::find(); |
|
131 | 1 | if (!empty($filter)) { |
|
132 | $query->andWhere($filter); |
||
133 | } |
||
134 | 1 | if (is_callable($this->prepareSearchQuery)) { |
|
135 | 1 | $query = call_user_func($this->prepareSearchQuery, $query, $requestParams); |
|
136 | } |
||
137 | |||
138 | 1 | return Yii::createObject([ |
|
139 | 1 | 'class' => ActiveDataProvider::className(), |
|
0 ignored issues
–
show
|
|||
140 | 1 | 'query' => $query, |
|
141 | 'pagination' => [ |
||
142 | 1 | 'params' => $requestParams, |
|
143 | ], |
||
144 | 'sort' => [ |
||
145 | 1 | 'params' => $requestParams, |
|
146 | ], |
||
147 | ]); |
||
148 | } |
||
149 | } |
||
150 |
This function has been deprecated. The supplier of the function has supplied an explanatory message.
The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.