Jam*_*tas 0 php dependency-injection yii2
我是Yii2的新手,我正在尝试使用依赖注入.
在我的方案一个Pedido可以有一个Servico和Servico有许多Pedidos.这是Pedido类模型:
<?php
namespace app\models;
use Yii;
/**
* This is the model class for table "pedido".
*
* @property integer $id
* @property string $data
* @property integer $servico_id
*
* @property Servico $servico
*/
class Pedido extends \yii\db\ActiveRecord
{
public static function tableName()
{
return 'pedido';
}
public function rules()
{
return [
[['data', 'servico_id'], 'required'],
[['data'], 'safe'],
[['servico_id'], 'integer']
];
}
public function attributeLabels()
{
return [
'id' => Yii::t('app', 'ID'),
'data' => Yii::t('app', 'Data'),
'servico_id' => Yii::t('app', 'Servico ID'),
];
}
/**
* @return \yii\db\ActiveQuery
*/
public function getServico()
{
return $this->hasOne(Servico::className(), ['id' => 'servico_id']);
}
}
Run Code Online (Sandbox Code Playgroud)
这是Servico模型类
<?php
namespace app\models;
use Yii;
/**
* This is the model class for table "servico".
*
* @property integer $id
* @property string $descricao
* @property string $valor
* @property integer $quantidade
*
* @property Pedido[] $pedidos
*/
class Servico extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'servico';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['descricao', 'valor'], 'required'],
[['valor'], 'number'],
[['quantidade'], 'integer'],
[['descricao'], 'string', 'max' => 1000]
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => Yii::t('app', 'ID'),
'descricao' => Yii::t('app', 'Descrição'),
'valor' => Yii::t('app', 'Valor'),
'quantidade' => Yii::t('app', 'Quantidade'),
];
}
/**
* @return \yii\db\ActiveQuery
*/
public function getPedidos()
{
return $this->hasMany(Pedido::className(), ['servico_id' => 'id']);
}
}
Run Code Online (Sandbox Code Playgroud)
在我的PedidoController类中,我想要注入Servico类.我创建了一个construtor并以这种方式更改了actionCreate:
<?php
namespace app\controllers;
use Yii;
use app\models\Pedido;
use app\models\Servico;
use app\models\PedidoSearch;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\di\Container;
/** * PedidoController implements the CRUD actions for Pedido model. */
class PedidoController extends Controller {
public Servico $servicoModel;
public function __construct(Servico $servicoModel, $config = [])
{
$this->$servicoModel = $servicoModel;
parent::__construct($config);
}
public function actionCreate()
{
$model = new Pedido();
//
$container = new Container();
$container->set('servico', 'app\models\Servico');
$servicoModel = $container->get('servico');
if ($model->load(Yii::$app->request->post()) && $model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我在索引操作上遇到此错误时:
PHP解析错误 - yii\base\ErrorException语法错误,意外的'Servico'(T_STRING),期望变量(T_VARIABLE)
在这条线上
public Servico $ servicoModel;
我做错了什么?
你的错误与DI无关.错误在这一行:public Servico $servicoModel;
.你是用Java
风格写的,而不是PHP
.改为:
public $servicoModel = null;
Run Code Online (Sandbox Code Playgroud)
编辑.
把你__construct
改成这个:
public function __construct($id, $module, Servico $servicoModel, $config = [])
{
$this->servicoModel = $servicoModel;
parent::__construct($id, $module, $config);
}
Run Code Online (Sandbox Code Playgroud)
你的错误:
1)$this->$servicoModel
对象属性写道$this->VARIABLE_NAME
,$
在VARIABLE_NAME之前没用.
2)构造controller
第一和第二参数是$id
,$module
.请参阅 - https://github.com/yiisoft/yii2/blob/master/framework/base/Controller.php#L77
归档时间: |
|
查看次数: |
4431 次 |
最近记录: |