Browse Source

Show notice for non existent controller property.

ADmad 7 years ago
parent
commit
4e11ad9236
2 changed files with 37 additions and 2 deletions
  1. 13 0
      src/Controller/Controller.php
  2. 24 2
      tests/TestCase/Controller/ControllerTest.php

+ 13 - 0
src/Controller/Controller.php

@@ -371,6 +371,19 @@ class Controller implements EventListenerInterface, EventDispatcherInterface
 
         list($plugin, $class) = pluginSplit($this->modelClass, true);
         if ($class !== $name) {
+            $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 false;
         }
 

+ 24 - 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,27 @@ class ControllerTest extends TestCase
     }
 
     /**
+     * testUndefinedPropertyError
+     *
+     * @return void
+     */
+    public function testUndefinedPropertyError()
+    {
+        $controller = new Controller();
+
+        $controller->Bar = true;
+        $this->assertTrue($controller->Bar);
+
+        $this->expectException(Notice::class);
+        $this->expectExceptionMessage(sprintf(
+            'Undefined property: Controller::$Foo in %s on line %s',
+            __FILE__,
+            __LINE__ + 2
+        ));
+        $controller->Foo->baz();
+    }
+
+    /**
      * testLoadModel method
      *
      * @return void