ZF2.0用户向导 —— 6. 数据库及模型(Models)

保姆级教程:Ollama v0.6.6 离线升级后如何无缝衔接你的Qwen3系列模型库 本文提供Ollama v0.6.6离线升级后无缝衔接Qwen3系列模型库的详细教程。从版本确认、模型备份到二进制替换和环境配置,逐步解决升级过程中常见的模型加载问题,确保Qwen3等大语言模型顺利运行。特别针对Linux系统下的权限和服务配置进行优化指导。 阅读详情

数据库

 

现在我们已经建立好了一个拥有控制器及其方法以及显示层脚本的模块,现在就让我们来看看应用的模型层部分。记住模型层是处于应用中处理核心问题的部分(所以也被称为“业务层”),换句话说,就是处理数据库。我们将会使用 Zend\Db\TableGateway\TableGateway 这个类,专门对数据库进行增、删、改、查的作用。

 

我们通过PHP的PDO方式来连接MySQL,然后创建一个名为 “zf2tutorial”的数据库,执行下面的 SQL 语句来创建封面表,并且插入一些数据进去。

 

CREATE TABLE album (

  id int(11) NOT NULL auto_increment,

  artist varchar(100) NOT NULL,

  title varchar(100) NOT NULL,

  PRIMARY KEY (id)

);

INSERT INTO album(artist, title)

    VALUES ('The  Military  Wives', 'In  My  Dreams');

INSERT INTO album(artist, title)

    VALUES ('Adele',  '21');

INSERT INTO album(artist, title)

    VALUES ('Bruce  Springsteen',  'Wrecking Ball (Deluxe)');

INSERT INTO album(artist, title)

    VALUES ('Lana  Del  Rey', 'Born  To  Die');

INSERT INTO album(artist, title)

    VALUES ('Gotye',  'Making  Mirrors');

 

(当写此片教程的时候,这些测试数据是 Amazon 英国上卖的最好的唱片列表。)

我们现在已经在数据库中有一些数据了,然后我们可以针对这些数据写一个简单的模型。

 

模型文件

 

Zend Framework 并不提供一个 Zend\Model 组件作为你业务逻辑的模型,而是让你自行决定如何处理。其实这里是有很多根据你要求来选择的各种组件。一个不错的方法就是在你的应用中每个模型层代表每个实体并且使用映射对象将这些实体保存进数据库(译者注:此处的意思应该是指将信息以对象的方式存进数据库,而不是每条记录的方式存储?)。另外一个方式就是用 ORM 或者 Propel 等 ORM 方式存储。

 

因为是教程,我们就只使用 Zend\Db\TableGateway\TableGateway 类每个封面对象就是一个封面对象(或者认为是实体)来创建一个 AlbumTable 类这样的简单模型。它是基于 Table DataGateway 设计模式而实现的一种方式。因为我们考虑到在一些大的系统里面 Table Data Gateway 这种设计模式还是有局限性的。所以你可以扩展 Zend\Db\TableGateway\AbstractTableGateway 这个类来进行数据存储。但是一般也不咋用!

 

现在就让我们从模型层文件夹的封面实体类开始吧:

 

//module/Album/src/Album/Model/Album.php:

namespace Album\Model;

 

class Album

{

    public $id;

    public $artist;

    public $title;

 

    public function exchangeArray($data)

    {

        $this->id     = (isset($data['id'])) ? $data['id'] :null;

        $this->artist =(isset($data['artist'])) ? $data['artist'] : null;

        $this->title  = (isset($data['title'])) ? $data['title'] :null;

    }

}

 

我们的封面实体是个简单的PHP类。为了能够和 Zend\Db 的 TableGateway 类一起使用,我们需要实现 exchangeArray() 方法。这个方法只是简单的对$data 参数进行数据拷贝到类的属性。我们稍后会对表单的数据进行过滤。

 

但是首先,我们能够确定这个封面模型是否可以按照我们预期的运行呢?现在就让我们写一些测试来确认下。

 

//tests/module/Album/src/Album/Model/AlbumTest.php:

namespace Album\Model;

 

usePHPUnit_Framework_TestCase;

 

class AlbumTest extendsPHPUnit_Framework_TestCase

{

    public function testAlbumInitialState()

    {

        $album = new Album();

 

        $this->assertNull($album->artist,'"artist" should initially be null');

        $this->assertNull($album->id,'"id" should initially be null');

        $this->assertNull($album->title,'"title" should initially be null');

    }

 

    public functiontestExchangeArraySetsPropertiesCorrectly()

    {

        $album = new Album();

        $data = array('artist' => 'some artist',

                       'id'     => 123,

                       'title'  => 'some title');

 

        $album->exchangeArray($data);

 

        $this->assertSame($data['artist'],$album->artist, '"artist" was not set correctly');

        $this->assertSame($data['id'],$album->id, '"title" was not set correctly');

        $this->assertSame($data['title'],$album->title, '"title" was not set correctly');

    }

 

    public functiontestExchangeArraySetsPropertiesToNullIfKeysAreNotPresent()

    {

        $album = new Album();

 

        $album->exchangeArray(array('artist'=> 'some artist',

                                    'id'     => 123,

                                   'title'  => 'some title'));

        $album->exchangeArray(array());

 

        $this->assertNull($album->artist,'"artist" should have defaulted to null');

        $this->assertNull($album->id,'"title" should have defaulted to null');

        $this->assertNull($album->title,'"title" should have defaulted to null');

    }

 

    protected function setUp()

    {

        \Zend\Mvc\Application::init(include'config/application.config.php');

    }

}

 

我们测试3个问题:

 

所有的 Album 类的属性都是初始化为NULL?

当我们调用 exchangeArray() 方法的时候是不是 Album 属性都被设置正确了?

NULL被当作属性值在 $data 数组中是否有默认值?

 

如果我们运行 phpunit,我们将会知道答案都是 “YES”:

 

PHPUnit 3.5.15 bySebastian Bergmann.

 

........

 

Time: 0 seconds, Memory:5.50Mb

 

OK (8 tests, 19assertions)

 

接下来我们在模块的模型文件夹下创建我们的 AlbumTable 类,如下:

 

//module/Album/src/Album/Model/AlbumTable.php:

namespace Album\Model;

 

useZend\Db\TableGateway\TableGateway;

 

class AlbumTable

{

    protected $tableGateway;

 

    public function __construct(TableGateway$tableGateway)

    {

        $this->tableGateway = $tableGateway;

    }

 

    public function fetchAll()

    {

        $resultSet =$this->tableGateway->select();

        return $resultSet;

    }

 

    public function getAlbum($id)

    {

        $id = (int) $id;

        $rowset =$this->tableGateway->select(array('id' => $id));

        $row = $rowset->current();

        if (!$row) {

            throw new \Exception("Couldnot find row $id");

        }

        return $row;

    }

 

    public function saveAlbum(Album $album)

    {

        $data = array(

            'artist' => $album->artist,

            'title'  => $album->title,

        );

 

        $id = (int)$album->id;

        if ($id == 0) {

           $this->tableGateway->insert($data);

        } else {

            if ($this->getAlbum($id)) {

               $this->tableGateway->update($data, array('id' => $id));

            } else {

                throw new \Exception('Form iddoes not exist');

            }

        }

    }

 

    public function deleteAlbum($id)

    {

       $this->tableGateway->delete(array('id' => $id));

    }

}

 

此处我们还有很多东西准备。所以我们要在控制器中将 $tableGateway 属性设置为 TableGateway 实例。我们将要使用这一属性进行操作数据库表。

 

然后我们将会创建一些工具方法使得应用可以通过 Table gateway 来进行访问。fetchAll ()返回数据库中记录集为 ResultSet ,getAlbum() 将单条记录返回为 Album 对象,saveAlbum()是插入或者更新记录而 deleteAlbum 是完全删除某条数据。

 

使用 ServiceManager 去配置 table gateway 及注入到 Alubum表

 

为了能够使用如我们的Album表一样的实例,我们准备使用ServiceManager来定义如何创建它。最简单的方法是我们在Module类中创建getServiceConfig()方法,此方法会被ModuleManager自动调用然后注册到ServiceManager中。然后我们就能在控制器中需要的时候进行调用。

 

为了能够配置这个ServiceManager,我们即可以使得这个类成为单例或者作为一个工厂,当这个ServiceManager需要调用的时候来调用它。我们从继承getServiceConfig()这个方法到提供一个能够创建AlbumTable的工厂类。然后将这个方法添加到Module类的底部:

 

//module/Album/Module.php:

namespace Album;

 

// Add these importstatements:

use Album\Model\Album;

useAlbum\Model\AlbumTable;

useZend\Db\ResultSet\ResultSet;

useZend\Db\TableGateway\TableGateway;

 

class Module

{

    // getAutoloaderConfig() and getConfig()methods here

 

    // Add this method:

    public function getServiceConfig()

    {

        return array(

            'factories' => array(

                'Album\Model\AlbumTable'=>  function($sm) {

                    $tableGateway =$sm->get('AlbumTableGateway');

                    $table = newAlbumTable($tableGateway);

                    return $table;

                },

                'AlbumTableGateway' =>function ($sm) {

                    $dbAdapter =$sm->get('Zend\Db\Adapter\Adapter');

                    $resultSetPrototype = newResultSet();

                   $resultSetPrototype->setArrayObjectPrototype(new Album());

                    return newTableGateway('album', $dbAdapter, null, $resultSetPrototype);

                },

            ),

        );

    }

}

 

在调用到这个ServiceManager之前,它将会返回一个合并好的工厂类数组。Album\Model\AlbumTable的工厂类能够使用这个ServiceManager来创建一个AlbumTableGateway来调用这个AlbumTable。我们也可以认为这个ServiceManger是这个一个东西,一个AlbumTableGateway是通过获取一个Zend\Db\Adapter\Adapter(当然也是通过ServiceManager获取的)以及使用它来创建一个TableGateway对象的。而这个TableGateway 会在创建一个新的记录集的时候被告知使用一个Album对象。TableGateway类会使用原型模式来创建结果集合及实体。这就意味着当需要的时候不是实例化,而是系统会克隆之前已经实例化好的对象。看《PHP Constructor Best Practices and thePrototype Pattern》能够知道更多细节。

 

最后,我们需要配置好ServiceManager以便它能够知道怎么获取到一个 Zend\Db\Adapter\Adapter 。合并好的配置系统中会调用dZend\Db\Adapter\AdapterServiceFactory来使用工厂类。ZF2 的ModuleManager会将每个Module的module.config.php文件合并为一个配置文件以及config/autoload文件夹下面的文件(*.global.php及*.local.php文件)。我们将会将我们的数据库配置信息加入到global.php,同时你需要提交到你的版本控制系统。你也可以使用local.php去为你自己想要的数据库保存信息:

 

//config/autoload/global.php:

return array(

    'db' => array(

        'driver'         => 'Pdo',

        'dsn'            =>'mysql:dbname=zf2tutorial;host=localhost',

        'driver_options' => array(

            PDO::MYSQL_ATTR_INIT_COMMAND =>'SET NAMES \'UTF8\''

        ),

    ),

    'service_manager' => array(

        'factories' => array(

            'Zend\Db\Adapter\Adapter'

                    =>'Zend\Db\Adapter\AdapterServiceFactory',

        ),

    ),

);

 

你需要将你数据库配置信息放到 config/autoload/local.php 文件中以便它不会出现在 git 代码仓库中(当然可以将local.php忽略掉):

 

//config/autoload/local.php:

return array(

    'db' => array(

        'username' => 'YOUR USERNAME HERE',

        'password' => 'YOUR PASSWORD HERE',

    ),

);

 

测试

 

让我们为我们刚写的代码写一些测试。上线我们为AlbumTable创建一个测试类:

 

//tests/module/Album/src/Album/Model/AlbumTableTest.php:

namespace Album\Model;

 

usePHPUnit_Framework_TestCase;

 

class AlbumTableTestextends PHPUnit_Framework_TestCase

{

    protected function setUp()

    {

        \Zend\Mvc\Application::init(include'config/application.config.php');

    }

}

 

然后写我们的第一个测试。将这些方法加入到测试类中:

 

public functiontestFetchAllReturnsAllAlbums()

{

    $resultSet        = new ResultSet();

    $mockTableGateway =$this->getMock('Zend\Db\TableGateway\TableGateway',

                                      array('select'), array(), '', false);

   $mockTableGateway->expects($this->once())

                     ->method('select')

                     ->with()

                    ->will($this->returnValue($resultSet));

 

    $albumTable = newAlbumTable($mockTableGateway);

 

    $this->assertSame($resultSet,$albumTable->fetchAll());

}

 

在这个测试类中,我们来介绍一下关于Mock对象。介绍Mock对象是超出这篇教程的范围了,但是这个是一些基础的类,将会在测试中使用到。因此我们在此处会测试AlbumTable,而不是TableGateway这个类。(zend团队已经测试过TableGateway类,我们也知道它是好使的),我们只是确定下我们的AlbumTable类是和TableGateway这个类按照我们预期那般相互作用的。此外,我们也会测试AlbumTable中的fetchAll()这个方法会调用$tableGateway属性中的select()方法。如果它是可以工作的,应该会返回一个结果集对象。

最后,我们期望同样的结果集对象能够返回到调用方法中。这么个测试应该能够运行良好,所以我们将会看到我们的最后的测试方法如下:

 

public functiontestCanRetrieveAnAlbumByItsId()

{

    $album = new Album();

    $album->exchangeArray(array('id'     => 123,

                                'artist' =>'The Military Wives',

                                'title'  => 'In My Dreams'));

 

    $resultSet = new ResultSet();

    $resultSet->setArrayObjectPrototype(newAlbum());

    $resultSet->initialize(array($album));

 

    $mockTableGateway =$this->getMock('Zend\Db\TableGateway\TableGateway', array('select'),array(), '', false);

   $mockTableGateway->expects($this->once())

                     ->method('select')

                     ->with(array('id' =>123))

                    ->will($this->returnValue($resultSet));

 

    $albumTable = newAlbumTable($mockTableGateway);

 

    $this->assertSame($album,$albumTable->getAlbum(123));

}

 

public functiontestCanDeleteAnAlbumByItsId()

{

    $mockTableGateway =$this->getMock('Zend\Db\TableGateway\TableGateway', array('delete'),array(), '', false);

   $mockTableGateway->expects($this->once())

                     ->method('delete')

                     ->with(array('id' =>123));

 

    $albumTable = newAlbumTable($mockTableGateway);

    $albumTable->deleteAlbum(123);

}

 

public functiontestSaveAlbumWillInsertNewAlbumsIfTheyDontAlreadyHaveAnId()

{

    $albumData = array('artist' => 'TheMilitary Wives', 'title' => 'In My Dreams');

    $album    = new Album();

    $album->exchangeArray($albumData);

 

    $mockTableGateway =$this->getMock('Zend\Db\TableGateway\TableGateway', array('insert'),array(), '', false);

   $mockTableGateway->expects($this->once())

                     ->method('insert')

                     ->with($albumData);

 

    $albumTable = newAlbumTable($mockTableGateway);

    $albumTable->saveAlbum($album);

}

 

public functiontestSaveAlbumWillUpdateExistingAlbumsIfTheyAlreadyHaveAnId()

{

    $albumData = array('id' => 123, 'artist'=> 'The Military Wives', 'title' => 'In My Dreams');

    $album    = new Album();

    $album->exchangeArray($albumData);

 

    $resultSet = new ResultSet();

    $resultSet->setArrayObjectPrototype(newAlbum());

    $resultSet->initialize(array($album));

 

    $mockTableGateway =$this->getMock('Zend\Db\TableGateway\TableGateway',

                                      array('select', 'update'), array(), '', false);

   $mockTableGateway->expects($this->once())

                     ->method('select')

                     ->with(array('id' =>123))

                    ->will($this->returnValue($resultSet));

   $mockTableGateway->expects($this->once())

                     ->method('update')

                     ->with(array('artist'=> 'The Military Wives', 'title' => 'In My Dreams'),

                            array('id' =>123));

 

    $albumTable = newAlbumTable($mockTableGateway);

    $albumTable->saveAlbum($album);

}

 

public functiontestExceptionIsThrownWhenGettingNonexistentAlbum()

{

    $resultSet = new ResultSet();

    $resultSet->setArrayObjectPrototype(newAlbum());

    $resultSet->initialize(array());

 

    $mockTableGateway =$this->getMock('Zend\Db\TableGateway\TableGateway', array('select'),array(), '', false);

   $mockTableGateway->expects($this->once())

                     ->method('select')

                     ->with(array('id' =>123))

                    ->will($this->returnValue($resultSet));

 

    $albumTable = newAlbumTable($mockTableGateway);

 

    try

    {

        $albumTable->getAlbum(123);

    }

    catch (\Exception $e)

    {

        $this->assertSame('Could not findrow 123', $e->getMessage());

        return;

    }

 

    $this->fail('Expected exception was notthrown');

}

 

让我们回顾到我们的测试。我们测试了如下内容:

 

  1. 我们可以通过id获取到单独的唱片封面。
  2. 我们可以删除唱片封面。
  3. 我们可以保存新的唱片封面。
  4. 我们可以更新已经存在的唱片封面。
  5. 我们将会在我们尝试获取一个不存在的唱片封面的时候出现异常。

 

很好 - 我们的AlbumTable类已经被测试过了。让我们继续进发!

 

返回到控制器

 

现在那个ServiceManager能够为我们创建一个AlbumTable实例,我们也能够在控制器中添加一个方法来获取到它。添加getAlbumTable()到AlbumController类中:

 

//module/Album/src/Album/Controller/AlbumController.php:

    public function getAlbumTable()

    {

        if (!$this->albumTable) {

            $sm =$this->getServiceLocator();

            $this->albumTable =$sm->get('Album\Model\AlbumTable');

        }

        return $this->albumTable;

    }

 

你应该添加

 

protected $albumTable;

 

到类的顶部。

 

我们现在能够在我们需要和模型交互的时候调用控制器中的 getAlbumTable() 方法。现在让我们通过写个测试来确定它是能够工作的。

 

添加个测试到你的 AlbumControllerTest 类中:

 

 

public functiontestGetAlbumTableReturnsAnInstanceOfAlbumTable()

{

   $this->assertInstanceOf('Album\Model\AlbumTable',$this->controller->getAlbumTable());

}

 

如果在Module.php文件中,servicelocator(服务定位器?)配置的正确,当我们调用getAlbumTable()方法的时候是可以得到\Model\AlbumTable实例的。

 

列出唱片封面:

为了能够列出唱片封面,我们需要通过模型来调用这些东西到显示层中。为了达到这一目的,在AlbumController的indexAction()中写一些代码。修改过的代码如下:

 

//module/Album/src/Album/Controller/AlbumController.php:

// ...

    public function indexAction()

    {

        return new ViewModel(array(

            'albums' =>$this->getAlbumTable()->fetchAll(),

        ));

    }

// ...

 

使用ZF2,为了在显示层中设置变量,我们会返回一个显示Model实例。而显示层(view script)会自动调用它。显示model对象也会让我们改变使用的显示脚本,但是默认的是使用{controller name}/{actionname}。我们现在在 index.phtml显示脚本中的代码如下:

 

<?php

//module/Album/view/album/album/index.phtml:

 

$title = 'My albums';

$this->headTitle($title);

?>

<h1><?php echo$this->escapeHtml($title); ?></h1>

<p>

    <a href="<?php echo$this->url('album', array('action'=>'add'));?>">Add newalbum</a>

</p>

 

<tableclass="table">

<tr>

    <th>Title</th>

    <th>Artist</th>

    <th>&nbsp;</th>

</tr>

<?php foreach ($albumsas $album) : ?>

<tr>

    <td><?php echo$this->escapeHtml($album->title);?></td>

    <td><?php echo$this->escapeHtml($album->artist);?></td>

    <td>

        <a href="<?php echo$this->url('album',

            array('action'=>'edit', 'id'=> $album->id));?>">Edit</a>

        <a href="<?php echo$this->url('album',

            array('action'=>'delete', 'id'=> $album->id));?>">Delete</a>

    </td>

</tr>

<?php endforeach;?>

</table>

 

第一件事情是我们要为这个页面设置title(在布局(layout)中使用)然后为<head>标签部分使用Title()显示小工具设置title,它会出现在浏览器的title栏。然后我们会创建一个链接去添加一个新的唱片封面。

 

url显示层小工具是由ZF2提供,被用来为我们创建各种链接的。第一个参数是我们希望用作url结构的路由名称,第二个参数是一些会被替换掉的变量参数。在这个例子中我们使用“album” 路由以及两个变量:action及id。

 

通过控制器我们会循环我们的$albums 变量。ZF2的显示系统会自动将这个变量循环出现到显示脚本的中,所以我们不在需要像ZF1那般使用 $this-> 来调用它。当然你如果喜欢这么做也可以做。

 

然后我们创建一个表来显示每个唱片封面的标题及艺术家们,以及编辑及删除链接。一个标准的循环foreach:循环唱片封面列表,然后我们通过使用endforeach来结束。这么我们也很容易匹配标签(检查代码)。再者说道,url()这么个显示小工具被用来创建编辑及删除链接。

 

注意:

我们经常使用 escapeHtml() 方法来过滤数据以防止XSS攻击。

 

如果你打开http://zf2-tutorial.localhost/album,你应该能看到如下截图:

Ubuntu 12.04 VPS 部署 Zend Framework 1.12 实战指南 Zend Framework(现 Laminas)是 PHP 面向企业级应用的经典 MVC 框架,其松耦合架构、PSR 兼容性与 Front Controller 模式深刻影响了现代 PHP 工程实践。在老旧基础设施仍广泛存在的现实背景下,如何在受限环境(如 Ubuntu 12.04、Apache 2.2、PHP 5.3)中安全、稳定、可维护地运行 Zend Framework 1.12 成为关键工程能力。本文聚焦‘数字遗产运维’场景,解析框架加载原理、.htaccess 重写机制、include_path 阅读详情

相关推荐

AI辅助智能解压工具开发:从原理到实战的完整指南

在数据归档与文件管理领域,加密ZIP文件处理是常见的工程挑战。传统方法如暴力破解或字典攻击,虽原理直接但效率低下,尤其在面对复杂密码或模糊记忆场景时局限性明显。AI技术的引入为这一问题提供了新的解决思路:通过模式识别与上下文理解,智能生成高概率密码候选,从而大幅提升解压成功率与效率。这种AI辅助方案的核心技术价值在于,它将通用的大语言模型(LLM)与自动化脚本能力结合,实现了从“盲试”到“智能推测”的范式转变。在实际应用场景中,该方案特别适用于处理用户自有但因管理不善而遗忘密码的归档文件,或自动化处理已知密

weixin_30765577的博客 449

架构模式数据源模式之:表数据入口(Table Data Gateway)、行数据入口(Row Data Gateway)、活动记录(Active Record)...

一:表数据入口(Table Data Gateway) 表数据入口提供了用于访问单个表或者视图(也包含了联表查询)的所有SQL,通常一个表一个类。其它代码通过它来实现对数据库的交互。基于这个特点,表数据入口和事务脚本代码以及表模块结合的很好。 在查询时候,表数据接口可以返回数据集 或者 DTO 或者 DTO列表。在 事务脚本 代码中已经阐述过了 DTO 以及 DTO 的列表这种形式。但是使用 ...

weixin_33938733的博客 422

Whisper+Gradio本地语音识别系统搭建指南

语音识别(ASR)是将音频信号转化为文本的关键AI技术,其核心原理基于端到端深度学习模型对声学特征与语言结构的联合建模。Whisper模型凭借在真实噪声场景下的鲁棒性与多语言支持能力,成为轻量级本地部署的首选;Gradio则通过零前端开发的交互抽象,大幅降低AI模型工程化门槛。该技术组合无需GPU、不依赖云API,实现数据完全本地化处理,兼顾隐私安全与响应实时性,特别适用于会议纪要生成、教学录音转写、无障碍字幕初稿等中小规模办公与教育场景。

csdndownload11123的博客 377

zend framework mysql_zend framework2使用教程【二】–读取数据

这篇教程篇幅可能会很长,大家要有耐心看,文章最后有源码下载,站长建议大家下载了源码后对照教程看,会更顺畅。 zf2是用模块系统在每个模块中来组织管理你的主应用程序代码,在上一教程中,Application模块被用来向整个应用程序提供bootstrapping,错误处理这篇教程篇幅可能会很长,大家要有耐心看,文章最后有源码下载,站长建议大家下载了源码后对照教程看,会更顺畅。zf2是用模块系统在每个模...

weixin_39989190的博客 214

Cursor Pro/Ultra 本地AI编程生产力升级指南

AI编程助手已从辅助工具演进为深度耦合IDE的智能运行时环境。其核心原理在于将代码语义图谱、LLM推理引擎与实时执行沙盒集成,实现跨文件逻辑理解与上下文感知生成。技术价值体现在确定性补全、离线可用性及硬件级加速(如Intel Ultra 7+Ollama直连),显著提升中高级工程师在微服务维护、嵌入式开发(STM32)、虚拟化调试(VMware Workstation Pro)等复杂场景下的单位时间产出。本文聚焦Cursor Pro与Ultra版本的工程化落地,覆盖上下文优化、中文模型调优、私有知识库集成及

weixin_30463341的博客 337

DDR3性能优化实战:如何用Xilinx MIG控制器实现800MHz稳定读写(7系列FPGA版)

本文深入探讨了在Xilinx 7系列FPGA上使用MIG控制器实现DDR3存储器800MHz稳定高速读写的实战优化技巧。文章聚焦于高级时序调优、Bank Machine调度策略、用户接口设计优化以及利用ILA进行信号完整性调试,旨在帮助工程师突破性能瓶颈,实现接近理论峰值的稳定带宽,并为进一步冲刺更高频率提供进阶调参指南。

seed的博客 778

Zend Framework 2 入门-TableGateway中使用Sql扩展的两种方法

第一种:利用TableGateway中的getSql()方法可以获取Sql对象 <?php namespace Application\Model; use Zend\Db\TableGateway\TableGateway; class UserTable { private $tableGateway; public function __construct(Tabl

wang_quan_li的专栏 1068

别再乱调栅极电阻了!手把手教你用示波器调试FOC驱动MOS管,避开EMC和震荡坑

本文详细介绍了FOC驱动中MOS管栅极参数的精准调试方法,涵盖示波器配置、波形特征分析及栅极电阻选型策略。通过实战案例和工程经验,帮助工程师有效解决EMC和震荡问题,提升驱动电路稳定性和效率。

weixin_28728495的博客 502

php $this->tablegateway sql语句,php – 具有多个FROM表的TableGateway

我希望这会对你的旅程有所帮助,因为这是我的一个有效例子:namespace Pool\Model;use Zend\Db\TableGateway\AbstractTableGateway;use Zend\Db\Sql\Select;class IpaddressPool extends AbstractTableGateway{public function __construct($adap...

weixin_26704349的博客 192

读书笔记 | 财务会计理论(第7版 William R.Scott)(中):契约视角下的会计信息价值

本文从契约理论视角深入剖析了财务会计信息的核心价值。文章指出,会计信息作为关键的“契约润滑剂”,通过债务合同与薪酬合同等具体形式,有效解决了公司内外的信息不对称与道德风险问题,协调了股东、债权人及管理层等多方利益,是公司治理与资本市场有效运转的基石。

mac99的博客 331

用 ABAP LSMW 的 Standard Batch / Direct Input 稳准快迁移物料主数据:从 MM01 录制到 RMDATIND 直入的落地指南

本文详细介绍了SAP数据迁移中LSMW工具的使用方法,重点分析了物料主数据迁移的两种主要路径:Batch Input Recording和Standard Batch/Direct Input。前者通过录制事务操作实现快速起步,后者通过调用预置接口程序实现稳定高效的批量处理。文章深入解析了Standard Direct Input的具体实施步骤,包括对象属性设置、源结构定义、字段映射规则等关键环节,并特别强调了迁移前的准备工作(如编号策略、视图策略等)对项目成功的重要性。通过对比两种方法的优缺点,为不同业务

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 155

ZF2框架连接数据库的方法

控制器:&lt;?php namespace Application\Controller; error_reporting(E_ALL || ~E_NOTICE); session_start(); use Application\Model\NewsModel; use Zend\Mvc\Controller\AbstractActionController; use Zend\View\M...

weixin_40593587的博客 585

95.qt qml-诺谦通用可扩展多功能QML界面

如下图所示:自带一个功能界面,可以通过功能界面添加不同功能,并且可以固定到顶部水平导航栏中,对于N多小功能的项目而言,非常方便,这样用户就可以根据自己喜好来使用自己常用的功能了。

抵抗时间扭曲,坚持做一件有意义的事 3048

PICT中Sub-Models的使用说明

PICT工具安装后会打开一个帮助页面,里面有对Sub-Models的说明,大概是说Sub-Models允许用户自己对参数进行整合,以提高这部分集合的测试覆盖率。具体到使用效果上,从之前下载的一些文档上加上自己的实验,总结为一句话:优先对集合中元素进行组合,保证输出结果中任意order个数的元素组合一次,再将这些输出看做为一个等价类,等价类中的元素与其他参数结对生成最终用例。 还是以上面为例:

angus2887的专栏 714

3.摄像头组件- CVP (ISP)

本文介绍 车载摄像头组件-ISP

2401_83458819的博客 1617

QLineEdit控件: 实现IP地址输入框(基于编辑信号)

在开发网络应用程序时,经常需要用户输入IP地址。直接使用普通输入框容易导致格式错误,用户体验也较差。本文将手把手教你用Qt的QLineEdit控件实现一个智能IP地址输入框。即使你是刚接触Qt的新手,也能通过本文理解核心实现原理。

u011186532的专栏 651

Pi0开源镜像部署实战:root路径规范管理与模型文件安全存放建议

本文介绍了如何在星图GPU平台上自动化部署Pi0开源镜像,实现机器人视觉-语言-动作控制功能。通过规范的root路径管理,用户可安全存放模型文件并快速搭建演示环境,应用于机器人动作生成和自然语言指令交互等场景,提升部署效率与系统可维护性。

weixin_42522857的博客 400

黑猫带你学eMMC协议第17篇:超详细的eMMC HS200 & HS400讲解

1 前言 1.1 声明 本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 本文结合eMMC JEDEC5.1协议手册查看效果更佳。 1.2 内容提要 本文大约6000字,主要内容有: 1.什么是emmc hs200/hs400? 2.什么是tuning?tuning的过程又是什么? 3.如何设置才能让emmc进入hs200 mode? 4.如何设置才能让emmc进入hs400 mode? 5.emmc关于HS200/HS400内部结构框图对比。 6.部分个人相关经验总结。

黑猫奥利奥的博客 1万+

从零构建私有AI模型库:Ollama离线部署与模型迁移全攻略

本文详细介绍了如何在Linux服务器环境中通过Ollama实现企业级私有AI模型库的离线部署与模型迁移。从硬件准备、离线安装包获取到安全部署与Systemd服务配置,再到模型迁移方案与性能优化,提供了一套完整的实战指南,帮助企业构建稳定可靠的私有AI模型库。

transformer2023的博客 1125

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

灾备恢复机制说明:定期备份关键模型文件防止意外丢失

针对ComfyUI集成DDColor的老照片上色场景,设计自动化备份方案,聚焦保护关键的模型文件与工作流配置。通过定时增量备份、哈希校验和多级存储策略,实现高效恢复与版本追溯,避免因误删或硬件故障导致的服务中断,保障数字影像修复业务连续性。

weixin_42584758的博客 717

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

WeKnora部署教程:Docker Compose一键启停+知识库持久化存储配置

本文介绍了如何在星图GPU平台上自动化部署WeKnora知识库问答系统镜像。该平台支持一键部署,用户可快速搭建基于Ollama框架的精准问答环境,适用于企业文档查询、产品手册解读等场景,实现基于特定文本的零幻觉智能问答。

weixin_42611310的博客 556

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Perplexica Docker部署:容器化AI搜索最佳实践

Perplexica是一款开源的AI驱动搜索引擎,作为Perplexity AI的替代方案,它结合了SearxNG元搜索引擎和大型语言模型(LLM)的强大能力。Docker部署方式提供了以下核心优势: - **环境一致性**:确保开发、测试和生产环境完全一致 - **依赖隔离**:避免与系统其他应用的依赖冲突 - **快速部署**:一键启动所有必要服务 - **易于维护**:简化更新和版本管理流...

gitblog_00898的博客 813

MoviePy 资源加载指南:从文件、图像与数据创建 Clip 的完整实践

制作视频的第一步,是把你想放进最终成片的各种资源(视频文件、图片、文本、纯色背景、音频文件乃至纯数据)加载为 MoviePy 的 `Clip` 对象。本指南以 MoviePy 官方用户指南的 [loading 章节](https://link.gitcode.com/i/a3a94a0829310780c62a9c982c6fb5a5) 为骨架,系统梳理视频类与音频类 Clip 的每一种创建方式、

gitblog_00178的博客 512

vllm-mlx语音功能全解析:TTS和STT在Apple Silicon上的高效应用

🚀 **在Apple Silicon上体验极速语音AI:vllm-mlx的TTS和STT功能全面解析** vllm-mlx是一款专为Apple Silicon优化的AI推理服务器,它不仅支持大语言模型和视觉语言模型,还提供了强大的**语音功能**——包括文本转语音(TTS)和语音转文本(STT)。本文将深入解析vllm-mlx的语音功能,展示如何在Mac上实现高效的语音AI应用。 ## 🔥

gitblog_00818的博客 1051

vllm-mlx多模态应用教程:文本、图像、音频和视频处理全攻略 [特殊字符]

想要在Apple Silicon设备上体验强大的多模态AI推理能力吗?vllm-mlx正是您需要的终极解决方案!这款开源工具为Mac用户提供了完整的OpenAI和Anthropic兼容服务器,支持文本、图像、音频和视频处理,让您轻松构建多模态AI应用。 ## 🔥 为什么选择vllm-mlx? vllm-mlx是一款专为Apple Silicon优化的多模态AI推理服务器,具有以下核心优势:

gitblog_00180的博客 935
上一篇: ZF2.0用户向导 —— 5. 路由及控制器
下一篇: 实现“点子”的能力
石中雀
博客等级 码龄14年 3粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值