0

My problem started right after I upgraded PHP to Version 7 and Phalcon to Version 3.

Problem

I m getting blank page, no error messages (Error is turned on), no `500 Internal server' error in console. The site used to work flawlessly before.

I have following controller 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";
   } 
}

The index action doesnot render anything, but yes HELLO WORLD is printed, so there seems there is no errors in code above that line.

My bootstrap 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();

Have followed This Link as well, but with not much help.

UPDATE No errors on Server's error log

Thanks

WatsMyName
  • 4,240
  • 5
  • 42
  • 73
  • 1
    As you might already know, "Error 500" is not meaningful by itself. Have you enabled full error reporting in PHP? Have you verified all the error logs, including those from the web server software? (Apache, Nginx, IIS...) – Álvaro González Aug 16 '16 at 06:22
  • @ÁlvaroGonzález I went through Apache error log, `No error at all` – WatsMyName Aug 16 '16 at 06:26
  • If you change your try catch to catch `\Exception` instead of `\Phalcon\Exception`, does that give you more information about the error? – Timothy Aug 16 '16 at 07:15
  • @Timothy, Well no error at all. Moreover method `indexAction` is echoing `Hello World` – WatsMyName Aug 16 '16 at 08:00
  • Have you enabled full error reporting in PHP? Have you verified **all the error logs**? – Álvaro González Aug 16 '16 at 08:56
  • @ÁlvaroGonzález yes error reporting is set to `E_ALL` and have set up a virtual host to log error reporting for each domains separately. And for this particular one, there is nothing in error log file. – WatsMyName Aug 16 '16 at 09:24

1 Answers1

1

I think I solved this issue. The issue was in Module.php, the issue was in method

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();
        }
    }

Where, $module_name is a property defined in class.

In above code $this->module_name was undefined. so I changed above method to -

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();
        }
    }

I wondered why it was working in previous version of Phalcon

WatsMyName
  • 4,240
  • 5
  • 42
  • 73
  • its more likely to be the php7 uplift I would say, because of the way theyve decoupled the syntax check and compile phase. I still would have expected it to report an error though. Might be worth reporting. – DevDonkey Aug 19 '16 at 07:40
  • No I have same issue in `PHP 5.6`, `Phalcon 3` as well – WatsMyName Aug 19 '16 at 08:20