CakePHP 3.0 ORM - работает отладка, переворачивается, выдает ошибки

Я мог бы использовать проверку здравомыслия здесь ...

У меня есть пользовательское свойство в моем объекте Cake3.0 CustomersTable.

//Таблица клиентов

public $paginatorDefaults = [
    'conditions' => [...],
    'contain' => [...]
    ... etc
];

Я использую это из глобального контроллера API ajax/json, чтобы читать нумерацию страниц, которую я могу установить для каждой модели.

//Апиконтроллер -

//Load the components
public $components = [
    'RequestHandler', 
    'Paginator'
];


//Initialize the dynamic table object
public function initialize() {
  parent::initialize();
  //Set tableName
  $this->_tableName = $this->findTable(Inflector::camelize($this->request->model));
  //Instantiate table
  $this->_table = $this->loadModel($this->_tableName);
}

public function index() {
  $pagination = $this->_pagination(); //Loads the 
  $entities = $this->Paginator->paginate($this->_table->find(), $this->_table->paginatorDefaults);
  $this->set([
    'data' => $entities,
    'request' => $this->request,
    '_serialize' => ['data','request'],
  ]);
}

На стороне клиента я вызываю это через запрос Ajax на основе Angular, который был настроен для отправки заголовка X-Requested-With для запуска обработки isAjax() Cake, и я отправляю запросы на расширенный путь Cake .json для запрашивать данные JSON в ответ.

Итак, когда Config/app.php debug = true, все работает тикет-бу — корректно возвращает данные сущности. Но если я переключу отладку на false, теперь я получаю ошибки ORM в своем журнале ошибок.

Ошибка: [RuntimeException] Таблица Cake\ORM\Table не связана с paginatorDefaults

2014-10-24 16:49:44 Error: [RuntimeException] Table "Cake\ORM\Table" is not associated with "paginatorDefaults"
Request URL: /Tremendus/Momento/api/customers.json?sort=Customers.name&direction=asc&limit=10&page=1
Stack Trace:
0 /<masked path>/plugins/Api/src/Controller/ApiController.php(92): Cake\ORM\Table->__get('paginatorDefaul...')
1 /<masked path>/plugins/Api/src/Controller/ApiController.php(78): Api\Controller\ApiController->_pagination()
2 [internal function]: Api\Controller\ApiController->index()
3 /<masked path>/vendor/cakephp/cakephp/src/Controller/Controller.php(411): call_user_func_array(Array, Array)
4 /<masked path>/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(111): Cake\Controller\Controller->invokeAction()
5 /<masked path>/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(85): Cake\Routing\Dispatcher->_invoke(Object(Api\Controller\ApiController))
6 /<masked path>/webroot/index.php(37): Cake\Routing\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response))
7 {main}

Итак, я не нашел причин, по которым я не могу установить произвольные свойства для объекта Table - действительно, он отлично работает в отладке - но почему бы и нет, когда я отключил его?

(PS: я очистил все файлы кеша app/tmp.)


person Tremendus Apps    schedule 24.10.2014    source источник


Ответы (1)


Пагинатор в 3.0 работает не так как в 2.0. Второй аргумент не предназначен для передачи параметров в запрос. У вас есть 2 варианта

$this->paginate = $this->_table->paginatorDefaults

Это установит параметры для пагинатора такими же, как те, которые вы сохранили для таблицы. В качестве альтернативы вы можете использовать find() для хранения этих значений по умолчанию:

$this->paginate($this->_table->find('all', $this->_table->paginatorDefaults));
person José Lorenzo Rodríguez    schedule 28.10.2014
comment
Привет, Хосе, спасибо, что связались с ответом, я уверен, что ты занят, я ценю твое время. Однако это не решило проблему. Между живым режимом и режимом отладки все еще есть что-то подозрительное. В конце концов я изменил значения по умолчанию в классе таблицы, чтобы использовать пользовательские методы поиска (method = findStandard()). Контроллер обновлен для использования $this-›paginate['finder' =› 'standard'] и $this-›paginate($this-›_table) — все работает, просто найдите, когда включена отладка, но только с одним изменением — отладка = вне торта выдает ошибку - Неизвестный стандартный метод поиска - но он работает, когда debug = on ... ? - person Tremendus Apps; 05.11.2014
comment
Похоже, что при отладке = false какой-то кеш заставляет ваше приложение загружать другой файл таблицы или неправильно находить файл таблицы. выполните var_dump() объекта таблицы, когда debug = false, и убедитесь, что это то, что вы ожидаете. - person José Lorenzo Rodríguez; 05.11.2014
comment
Нет... не все так просто. Кэш выключен и сброшен, файлы tmp очищаются при каждом запросе. Все тот же результат. Сейчас я копаюсь в файлах основной библиотеки. У меня такое ощущение, что это что-то в requestHandler, поскольку он делает это только тогда, когда я запрашиваю расширение .json с загруженным компонентом requestHandler. Это может быть связано с маршрутизацией ... (Но даже тогда, почему он будет работать с включенной отладкой, а не с отключенной отладкой) Я буду продолжать изучать это. - person Tremendus Apps; 05.11.2014
comment
Хосе, должен ли RequestHandler удалить расширение .json из метода или параметра? (независимо от того, что является последним элементом в URL-адресе) В настоящее время он делает это, как и ожидалось, с включенной отладкой. Но он НЕ делает этого, когда отладка отключена. Я что-то упустил или это ожидаемое поведение? У меня неправильная конфигурация? - person Tremendus Apps; 05.11.2014
comment
Да, мы обнаружили ошибку .json совсем недавно. Исправление в работе :) - person José Lorenzo Rodríguez; 06.11.2014