我已经使用PHP了很长一段时间,但从未成为高级程序员.我觉得这是一个愚蠢的问题,但从来没有理解为什么可以使用不同的方法检索一些数组值:
这个:
$array->value
Run Code Online (Sandbox Code Playgroud)
而不是正常的:
$array['value']
Run Code Online (Sandbox Code Playgroud)
标准的$ array ['value']总是有效,但是使用 - >方法的那个有时没有.这是为什么?
这是一个例子.我正在使用Zend Framework 2,我可以使用 - >方法获取会话值:
$this->session->some_value
Run Code Online (Sandbox Code Playgroud)
但是,如果我做一个新的,正常的数组,我不能:
$array = array('some_value' => 'myvalue');
$array['some_value']; // works!!
$array->some_value; // does not work :(
Run Code Online (Sandbox Code Playgroud)
在Zend Framework 1中,大多数数组都可以这样工作,而且在ZF2中越来越多,我遇到的问题是我需要改变我获得该值的方式.这有意义吗?我当然感谢任何帮助.谢谢,格雷格
只需要了解ZF2中的一些简单数据库查询.在ZF1中我有这样简单的方法:
public function recordset()
{
// listing of all records
$db = Zend_Registry::get('db');
$sql = "SELECT " . $this->_selectlist() .
" from customer c";
$r = $db->fetchAll($sql);
return $r;
}
Run Code Online (Sandbox Code Playgroud)
在ZF2中,我该怎么做?我已经尝试了以下内容,但这只是返回看起来像"Result"对象的东西,但我想要的是像ZF1那样使用fetchAll执行的数组.如果我必须迭代结果对象只是为了稍后提供数组,然后必须重复迭代,它似乎只是一些重复工作.
无论如何,这是我到目前为止在ZF2中所拥有的:
//above the controller start I have: use Zend\Db\Adapter\Adapter as DbAdapter;
public function blaAction()
{
$db = new DbAdapter(
array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=mydb;host=localhost',
'username' => 'root',
'password' => '',
)
);
$sql = 'select * from customer';
$stmt = $db->query($sql);
$results = $stmt->execute();
$this->view->data = $results; …Run Code Online (Sandbox Code Playgroud) 是否可以在Module.php中创建变量甚至共享对象(如DB适配器),以便在所有视图控制器中使用?(Zend Framework 2)
例如:
class Module
{
public function onBootstrap(MvcEvent $e)
{
$moduleConfig = $e->getServiceManager()->get('Config')
}
}
Run Code Online (Sandbox Code Playgroud)
在控制器中,以某种方式访问使用:
$this->moduleConfig['db']
Run Code Online (Sandbox Code Playgroud)
在上面我知道这只是数据库适配器的配置数组,但它怎么会工作?
我看到一个人可以在控制器动作中执行此操作:
$config = $this->getServiceLocator()->get('Config')
$dba = new DbAdapter($config['db']);
Run Code Online (Sandbox Code Playgroud)
我不想在每个需要配置的地方都这样做.我怎么能这样做:$ this-> config ?? 所以它适用于所有行动.更好的是,如何在整个模块中做到这一点?我知道我这一切都错了,但在ZF1中我们有Zend_Registry :: get()这样的简单事情.我正在阅读文档和各种各样的文章,但总是有一些假设,我只是迷路了.所以我真正想要的是:A)全球可访问的配置项,B)全局可访问的数据库适配器
我只想在我的控制器中调用$ this-> db或$ this-> config-> item.这可能吗?我知道我错过了一些非常简单的事情.
我也尝试使用$ this-> getServiceLocator() - > get('Config')在我的__construct中设置$ this-> config; 但我知道服务定位器在构造期间尚不可用.我尝试通过在模块的onBootstrap中设置preDispatch来做类似的事情,但我似乎无法将这些项目放入我的控制器中.
仅供参考,我在我的global.php中确实有这个(不,它不会留在那里,只是例子):
'db' => array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=mydb;host=localhost;',
'username' => 'root',
'password' => '',
'driver_options' => array(
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
),
),
Run Code Online (Sandbox Code Playgroud)
我可以使用getServiceLocator()在任何操作中访问该项和其他项.我希望这些项目可用作我的控制器属性,如$ this-> config-> item. …
我正在学习如何使用Zend Framework 2(2.1.4)表单并遇到此错误.
Call to a member function insert() on a non-object in ... /Zend/Form/Fieldset.php on line 178
Run Code Online (Sandbox Code Playgroud)
我不想使用表单自动连接到数据库,事实上我只想使用表单来帮助验证,并将从一个值数组中拉出并填充它.如何关闭表单对象中的数据库连接?
我习惯于处理ZF1表单,所以这个新的表单系统令人困惑.一旦我想到它,我们在视图脚本中使用表单元素进行格式化的方式就会很好.那些旧的装饰者很痛苦.无论如何,对我来说,使用表单而不处理绑定的数据库对象会很好.这可能吗?除了简单的表单之外,使用InputFilterAwareInterface类需要一个模型类似乎太复杂了.虽然一步一步,我甚至无法显示表格.
我感谢任何帮助.
以下是我的控制器,表单和视图脚本:
表格类:
namespace FBWeb\Form;
use Zend\Form\Form;
use Zend\Form\Element;
class ClientForm extends Form
{
public function __construct()
{
$this->setAttribute('method', 'post');
$this->add(array(
'name' => 'client',
'type' => 'Zend\Form\Element\Text',
'options' => array(
'label' => 'Client Name',
),
'attributes' => array(
'type' => 'text',
),
));
$this->add(array(
'name' => 'submit',
'attributes' => array(
'type' => 'submit',
'value' => 'Add'
),
));
}
} …Run Code Online (Sandbox Code Playgroud) 我有两个我正在尝试构建的MVC模块,一个(FBWsrv)具有JSON输出和不同的安全过程,以及用于正常Web使用的主MVC模块(FBWeb).我有所有设置的路线,大多数工作.我遇到的问题是他们都有onBootstrap方法附加他们自己的事件监听器,我想如果不在正确的MVC模块中则禁用监听器.
我的路线看起来像这样:
模块FBWeb,url中的"app"模块:
/app/controller/action/par1/val1
Run Code Online (Sandbox Code Playgroud)
模块FBWsrv,在url中是"wsrv":
/wsrv/controller/action/par1/val1
Run Code Online (Sandbox Code Playgroud)
正如我所提到的,路线工作正常.我得到了正确的控制器和动作.但问题是当我甚至没有从/ wsrv路由运行/ app时,MVC事件监听器正在两个模块上运行.如果我在/ wsrv中,我想要做的是禁用/ app中的事件.
模块的简短版本设置如下:
FBWeb/Module.php:
class Module
{
public function onBootstrap(MvcEvent $e)
{
$this->sm = $application->getServiceManager();
$this->config = $e->getApplication()->getConfig();
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
$eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'addInstanceObjects'), 5000 );
$eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'securityDispatch'), 0 );
$eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'preDispatch'), 100 );
$eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'postDispatch'), -100 );
$eventManager->attach( \Zend\Mvc\MvcEvent::EVENT_DISPATCH_ERROR, array($this, 'onDispatchError'), -5000);
}
Run Code Online (Sandbox Code Playgroud)
FBWsrv/Module.php:
class Module
{
public function onBootstrap(MvcEvent $e)
{
$this->sm = $application->getServiceManager();
$this->config = $e->getApplication()->getConfig(); …Run Code Online (Sandbox Code Playgroud)