2012-12-16 2 views
2

Я пытаюсь создать cms, как приложение, используя Yii. Функциональность будет что-то вроде:Yii Route All Actions To One Method In Controller

http://www.example.com/article/some-article-name

То, что я пытаюсь сделать, это все идет метод actionIndex() в ArticleController.php, и есть, что один способ определить, как обрабатывать действия. Поэтому мой вопрос заключается в том, как я могу направить все действия на один метод в контроллере в Yii?

+0

Параметр 'catchAllRequest' в файле конфигурации. Установите его любым способом. – itachi

+0

Но я только хочу, чтобы этот контроллер, и этот файл catchAllRequest, похоже, является параметром для сайта –

+0

, может быть способ сделать это, но мне нужно знать, что вы подразумеваете под «обработкой действия» и как вы планируете определить? –

ответ

0

Добавьте это в начале правил urlManager в конфигурации:

'article/*' => 'article', 
+0

Нет, не делает этого. - 'правила' => Array ( \t \t \t \t 'статьи/*' => 'статьи', \t \t \t \t <контроллер: \ ш +>/ '=>' /вид ', \t \t \t \t '<контроллер: \ W +>// '=>' /', \t \t \t \t '<контроллер: \ W +>/ '=>' /', \t \t \t '<контроллер: \ W +>/// '=>' /', \t \t \t), –

+0

Не 'articles', но' article'. У вас есть «ArticleController», верно? –

+0

Статья была просто понятным примером, реальный контроллер - это Документы и тот же результат. –

2

В вашем случае, я думаю, что это будет лучше использовать либо filter или beforeAction method.


Фильтр путь:

фильтр представляет собой фрагмент кода, который сконфигурирован для выполнения перед и/или после выполнения действия контроллера.

Пример:

class SomeController extends Controller { 
    // ... other code ... 

    public function filters() { 
     return array(
      // .. other filters ... 
      'mysimple', // our filter will be applied to all actions in this controller 
      // ... other filters ... 
     ); 
    } 

    public function filterMysimple($filterChain) { // this is the filter code 
     // ... do stuff ... 
     $filterChain->run(); // this bit is important to let the action run 
    } 

    // ... other code ... 
} 

beforeAction образом: (. После всех возможных фильтров)

Этот метод вызывается непосредственно перед действие должно быть выполнено Вы можете переопределить метод для подготовки к действию в последнюю минуту.

Пример:

class SomeController extends Controller { 
    // ... other code ... 

    protected function beforeAction($action) { 
     if (parent::beforeAction($action)){ 

      // do stuff 

      return true; // this line is important to let the action continue 
     } 
     return false; 
} 

    // ... other code ... 
} 

В качестве примечания, вы можете получить доступ к текущим действиям внутри контроллера таким образом также: $this->action, чтобы получить значение id: $this->action->id:

if($this->action->id == 'view') { // say you want to detect actionView 
    $this->layout = 'path/to/layout'; // say you want to set a different layout for actionView 
} 
0

Ваши правила должны быть похожи на следующие: -

 'rules' => array(
      '<controller:\w+>/<action:\w+>' => '<controller>/<action>', 
      '<controller:\w+>/<action:\w+>' => 'article/index', 
     ), 

Это будет передавать все запросы к функции actionIndex в ArticleController PHP класса, если контроллер и/или действие не существует.

0

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

Вышеуказанные фильтры() и beforeAction() и даже __construct() не работают для этой цели (фильтры и предварительное действие вообще не срабатывают, если действие не существует, а __construct очень грязно, потому что если вы положить функциональность в __construct - в тот момент Yii оленьей кожи даже знать, какой контроллер/действие/смотреть он должен вызвать)

однако, есть простое решение, которое включает в себя менеджер URL

в вашей конфигурации, в правилах URL менеджера , добавьте одну из следующих строк (в зависимости от настроек пути)

'articles/<action:\w+>' => 'articles/index/action/<action>', 

ИЛИ

'articles/<action:\w+>' => 'articles/index?action=<action>', 

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

public function actionIndex() { 
    $name = Yii::app()->request->getParam('action'); 
    $this->render($name); 
} 

, то вы можете позвонить страниц, как/статьи/myarticle или/статьи/без использования каких-либо функций в вашем контроллере. Все, что вам нужно сделать, это просто добавить файл с именем myarticle.php или yourarticle.php в папку views/articles и набрать html-содержимое внутри этих файлов.