【问题标题】:Phalcon 3 and PHP 7 breaking the existing sitePhalcon 3 和 PHP 7 打破现有网站
【发布时间】:2016-08-16 06:19:32
【问题描述】:

在我将 PHP 升级到 Version 7 并将 Phalcon 升级到 Version 3 之后,我的问题就开始了。

问题

我得到空白页,没有错误消息 (Error is turned on),控制台中没有“500 内部服务器”错误。该网站以前可以完美运行。

我有以下控制器IndexController.php

<?php

namespace RealEstate\Property\Controllers;

use \Phalcon\Mvc\Controller;
use \Phalcon\Mvc\View;
use  RealEstate\Common\Models as CommonModels;

class IndexController extends Controller
{
   public function initialize(){
          //Code here
   }

   public function indexAction(){
       $this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);

       $this->view->setVar("total_properties", $this->utils->getTotalProperties());    
       $this->view->pick("index");
       echo "HELLO WORLD";
   } 
}

index 操作不会渲染任何内容,但是会打印 HELLO WORLD,因此该行上方的代码似乎没有错误。

我的引导程序index.php

<?php

namespace RealEstate;

use \Phalcon\Mvc\Application;
use \Phalcon\DI\FactoryDefault;
use \Phalcon\Loader;
use \Phalcon\Mvc\Router;
use \Phalcon\Mvc\View;
use \Phalcon\Mvc\Dispatcher;
use \Phalcon\Events\Manager         as EventManager;
use \Phalcon\Assets\Manager         as Assets;
use \Phalcon\Mvc\Url                as UrlProvider;
use \Phalcon\Db\Adapter\Pdo\Mysql   as DbAdapter;
use \Phalcon\Flash\Session          as FlashSession;
use \Phalcon\Session\Adapter\Files  as SessionAdapter;
use \Phalcon\Http\Response\Cookies; 

//use \Phalcon\Session\Adapter\Files    as Session;

class MyApplication extends Application
{

    const DEFAULT_MODULE = "property";
    private $prConfig;
    /**
     * Register the services here to make them general or register in the ModuleDefinition to make them module-specific
     */

    protected function _registerServices()
    {
        try{
            $config = include  "../apps/config/config.php";


            $di = new FactoryDefault();

            $loader = new Loader();

            /**
             * We're a registering a set of directories taken from the configuration file
             */
            $loader->registerDirs(
                array(
                    __DIR__ . '/../apps/library/',
                    __DIR__ . '/../apps/plugins/'
                )
            );

            $loader->registerNamespaces(array(
                'RealEstate\Common\Plugins' => '../apps/plugins/',
                'RealEstate\Common\Models' => '../apps/common/models/',
                'RealEstate\Library\Pagination' => '../apps/library/',
                'Facebook' =>  __DIR__.'/../apps/plugins/FacebookSDK/'
            ));

            $loader->registerClasses(array(
                 "FacebookLib"   =>  __DIR__.'/../apps/library/FacebookLib.php',
                 "Facebook" =>  __DIR__.'/../apps/plugins/FacebookSDK/autoload.php',
                 "MobileDetect" => __DIR__.'/../apps/library/MobileDetect.php'
            ));


            $loader->register();


            $di->set('config', $config, true);


            //Register assets like CSS and JS
            $di->set("assets",function(){
                $assets = new Assets();

                $cdnUrl = $this->cdnurl;
                //Add CSS to collection. "true" means we're using base url for css path
                $assets->collection('css')->addCss($cdnUrl.'assets/css/frontend/combined.css?v=44');
                $assets->collection('footer')->addJs($cdnUrl.'assets/js/frontend/combined.js?v=44', false);

                return $assets;
            });

            $this->prConfig = $config;

            //register base url
            $di->set('baseurl', function() use ($config){
                $url = $config->application->baseUri;
                return $url;
            });

            //register CDN url
            $di->set('cdnurl', function() use ($config){
                $url = $config->application->cdnUri;
                return $url;
            });


            //Module Information
            $di->set('appconfig', function() use ($config){
                $appconfig = $config->application;
                return $appconfig;
            });

            //Register URL helper
            //set base url
            $di->set('url', function() use ($config){
                $url = new UrlProvider();
                $url->setBaseUri($config->application->baseUri);
                return $url;
            });


            //Register dependency for a database connection
            $di->setShared('db', function() use ($config){
                return new DbAdapter(array(
                    "host" => $config->database->host,
                    "username" => $config->database->username,
                    "password" => $config->database->password,
                    "dbname" => $config->database->dbname
                ));
            });

            //Register and start session
            $di->setShared('session', function() {
                $session = new SessionAdapter();
                $session->start();
                return $session;
            });

            //Register custom library Utilities, so that it is available through out the application    
            $di->setShared("utils",function(){
                return new \Utilities();
            });

            //Registering a router
            $di->set('router', function() use ($config){

                $router = new Router(false);


                $controller = "index";
                /*Backend Routers Configuration Start*/

                $modules = $config->modules;


                $router->add('/', array(
                        'module' => 'property',
                        'namespace' => 'RealEstate\Property\Controllers\\',
                        'controller' => 'index',
                        'action' => 'index'
                ));

                $router->add('/:int', array(
                        'module' => 'property',
                        'namespace' => 'RealEstate\Property\Controllers\\',
                        'controller' => 'index',
                        'action' => 'index',
                        'params' =>1
                ));

                //other router settings


                $router->notFound(array(
                    'module' => 'errors',
                    'namespace' => 'RealEstate\Errors\Controllers\\',
                    'controller' => 'index',
                    'action' => 'show404'
                ));


                $router->removeExtraSlashes(true); //ignore trailing slash in urls
                /*Backend Routers Configuration End*/
                return $router;

            });

            $di->set('partials', function() {
                $partials = new View();
                $partials->setPartialsDir('../apps/common/views/');
                return $partials;
            });

            $this->setDI($di);
        }catch(\Phalcon\Exception $e){
            echo get_class($e), ": ", $e->getMessage(), "\n";
            echo " File=", $e->getFile(), "\n";
            echo " Line=", $e->getLine(), "\n";
            echo $e->getTraceAsString();
        }

    }


    public function main()
    {

        try{
            if (!extension_loaded('phalcon')) {
                die("Phalcon extension is not installed or enabled. Please check with host");
            }


            $this->_registerServices();

            if($this->prConfig->application->environment=="development" || $_GET["showerrors"]==1){
                ini_set("display_errors","On");
                error_reporting(E_ALL ^ E_NOTICE);
            }

            $arraytemp = json_decode(json_encode($this->prConfig->modules), true); //convert Config object to a simple array
            //$this->utils->printr($arraytemp,1);
            $keys = array_keys($arraytemp);
            $array = array();

            if(count($keys)>0){
                foreach($keys as $module){
                    $array[$module]["className"] = "RealEstate\\".ucwords($module)."\Module";
                    $array[$module]["path"] = "../apps/modules/".$module."/Module.php";
                }
            }else{
                die("The entries for modules not found.");
            }

            $this->registerModules($array);
            echo $this->handle()->getContent();

        }catch(\Phalcon\Exception $e){
            echo get_class($e), ": ", $e->getMessage(), "\n";
            echo " File=", $e->getFile(), "\n";
            echo " Line=", $e->getLine(), "\n";
            echo $e->getTraceAsString();
        }
    }

}

$application = new MyApplication();
$application->main();

也关注了This Link,但没有太多帮助。

更新 服务器的错误日志没有错误

谢谢

【问题讨论】:

  • 您可能已经知道,“错误 500”本身没有意义。您是否在 PHP 中启用了完整的错误报告?您是否验证了所有错误日志,包括来自 Web 服务器软件的错误日志? (Apache、Nginx、IIS...)
  • @ÁlvaroGonzález 我查看了 Apache 错误日志,No error at all
  • 如果您将 try catch 更改为 catch \Exception 而不是 \Phalcon\Exception,是否会为您提供有关错误的更多信息?
  • @Timothy,完全没有错误。此外方法indexAction正在回显Hello World
  • 您是否在 PHP 中启用了完整的错误报告?您是否验证了所有错误日志

标签: php phalcon


【解决方案1】:

我想我解决了这个问题。问题出在Module.php,问题出在方法中

public function registerServices($di)
    {

        try{
            //Registering the view component
            $di->set('view', function() {
                $view = new View();
                $view->setViewsDir('../apps/modules/'.$this->module_name.'/views/');
                return $view;
            });

        }catch(\Phalcon\Exception $e){
            echo get_class($e), ": ", $e->getMessage(), "\n";
            echo " File=", $e->getFile(), "\n";
            echo " Line=", $e->getLine(), "\n";
            echo $e->getTraceAsString();
        }
    }

其中,$module_name 是在类中定义的属性。

在上面的代码中,$this-&gt;module_name 是未定义的。所以我把上面的方法改成了-

public function registerServices($di)
    {
        $module = $this->module_name;

        try{
            //Registering the view component
            $di->set('view', function() use($module) {
                $view = new View();
                $view->setViewsDir('../apps/modules/'.$module.'/views/');
                return $view;
            });

        }catch(\Phalcon\Exception $e){
            echo get_class($e), ": ", $e->getMessage(), "\n";
            echo " File=", $e->getFile(), "\n";
            echo " Line=", $e->getLine(), "\n";
            echo $e->getTraceAsString();
        }
    }

我想知道为什么它可以在以前版本的 Phalcon 中工作

【讨论】:

  • 我会说它更有可能是 php7 的提升,因为他们将语法检查和编译阶段解耦的方式。我仍然希望它会报告错误。可能值得报道。
  • 不,PHP 5.6Phalcon 3 也有同样的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-12
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多