【问题标题】:CakePHP AppController.php issuesCakePHP AppController.php 问题
【发布时间】:2018-06-02 11:52:05
【问题描述】:

我遇到了 cakephp 脚本的问题。它是用 cakephp 2.5.1 版编写的。

我遇到致命错误:致命错误:无法在第 46 行的 /lib/Cake/Controller/CakeErrorController.php 中调用构造函数。

原始的 AppController.php 文件如下所示:

<?php

if (session_id() == '') {
session_start();
}
class AppController
{
public $components = array('Auth');
public $helpers = array(
    0      => 'Form',
    'Html' => array('className' => 'MyHtml')
    );

public function beforeFilter()
{
    global $loguser;
    global $username;
    global $siteChanges;
    global $paypalAdaptive;
    global $user_level;
    global $setngs;
    global $price;
    global $colors;
    global $parent_categori;
    global $googlecode;
    parent::beforeFilter();
    $this->Auth->loginAction = array('controller' => '/', 'action' => '/login');
    $this->Auth->logoutRedirect = array('controller' => '/', 'action' => '/');
    $this->Auth->authenticate = array(
AuthComponent::ALL => array(
    'fields'    => array('username' => 'email', 'password' => 'password'),
    'userModel' => 'Users.User'
    ),
0                  => 'Form'
);

    if ($this->params['controller'] == 'api') {
        $this->Auth->allow();
    }

    if ($this->params['controller'] == 'fantasyhelps') {
        $this->Auth->allow();
    }

    if ($this->params['controller'] == 'paypals') {
        App::import('Vendor', 'PayPal');
    }

    $this->Auth->allow(, , 'login', 'signup', 'emailverification', 'verification', 'index', 'setpassword', 'userprofiles', 'viewshops', 'addto', 'press', 'about', 'toppeople', 'findpeople', 'storeprofiles', 'getstoreprofile', 'listings', 'show_color', 'show_price', 'showByCategory', 'getMorePosts', 'ipnprocess', 'getmorepricecolor', 'getItemByCategory', 'ajaxSearch', 'captcha', 'forgotpassword', 'showByRelation', 'getItemByRelation', 'faq', 'contact', 'item_comments', 'changePassword', 'copyrights', 'termsofsale', 'termsofservice', 'termsofmerchant', 'privacy', 'loginwith', 'loginwithtwitter', 'changecurrency', 'downimage', 'sitemaintenance', 'getviewmore', 'customviewmore', 'orderstatus', 'getsizeqty', 'searches', 'getmoregallery', 'viewitemdesc', 'followersList', 'getmoreprofile', 'getmorestorycomment', 'followingList', 'twittlogin_save', 'item_favorited', 'merupdate', 'custupdatend', 'testing', 'bookmarklet', 'getmorecomments', 'adaptiveipnprocess', 'additemusingurl', 'giftcardipnIpn', 'ggipn', 'ggcronjob', 'nearme', 'getMorenearme', 'gifts', 'story');
    $loguser = $this->Auth->user();
    $userid = $loguser[0]['User']['id'];
    $username = $loguser[0]['User']['username'];
    $first_name = $loguser[0]['User']['first_name'];
    $username_url = $loguser[0]['User']['username_url'];
    $user_level = $loguser[0]['User']['user_level'];
    $profile_image = $loguser[0]['User']['profile_image'];
    $this->set('loguser', $loguser);
    $this->set('username', $username);
    $this->set('username_url', $username_url);
    $this->set('user_level', $user_level);
    $this->set('first_name', $first_name);
    $this->set('profile_image', $profile_image);
    $this->set('currentaction', $this->params['action']);
    $this->loadModel('User');
    $user_datas = $this->User->findById($userid);

    if (!empty($loguser) && empty($user_datas)) {
        $this->Auth->logout();
    }

    $user_status_val = $this->User->find('first', array(
'conditions' => array('User.id' => $userid)
));
    $user_status = $user_status_val['User']['user_status'];

    if ($user_status == 'disable') {
        $this->Session->setFlash(__('Your account has been disabled please contact our support'), 'default', array(), 'bad');
        $this->redirect($this->Auth->logout());
        $this->redirect('/login');
    }

    $this->loadModel('Sitesetting');
    $this->loadModel('Cart');
    $this->loadModel('Orders');
    $this->loadModel('Item');
    $this->loadModel('Price');
    $this->loadModel('Color');
    $this->loadModel('Category');
    $this->loadModel('Forexrate');
    $this->loadModel('Managemodule');
    $this->loadModel('Googlecode');
    $this->loadModel('Contactseller');
    $this->loadModel('Story');
    $orderdetails = $this->Orders->find('all', array(
'conditions' => array('Orders.merchant_id' => $userid)
));
    $this->set('orderdetails', $orderdetails);
    $storyCount = $this->Story->find('count', array(
'conditions' => array('userid' => $userid)
));
    $this->set('storyCounts', $storyCount);
    $managemoduleModel = $this->Managemodule->find('first');
    $this->set('managemoduleModel', $managemoduleModel);
    $params = $this->params;
    $action = $params['action'];

    if ($this->params['controller'] != 'api') {
        $this->_setLanguage();
    }

    if (($action != 'sitemaintenance') && ($action != 'login') && ($this->params['controller'] != 'api')) {
        if (!$this->isauthenticated() || ($user_level != 'god')) {
            if ($managemoduleModel['Managemodule']['site_maintenance_mode'] == 'yes') {
                $this->redirect('/sitemaintenance');
            }
        }
    }

    $messageCount = $this->Contactseller->find('count', array(
'conditions' => array(
    'OR' => array(
        array('merchantid' => $userid, 'sellerread' => 1),
        array('buyerid' => $userid, 'buyerread' => 1)
        )
    )
));
    $_SESSION['userMessageCount'] = $messageCount;

    if (!isset($_SESSION['language_settings'])) {
        $languageJson = file_get_contents(SITE_URL . 'language_settings.json');
        $_SESSION['language_settings'] = json_decode($languageJson, true);
        $defaultLanguage = $_SESSION['language_settings']['settings']['default'];
        Configure::write('Config.language', $defaultLanguage);
    }

    if (!isset($_SESSION['currency_value'])) {
        $forexrateModel = $this->Forexrate->find('first', array(
'conditions' => array('status' => 'default')
));
        $_SESSION['currency_symbol'] = $forexrateModel['Forexrate']['currency_symbol'];
        $_SESSION['currency_value'] = $forexrateModel['Forexrate']['price'];
        $_SESSION['currency_code'] = $forexrateModel['Forexrate']['currency_code'];
        $_SESSION['default_currency_code'] = $forexrateModel['Forexrate']['currency_code'];
        $_SESSION['default_currency_symbol'] = $forexrateModel['Forexrate']['currency_symbol'];
    }

    $setngs = $this->Sitesetting->find('all');
    $price = ('all');
    $forexrateModel = $this->Forexrate->find('all', array(
'conditions' => array('status <>' => 'disable')
));
    $colors = $this->Color->find('all');
    $UserDetailss = $this->User->findById($userid);
    $this->set('UserDetailss', $UserDetailss);
    $this->loadModel('Shop');
    $sellerDetails = $this->Shop->find('all', array(
'conditions' => array('user_id' => $userid)
));
    $this->set('sellerDetails', $sellerDetails);
    $shopDetails = $this->Shop->find('first', array(
'conditions' => array('user_id' => $userid)
));
    $this->set('shop_name', $shopDetails['Shop']['shop_name']);
    $parent_categori = $this->Category->find('all', array(
'conditions' => array('category_parent' => 0)
));
    $googlecode = $this->Googlecode->find('all');

    if (!empty($userid)) {
        if (!empty($carts)) {
            foreach ($carts as $crt) {
                $itmids[] = $crt['Cart']['item_id'];
            }

            $itm_datas = $this->Item->find('all', array(
'conditions' => array('Item.id' => $itmids, 'Item.status' => 'publish')
));
            $total_itms = count($itm_datas);
            $this->set('total_itms', $total_itms);
        }
    }

    $this->set('price', $price);
    $this->set('colors', $colors);
    $this->set('forexrateModel', $forexrateModel);
    $this->set('parent_categori', $parent_categori);
    $this->set('googlecode', $googlecode);
    $this->set('media_url', $setngs[0]['Sitesetting']['media_url']);
    $this->set('setngs', $setngs);
    $siteChanges = $setngs[0]['Sitesetting']['site_changes'];
    $siteChanges = json_decode($siteChanges, true);
    $paypalAdaptive = $setngs[0]['Sitesetting']['paypaladaptive'];
    $paypalAdaptive = json_decode($paypalAdaptive, true);
    $this->set('siteChanges', $siteChanges);
    $_SESSION['site_url'] = SITE_URL;
    $_SESSION['media_url'] = SITE_URL;

    if (!empty($setngs[0]['Sitesetting']['media_url'])) {
        $_SESSION['media_host_name'] = $setngs[0]['Sitesetting']['media_server_hostname'];
        $_SESSION['media_url'] = $setngs[0]['Sitesetting']['media_url'];
        $_SESSION['media_server_username'] = $setngs[0]['Sitesetting']['media_server_username'];
        $_SESSION['media_server_password'] = $setngs[0]['Sitesetting']['media_server_password'];
    }

    $params = $this->params;
    $action = $params['action'];
    $this->set('action', $action);

    if ($this->params['controller'] != 'api') {
        $this->_setLanguage();
    }
}

public function isauthenticated()
{
    $user = $this->Auth->user();

    if (!empty($user)) {
        return true;
    }

    return false;
}

public function isauthorized()
{
    $user = $this->Auth->user();
    if (($user[0]['User']['user_level'] == 'god') || ($user[0]['User']['user_level'] == 'moderator')) {
        return true;
    }

    return false;
}

public function isauthorizedpersn()
{
    $user = ();
    if (($user[0]['User']['user_level'] == 'god') || ($user[0]['User']['user_level'] == 'shop')) {
        return true;
    }

    return false;
}

public function _setLanguage()
{
    if (isset($this->Cookie) && $this->Cookie->read('lang') && !$this->Session->check('Config.language')) {
        $this->Session->write('Config.language', $this->Cookie->read('lang'));
    }
    else if (isset($this->params['language']) && ($this->params['language'] != $this->Session->read('Config.language'))) {
        $this->Session->write('Config.language', $this->params['language']);
        $this->Cookie->write('lang', $this->params['language'], false, '20 days');
    }
}
}


$config['Settings'] = Configure::read('Settings');
define('SITE_URL', $config['Settings']['SITE_URL']);
define('SITE_NAME', $config['Settings']['SITE_TITLE']);
define('FB_ID', $config['Settings']['FB_ID']);
define('FB_SECRET', $config['Settings']['FB_SECRET']);
define('GOOGLE_ID', $config['Settings']['GOOGLE_ID']);
define('GOOGLE_SECRET', $config['Settings']['GOOGLE_SECRET']);
define('TWITTER_ID', $config['Settings']['TWITTER_ID']);
define('TWITTER_SECRET', $config['Settings']['TWITTER_SECRET']);
define('GMAIL_CLIENT_SECRET', $config['Settings'] 
['GMAIL_CLIENT_SECRET']);
define('GMAIL_CLIENT_ID', $config['Settings']['GMAIL_CLIENT_ID']);

?>

第一个错误指向这一行: $this->Auth->allow(, , 'login', 'signup', 'emailverification', 所以我删除了 , ,因此它变成了: $this->Auth->allow('login', 'signup', 'emailverification',

第二个错误指​​向这一行 $user = (); 所以我把它改成了 $user = $this->Auth->user();

但是这个变化来自 $user = ();到 $user = $this->Auth->user();引发致命错误: 致命错误:无法在第 46 行的 /lib/Cake/Controller/CakeErrorController.php 中调用构造函数

下面是 CakeErrorController.php 的内容。我听说 CakeErrorController.php 是一个核心文件,所以我真的不需要更改它吗?

<?php
/**
 * Error Handling Controller
 *
 * Controller used by ErrorHandler to render error views.
 *
 * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
 * Copyright (c) Cake Software Foundation, Inc. 
(http://cakefoundation.org)
*
* Licensed under The MIT License
* For full copyright and license information, please see the 
LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @copyright     Copyright (c) Cake Software Foundation, Inc. 
(http://cakefoundation.org)
* @link          http://cakephp.org CakePHP(tm) Project
* @package       Cake.Controller
* @since         CakePHP(tm) v 2.0
* @license       http://www.opensource.org/licenses/mit-license.php MIT 
License
*/

App::uses('AppController', 'Controller');

/**
* Error Handling Controller
*
* Controller used by ErrorHandler to render error views.
*
* @package       Cake.Controller
*/
class CakeErrorController extends AppController {

/**
* Uses Property
*
* @var array
*/
public $uses = array();

/**
* Constructor
*
* @param CakeRequest $request
* @param CakeResponse $response
*/
public function __construct($request = null, $response = null) {
    parent::__construct($request, $response);
    $this->constructClasses();
    if (count(Router::extensions()) &&
        !$this->Components->attached('RequestHandler')
    ) {
        $this->RequestHandler = $this->Components- 
 >load('RequestHandler');
    }
    if ($this->Components->enabled('Auth')) {
        $this->Components->disable('Auth');
    }
    if ($this->Components->enabled('Security')) {
        $this->Components->disable('Security');
    }
    $this->_set(array('cacheAction' => false, 'viewPath' => 'Errors'));
}

}

我需要帮助来解决您在 AppController.php 文件中发现的任何问题。我是新来的。任何帮助都感激不尽。 谢谢。

【问题讨论】:

    标签: php cakephp


    【解决方案1】:

    首先,我不想踩到任何人的脚趾,但是,该代码看起来很糟糕,有很多错误我什至不知道从哪里开始...global 用法,访问直接超全局变量,通过本机调用手动启动会话,类定义之外的代码,不是实际操作的公共控制器方法,应该在具体控制器和/或组件中的大量不相关代码等......你真的需要把它清理干净。

    话虽如此,您的AppController 类没有扩展Controller(它必须这样做)并且本身没有构造函数,因此没有构造函数可以通过@ 中的parent::__construct() 调用987654327@,因此出现错误。

    另请参阅Cookbook > Controllers

    【讨论】:

    • 嗨@ndm,感谢您的回复。我从不愿意帮助解决问题的第三方那里获得了代码。我被告知代码写得很糟糕。您能否帮我纠正您提到的两个问题:您的 AppController 类没有扩展 Controller(它必须这样做)并且本身没有构造函数,因此在 CakeErrorController::__construct 中没有可以通过 parent::__construct() 调用的构造函数()。我对此很陌生,甚至不知道在哪里进行您提到的更正。感谢您的帮助。
    • @johndoedev 您只需要扩展Controller,如链接文档中所示。对于正确的形式,您还需要导入它。您可以检查新的 CakePHP 设置的来源,以了解事情的样子:github.com/cakephp/cakephp/blob/2.10.10/app/Controller/…
    • 感谢该链接。我添加了类 AppController extends Controller 现在我可以看到网站的一部分正在显示!你能告诉我如何做你建议的构造函数部分吗?代码示例以及放置它的位置将不胜感激。谢谢。
    • @johndoedev 不需要添加构造函数,这只是错误发生原因的部分解释,即因为任何父项中都没有构造函数。
    • 我已接受您的回答。谢谢。我只需要找一个有经验的 cakephp 程序员来解决其他各种错误并为我清理代码库。感谢您今天的帮助!
    猜你喜欢
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-08
    • 2011-07-07
    相关资源
    最近更新 更多