CakePHP - метод неработающего индекса - PullRequest
1 голос
/ 29 июня 2011

В моем PortfolioController есть следующий код:

function index()
    {
        $this->set('posts', $this->Portfolio->find('all'));
    }

function view ( $id, $slug )    
    {   
        $post = $this->Portfolio->read(null, Tiny::reverseTiny($id));

        $this->set(compact('post'));
    }

Однако, чтобы получить представление об удалении /view/ из URL, я добавил следующее в мои маршруты: Router::connect('/portfolio/*', array('controller' => 'portfolio', 'action' => 'view'));

Это нарушает метод индекса, поскольку он переопределяет его, вызывая метод view и отображая пустое представление

Как мне это исправить?

Ответы [ 3 ]

6 голосов
/ 30 июня 2011

Что вы пытаетесь сделать именно?(А что с $ slug?)

Звучит так, будто вы хотите удалить действие (или, по крайней мере, действие view ()?) Из отображения в URL, амирит?Вроде как по умолчанию метод display_controller display () - действие catch-all для статических страниц?

Как это исправить?

Хорошо, я бы предложил начатьс разрывом этого маршрута, потому что в противном случае он делает именно то, что вы сказали:

Router::connect('/portfolio/*',        
// * is a wildcard matching anything & everything after /portfolio/
    array('controller' => 'portfolio', 
// and routing to portfolio's view() action, with or w/o required $args to pass
          'action' => 'view'));       

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

Обратите внимание на окончание DS. Порядок маршрута имеет значение;Первое правило, которое ловит, побеждает.Следующие маршруты все будут отображаться в индекс по умолчанию, если действие URL было опущено, но они не совпадают.

// Targets inside the controller (its methods)
Router::connect('/portfolio/', 
     array('controller' => 'portfolio', 'action' => 'index'));

не совпадает с

// Targets the controller
Router::connect('/portfolio', 
// Specifies the default controller action, can be whatever
    array('controller' => 'portfolio', 'action' => 'index'));

Для того, что вы пытаетесь сделать, должно быть

// Targets the controller
Router::connect('/portfolio', 
// Routes to 'controller default method' which is index() by Cake default 
    array('controller' => 'portfolio');

Это позволяет Cake принудительно устанавливать автоматическое сопоставление по умолчанию для индекса контроллера () всякий раз, когда действие отсутствует в URL.

Это все равно сработало бы, если бы не конечный DS и конечная звездочка.То же правило, которое должно поймать index (), вместо этого перенаправляется в view () благодаря конечной звездочке, нацеленной на все действия в портфеле.

Следовательно, предложение Foo не работает -> конечный символ DS +:

Router::connect('/portfolio/', 
// the trailing DS changes it to target 'inside portfolio' instead of 'portfolio'
    array('controller'=>'portfolio', 'action'=>'index'));
// trailing arbitrary wildcard maps any / all actions directly to view() method
Router::connect('/portfolio/*',
    array('controller' => 'portfolio', 'action' => 'view'));

, который просто обеспечивает ВСЕ действия в портфеле непосредственно в методе просмотра портфолио () (включая / portfolio / index)действие).Не пропустите go и т. Д. Любое действие портфолио разрешается с подстановочными знаками, несмотря на то, что псевдоним всего контроллера соответствует этому методу.Таким образом, вы можете отключить DS с первого маршрута, но любой URL, начинающийся с / portfolio, который не является / portfolio, все равно будет перенаправлен на просмотр ().Включая URL /portfolio/index.

Попробуйте:

// catches portfolio/index() without index in the url
Router::connect('/portfolio', 
    array('controller' => 'portfolio')); 
// maps to portfolio/view() without view in url, just /portfolio/integer id 
Router::connect('/portfolio/:id', 
    array('action'=>'view',  array('id' => '[0-9]+')); 
// routes everything else in portfolio as usual
Router::connect('/portfolio/:action/*', 
    array('controller'=>'portfolio'));

Маршруты могут быть сложными.Вот несколько ссылок;НТН.:)

http://bakery.cakephp.org/articles/Frank/2009/11/02/cakephp-s-routing-explained

http://book.cakephp.org/view/46/Routes-Configuration

0 голосов
/ 01 июля 2011

согласно моим знаниям это проблема Вы должны дать так:

Router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display')); 

Я имею в виду, вы должны изменить псевдонимы имени контроллера.

Router::connect('/portfolios/*', array('controller' => 'portfolios', 'action' => 'view'));
0 голосов
/ 30 июня 2011

Я новичок в CakePHP, но, думаю, вы можете добавить

Router::connect('/portfolio/', array('controller' => 'portfolio', 'action' => 'index'));

Перед маршрутом со звездой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...