2016-10-04 3 views
1

Я использую cakephp 3.x поставили запросы базы данных в модели, в которой я хочу проверить текущее действие контроллера и на основании этого сделаю свои запросы к базе данных ,Как получить текущее действие контроллера в cakephp 3.x модель

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

Моя Попробуйте - UsersTable.php

public function initialize(array $config) 
    { 
     parent::initialize($config); 
     $this->table('users');   
     $this->primaryKey('user_id'); 
     echo '<pre>'; 
     print_r($GLOBALS);   
     exit; 
    } 

до сих пор, если я это сделать, я получил массив в ответ, и в котором я нашел это лучший результат из других вещей в том, что массив

[REQUEST_URI] => /5p_group/users/add 

Я м также пытается использовать этот

echo '<pre>'; 
print_r($GLOBALS['_SERVER']['HTTP_REFERER']);   
exit; 

, что дает мне этот выход

http://localhost/5p_group/users/archived 

так в конце концов, я получаю результат, который я хочу, но я хочу другой подходящий метод, который использует CakePHP 3.x ..

Так есть ли другой способ или более частый путь от этого я могу получить свое текущее действие контроллера?

Любые идеи будут оценены ..

Благодарности

+6

Это явное нарушение разделения интересов, то есть очень плохая идея, ваша модель не должна знать о внешнем мире и принимать такие решения! Если контроллер хочет получить данные от модели, то он сообщает модели, какие данные он хочет, а не наоборот! Вы можете получить более эффективную помощь, если будете разбираться в том, что именно вы должны запрашивать _ точно. – ndm

+0

Я знаю, что это не имеет смысла ... но не так ли знать материал? –

+0

Невероятно знать о вещах, нет, как о плохих практиках и о том, как их избежать. И если вы хотите узнать еще больше, например, как это сделать правильно, то, пожалуйста, подробно остановитесь на фактической технической проблеме, которую вы пытаетесь решить, то есть уже упоминалось, «_Что точно вам нужно запрашивать _когда точно?» , – ndm

ответ

2

Прежде всего, вы должны использовать класс маршрутизации в вашей модели. Таким образом, в верхней части вы можете назвать это как ниже

use Cake\Routing\Router;

, а затем в вашей функции инициализации вы можете проверить Params как

debug(Router::getRequest());

Или более конкретно вы можете использовать

debug(Router::getRequest()->params['action']);

Я думаю, что это решение с использованием c akephp классы, хотя небольшой взлом.

Для получения дополнительной функции справки вы можете получить доступ к кулинарному на Router Class

+1

Это действительно плохая идея, см. Комментарий ndm выше. Модель не должна знать о контроллере/маршруте, поскольку они не обязательно доступны таким образом. Это плохой дизайн! – drmonkeyninja

+1

Да, я согласен, но поскольку вопрос просто утверждает, что он может передавать значения от контроллера, но все же хочет знать, есть ли способ обойти. ** Я знаю, что могу передать управление контроллером от моего контроллера непосредственно к моей функции модели, но есть способ, которым я могу просто проверить свое текущее действие контроллера внутри моей модели только так, чтобы мне не нужно было передавать его в моих многочисленных функциях, которые только внутри модели. ** - @mittul –

+2

Просто подчеркивая, что это никогда не должно быть сделано для тех, кто наткнулся на эту страницу. Это очень хакерское решение, поскольку «Router :: getRequest() -> params ['action']' может не существовать в модели при вызове метода. Модели не зависят от таких контроллеров, как этот ответ. – drmonkeyninja

Смежные вопросы