Browse Source

Merge pull request #12593 from cakephp/controller-undefined-property

Show notice for non existent controller property.
Mark Story 7 years ago
parent
commit
6fd470c09b

+ 17 - 4
src/Controller/Controller.php

@@ -370,11 +370,24 @@ class Controller implements EventListenerInterface, EventDispatcherInterface
         }
 
         list($plugin, $class) = pluginSplit($this->modelClass, true);
-        if ($class !== $name) {
-            return false;
-        }
+        if ($class === $name) {
+            return $this->loadModel($plugin . $class);
+        }
+
+        $trace = debug_backtrace();
+        $parts = explode('\\', get_class($this));
+        trigger_error(
+            sprintf(
+                'Undefined property: %s::$%s in %s on line %s',
+                array_pop($parts),
+                $name,
+                $trace[0]['file'],
+                $trace[0]['line']
+            ),
+            E_USER_NOTICE
+        );
 
-        return $this->loadModel($plugin . $class);
+        return false;
     }
 
     /**

+ 1 - 1
src/View/ViewVarsTrait.php

@@ -74,7 +74,7 @@ trait ViewVarsTrait
         $builder = $this->viewBuilder();
         if ($viewClass === null && $builder->getClassName() === null) {
             $builder->setClassName($this->viewClass);
-            unset($this->viewClass);
+            $this->viewClass = null;
         }
         if ($viewClass) {
             $builder->setClassName($viewClass);

+ 28 - 2
tests/TestCase/Controller/ControllerTest.php

@@ -23,6 +23,7 @@ use Cake\Http\Response;
 use Cake\Http\ServerRequest;
 use Cake\Routing\Router;
 use Cake\TestSuite\TestCase;
+use PHPUnit\Framework\Error\Notice;
 use TestApp\Controller\Admin\PostsController;
 use TestPlugin\Controller\TestPluginController;
 
@@ -271,7 +272,7 @@ class ControllerTest extends TestCase
         $Controller = new Controller($request, $response);
         $Controller->modelClass = 'SiteArticles';
 
-        $this->assertFalse($Controller->Articles);
+        $this->assertFalse(isset($Controller->Articles));
         $this->assertInstanceOf(
             'Cake\ORM\Table',
             $Controller->SiteArticles
@@ -280,7 +281,7 @@ class ControllerTest extends TestCase
 
         $Controller->modelClass = 'Articles';
 
-        $this->assertFalse($Controller->SiteArticles);
+        $this->assertFalse(isset($Controller->SiteArticles));
         $this->assertInstanceOf(
             'TestApp\Model\Table\ArticlesTable',
             $Controller->Articles
@@ -288,6 +289,31 @@ class ControllerTest extends TestCase
     }
 
     /**
+     * testUndefinedPropertyError
+     *
+     * @return void
+     */
+    public function testUndefinedPropertyError()
+    {
+        $controller = new Controller();
+
+        $controller->Bar = true;
+        $this->assertTrue($controller->Bar);
+
+        if (class_exists(Notice::class)) {
+            $this->expectException(Notice::class);
+        } else {
+            $this->expectException(\PHPUnit_Framework_Error_Notice::class);
+        }
+        $this->expectExceptionMessage(sprintf(
+            'Undefined property: Controller::$Foo in %s on line %s',
+            __FILE__,
+            __LINE__ + 2
+        ));
+        $controller->Foo->baz();
+    }
+
+    /**
      * testLoadModel method
      *
      * @return void

+ 1 - 2
tests/TestCase/Error/ExceptionRendererTest.php

@@ -32,7 +32,6 @@ use Cake\Http\Exception\MethodNotAllowedException;
 use Cake\Http\Exception\NotFoundException;
 use Cake\Http\ServerRequest;
 use Cake\Mailer\Exception\MissingActionException as MissingMailerActionException;
-use Cake\Network\Exception\SocketException;
 use Cake\ORM\Exception\MissingBehaviorException;
 use Cake\Routing\DispatcherFactory;
 use Cake\Routing\Exception\MissingControllerException;
@@ -284,7 +283,7 @@ class ExceptionRendererTest extends TestCase
     public function testCakeErrorHelpersNotLost()
     {
         static::setAppNamespace();
-        $exception = new SocketException('socket exception');
+        $exception = new NotFoundException();
         $renderer = new \TestApp\Error\TestAppsExceptionRenderer($exception);
 
         $result = $renderer->render();