dqls67891 2016-09-23 12:19
浏览 37
已采纳

如何在Zend Framework 3中调用Controller的模型方法

I apologize for not framing the question title correctly. I am working on skeleton Application of zf3 to implement acl.I couldn't figure how to retrieve the row of corresponding email address.I have two controllers AlbumController.php and LoginController.php AlbumController.php

private $table;
public function __construct(AlbumTable $table)
{
    $this->table = $table;
}
public function deleteAction()
{
    $user_session=new Container('user');
    if(isset($user_session->email))
    {
      $row=$this->loginTable->getRow($user_session->email);//*Here is the problem*
        if($row['role']=='admin')
        {
            $acl=new Acl();
            if($acl->isAllowed('admin','AlbumController','delete'))
            {
                 $id = (int) $this->params()->fromRoute('id', 0);
                if (!$id) {
                    return $this->redirect()->toRoute('album');
                }
            $request = $this->getRequest();
            if ($request->isPost()) {
                $del = $request->getPost('del', 'No');

                if ($del == 'Yes') {
                    $id = (int) $request->getPost('id');
                    $this->table->deleteAlbum($id);
                }
                return $this->redirect()->toRoute('album');
            }
            return [
                'id'    => $id,
                'album' => $this->table->getAlbum($id),
            ];
    }
        }
     return $this->redirect()->toRoute('login');
     }
   }

LoginController.php

public $user_session;
public $loginTable;
public function __construct(LoginTable $loginTable)
{
 $this->loginTable = $loginTable;
}

I am calling getRow() method of LoginTable.php present in Model LoginTable.php. But it is throwing an error Call to a member function getRow() on a non-object

LoginTable.php

class LoginTable
{
protected $tableGateway;
public function __construct(TableGateway $tableGateway)
 {
     $this->tableGateway = $tableGateway;
 }
public function getRow($mail)
{
     $email  =  $mail;
     $rowset = $this->tableGateway->select(array('email' => $email));
     $row = $rowset->current();
     if (!$row) {
         throw new \Exception("Could not find row $email");
     }
     return $row;
}
  • 写回答

1条回答 默认 最新

  • dongyin2885 2016-09-23 20:24
    关注

    You are calling $this->loginTable->getRow() in your AlbumController class, but you didn't define loginTable in this controller. You did it in your LoginController class, but this is not the same objects.

    Inject a LoginTable instance in your AlbumController:

    AlbumController.php

    ....
    
    private $albumTable;
    private $loginTable;
    
    public function __construct(AlbumTable $albumTable, LoginTable $loginTable)
    {
        $this->albumTable= $albumTable;
        $this->loginTable= $loginTable;
    }
    
    ....
    

    AlbumControllerFactory.php (adapt to your code):

    class AlbumControllerFactory implements FactoryInterface
    {
        public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
        {
            return new AlbumController(
                $container->get(AlbumTable::class),
                $container->get(LoginTable::class)
            );
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。