Правильная реализация runWithParams () в Yii - PullRequest
2 голосов
/ 03 февраля 2012

Если вы посмотрите под # 3 по этой ссылке http://www.yiiframework.com/doc/guide/1.1/en/basics.controller, это даст вам возможность организовать все функции вашего контроллера в отдельные php-файлы.

Для этого вам понадобится каждый phpФайл содержит класс, который расширяет CAction.Каждый класс должен иметь свой рабочий код внутри функции run ().

Это мой файл UserController.php

public function actions()
{
    $FOLDER = '.User';
    $PROJECT_ROOT = 'application.controllers' . $FOLDER;

    return array (
        'list' => $PROJECT_ROOT . 'ListAction',
);

}

В приложении, которое я пишу, мне нужно передать переменные в конкретные действия.

Yii реализовал runWithParams ($ params) в Yii 1.7, чтобы это произошло.Однако, когда я вызываю write в (например) файле DeleteAction.php runWithParams ($ params) вместо run () и наш внешний интерфейс вызывает post / delete /? Params = 45 вместо run (), я получаю сообщение об ошибке:"не удалось найти run () в файле DeleteAction.php

class ListAction extends CAction
{
public function runWithParam($id)
{
    SiteController::actionLoggedin();
    $id = addslashes($id);
}

Что означает, что мне нужно run () ... но я не могу передать параметры в run (). Мне нужен runWithParams ($ params).

В документации по функции runWithParams ($ params) http://www.yiiframework.com/doc/api/1.1/CAction#runWithParams-detail

написано

    Runs the action with the supplied request parameters. This method is internally called by CController::runAction().

Я не понимаю, что это значит?понять, как я могу реализовать это успешно.

Ответы [ 2 ]

4 голосов
/ 05 февраля 2012

Вам просто нужно реализовать run() в классе CAction.

У вас автоматически будет доступ к параметрам $ _GET, конечно, как обычно в вашем действии:

class ListAction extends CAction {
  public function run() {
    $id = $_GET['id']; // $_POST works too
    $model = Model::model()->findbyPk($id);
    // render your view next, whatever
  }
}

Если вы хотите передать дополнительные константы CAction от контроллера, вы можете сделать это следующим образом:

В настройках вашего действия в вашем контроллере:

public function actions() {
  return array(
    'userSearch'=>array(
      'class'=>'application.controllers.User.ListAction', // path alias to your action
      'model'=>'User',
      'otherVariable'=>'something here',
  ));
}

Затем вВАША ПРЕДУПРЕЖДЕНИЕ:

class ListAction extends CAction {
  public $modelName;
  public $otherVariable;
  public function run() {
    $this->modelName; //  'User' - passed in from the calling Controller
    $this->otherVariable; //  'something here' - passed in from the calling Controller
  }
}

Я не уверен, какие другие параметры вы могли бы передать в свое действие, но это должно охватывать это.Я надеюсь, что это поможет!

Обновление:

Этот вопрос заставил меня взглянуть на код более подробно, и это на самом деле все, что связано с функцией Yii, о которой я не знал,Если вы объявите параметр для своего действия (например, function actionTest($param)), то Yii проанализирует параметры $ _GET запроса и вызовет Action с этим параметром, переданным функции.Так что вам не нужно получать параметр $ _GET самостоятельно.Вот так:

http://example.com/mycontroller/myaction?param1=test

function actionMyaction($param1) { // in a CAction, it would be run($param1)
  echo '$_GET parameter param1 set to '.$param1; // will echo "test"
}

Это реализовано следующим образом:

  1. В runAction() CController получает параметры $ _GET (если они есть) с getActionParams()
  2. runAction() передает эти параметры в runWithParams()
  3. runWithParams() использует PHP Reflection, чтобы увидеть, есть ли у метода действия параметры (например, $param1)
    1. Если есть параметрыон вызывает runWithParamsInternal() с параметрами $ _GET
      1. runWithParamsInternal() вызывает метод run() с параметрами $ _GET (например, run($param1))
    2. В противном случаеон просто вызывает run() без каких-либо параметров

Использовать это совершенно необязательно, вы все равно можете получить доступ к параметрам $ _GET, как обычно, в своем действии без.По сути, это просто обеспечивает обязательные параметры $ _GET.Если вашему действию нужен параметр, но в URL-адресе запроса нет параметров $ _GET, Yii возвращает «Ошибка 400» из invalidActionParams().Это избавляет вас от необходимости проверять isset($_GET) в ваших действиях, что довольно круто.

0 голосов
/ 04 февраля 2015

Из того же руководства по Yii вы указываете в своем описании:

Начиная с версии 1.1.7, автоматическое связывание параметров также работает для действий на основе классов.Когда метод run () класса действий определен с некоторыми параметрами, они будут заполнены соответствующими именованными значениями параметров запроса.Например,

class UpdateAction extends CAction
{
    public function run($id)
    {
        // $id will be populated with $_GET['id']
    }
}

Так просто.Определите в run () все необходимые параметры.

Конечно, вы всегда можете получить по $ _GET ['key'] или по Yii :: app () -> request-> getQuery ('key').)

Если вы добавите их во время выполнения, знайте, что, если вы не всегда собираетесь передавать все параметры, вы можете установить значения по умолчанию, иначе вы получите ошибки.

Пример:

public function run($id, $other_param='default_value')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...