2016-01-28 3 views
2

Problème: Conversion de mon code Laravel 4 en Laravel 5.2. Je suis sur le point de déplacer et de convertir mes vues et ne peux pas passer l'erreur suivante.Tentative d'affectation de propriété de non-objet - Laravel 5.2

Erreur: ErrorException en ligne IndexController.php 27: Tentative de céder la propriété de non-objet

Informations de débogage:

  1. en ligne IndexController.php 27
  2. à HandleExceptions-> handleError ('2', 'Tentative d'affectation de la propriété de non-objet', 'C: \ Apache24 \ B2B_Contracts \ app \ Http \ Contrôleurs \ IndexController.php', '27', array ('numberofpcs' => objet (annonce ditionalPCs), 'addtpcs' => array ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22 ',' 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47 «, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72 ", 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97 », '98', '99', '100'))) dans la ligne IndexController.php 27
  3. à IndexController-> index()

Demande: S'il vous plaît aider à comprendre pourquoi l'erreur se présente et s'il vous plaît expliquer en détail comment l'éviter et ce que je fais mal avec l'exemple, si possible. J'ai reçu une erreur similaire sur Laravel 4 après que j'eus commencé la base de données, mais j'ai été en mesure d'actualiser les migrations et de réanimer la base de données et tout recommencerait à fonctionner. Cela ne fonctionne pas avec cette erreur dans Laravel 5. Ce code fonctionne sur L4.

tentatives: Je lis beaucoup sur Google et ont essayé différents éléments tels que php artisan clair décompilées, vidage autoload compositeur, artisan php optimisez en vain. Je crois que l'erreur provient de $ numberofpcs = new additionalPCs(); Cependant, je n'ai pas été en mesure de confirmer cela. J'ai également enlevé toutes les variables que j'envoie à la vue et l'erreur a persisté alors cela ressemblait à $ this-> layout-> content = View :: make ('index');

IndexController.php

<?php 

namespace App\Http\Controllers; 

use Illuminate\Http\Request; 
use App\Library\additionalPCs; 
use App\Http\Requests; 
use App\Http\Controllers\Controller; 
use View; 
use App\Models\businesstype; 
use App\Models\contractterm; 


class IndexController extends BaseController 
{ 
    Protected $layout = 'master'; 
    /** 
    * Display a listing of the resource. 
    * 
    * @return Response 
    */ 
    public function index() 
    { 
     /** Wayne - 03-02-2014 - Moved for loop to a method within its own class. */ 
     $numberofpcs = new additionalPCs(); 
     $addtpcs=$numberofpcs->display(); 
     $this->layout->content = View::make('index')->with('addtpcs', $addtpcs)->with('businesstypelist', businesstype::dropdown())->with('contracttermlist',ContractTerm::dropdown()); 
    } 
} 

additionalPCs.php

<?php 
namespace App\Library; 

use App\Library\additionalComputer; 

class additionalPCs extends additionalComputer { 
    public function display() { 
     return $this->displayMenu();  
    } 
} 

additionalComputer.php

<?php 
namespace App\Library; 
/** Counts up the Number of Additional PC Options 
* and stores them into an array then sends them to the view. 
*/ 
    class additionalComputer { 
     protected function displayMenu() { 
      $addtpcs= []; 
      for ($i=0; $i <= 100; $i++) { 
      $addtpcs[$i] = $i; 
      } 
     return $addtpcs; 
     } 

    } 

BaseController.php-(Ceci est seulement ici pour montrer que j'ai un fichier BaseController.php pour IndexController Je suis conscient que L5 ne vient pas avec un par défaut..)

<?php 
namespace App\Http\Controllers; 

class BaseController extends Controller { 

    /** 
    * Setup the layout used by the controller. 
    * 
    * @return void 
    */ 
    protected function setupLayout() 
    { 
     if (! is_null($this->layout)) 
     { 
      $this->layout = View::make($this->layout); 
     } 
    } 

} 

Répondre

0
me

Patricus a aidé à trouver cette réponse, mais je voulais poster parce que la réponse fournie avait encore des problèmes lorsque je tentais il. Il avait cependant raison de ne plus pouvoir utiliser les Layouts de Contrôleur.

j'ai changé

$this->layout->content = View::make('index')->with('addtpcs', $addtpcs)->with('businesstypelist', businesstype::dropdown())->with('contracttermlist',ContractTerm::dropdown()); 

à

return view('index')->with('addtpcs', $addtpcs)->with('businesstypelist', businesstype::dropdown())->with('contracttermlist',ContractTerm::dropdown()); 

Cette résolu cette question.

0

Le contrôleur La fonctionnalité de mise en forme a été supprimée dans Laravel 5. Pour cette raison, la méthode setupLayout() n'est pas appelée, ce qui signifie que votre propriété layout reste la seule chaîne "maître". Puisque c'est juste une chaîne, quand vous faites $this->layout->content = ..., vous essayez d'assigner une propriété d'un non-objet.

Je crois que vous devriez être en mesure d'ajouter de nouveau si vous le souhaitez. Dans votre BaseController, vous devrez remplacer la méthode callAction à la façon dont il était:

public function callAction($method, $parameters) 
{ 
    $this->setupLayout(); 

    $response = call_user_func_array(array($this, $method), $parameters); 

    // If no response is returned from the controller action and a layout is being 
    // used we will assume we want to just return the layout view as any nested 
    // views were probably bound on this view during this controller actions. 

    if (is_null($response) && ! is_null($this->layout)) { 
     $response = $this->layout; 
    } 

    return $response; 
} 
+0

J'ai ajouté ce code au BaseController mais j'ai reçu l'erreur suivante: FatalErrorException dans IndexController.php ligne 3: L'instruction de déclaration d'espace de nom doit être la première instruction ou après tout appel de déclaration dans le script. J'ai essayé de déplacer l'espace de noms App \ Http \ Controllers; juste après scrfix

+0

Merci de m'avoir fait savoir que L5 ne supporte plus la fonctionnalité de disposition de contrôleur. Comment devrais-je faire ça alors? retour vue ('salutation') -> avec ('nom', 'Victoria'); comme pris ici: https://laravel.com/docs/5.2/views#basic-usage - Puis-je faire cela à partir du contrôleur ou est en train de retourner les vues du contrôleur supprimé? – scrfix

+0

Il m'a fallu un peu mais il semble que je peux changer $ this-> layout-> content = View :: make ('index') -> avec ('addtpcs', $ addtpcs) -> avec ('businesstypelist' , businesstype :: dropdown()) -> avec ('contracttermlist', ContractTerm :: dropdown()); pour retourner view ('index') -> avec ('addtpcs', $ addtpcs) -> avec ('businesstypelist', businesstype :: dropdown()) -> avec ('contracttermlist', ContractTerm :: dropdown()); et cela m'amène à ma prochaine erreur. Je ne peux pas marquer la réponse ci-dessus comme correcte car il y a toujours une erreur quand j'utilise ce qui est indiqué ci-dessus, donc tout le monde qui se trouve dans ce cas se retrouvera avec la même erreur en l'utilisant. – scrfix