精华内容
下载资源
问答
  • Laravel框架如何使用阿里云ACE缓存服务 之前我写了一篇在 Laravel 4 框架中使用阿里云 OCS 缓存的文章,介绍了如何通过扩展 Laravel 4 来支持需要 SASL 认证的阿里云 OCS 缓存服务。有网友问我,ACE 的缓存...

    Laravel框架如何使用阿里云ACE缓存服务

    之前我写了一篇在 Laravel 4 框架中使用阿里云 OCS 缓存的文章,介绍了如何通过扩展 Laravel 4 来支持需要 SASL 认证的阿里云 OCS 缓存服务。有网友问我,ACE 的缓存怎么在 Laravel 4 中使用。我本来觉得应该可以完全用相同的办法,后来自己尝试的时候才发现,ACE 的缓存差别非常大。所以再写一篇,介绍一下如何在 Laravel 框架中使用阿里云 ACE 的缓存服务。

    如何扩展 Laravel 的缓存驱动

    在 Laravel 4 中使用 Cache::get($key), Cache::put($key, $value, $minutes) 这样的代码时,实际上是访问 实例化的 Illuminate\Cache\Repository, 所以我们通过 Cache::extend 方法扩展自定义缓存驱动时,同样应该返回一个 Illuminate\Cache\Repository 对象。

    Laravel 4 内置的 Memcached 缓存驱动,实现的流程是这样的:

    1.创建一个标准 Memcached 类的新对象

    2.用上一步创建的 Memcached 对象创建一个实现了 Illuminate\Cache\StoreInterface 接口的 Illuminate\Cache\MemecachedStore 对象。

    3.用上一步创建的 MemcachedStore 对象创建一个 Illuminate\Cache\Repository 对象。
    所以我们在扩展自定义的 Cache 驱动时,根据自己的情况,选择上面的某一个步骤自定义,最终还是要返回 Illuminate\Cache\Repository 对象。比如上一篇文章中,我就是在第一步,创建标准 Memcached 对象之后,通过 setSaslAuthData() 方法设定 OCS 需要的用户名密码。之后第2步、第3步并不需要自定义。

    ACE 的缓存服务

    阿里云 ACE 的缓存服务,跟默认的 OCS 有所不同:

    1.通过 Alibaba::Cache() 方法获得 Cache 对象。

    2.ACE 的 Cache 对象与标准 Memcached 对象不同,支持的方法有限。
    所以,这次第一步得到的不是标准 Memcached 对象,因此就不能创建 Illuminate\Cache\MemcachedStore 对象。需要自己实现 Illuminate\Cache\StoreInterface 接口。

    在控制台创建了缓存空间之后,会有唯一的“缓存空间名称”,然后通过 Alibaba::Cache('缓存空间名称') 来获得 Cache 对象。以下就是实现 ACE 缓存服务驱动的步骤:

    1.为了方便修改,我在配置文件 app/config/cache.php 中增加一个名为 ace 的键,存储缓存空间名称。

    2.然后创建一个 AceMemcachedStore 类,这个类实现 Illuminate\Cache\StoreInterface 接口。

    3.最后,用 AceMemcachedStore 对象来创建 Illuminate\Cache\Repository 对象。
    下面来看具体的代码实现:

    编码实现自定义 ACE 缓存驱动:

    第一步,修改配置文件。打开 app/config/cache.php,在最后增加一行:

    // 指定缓存空间名称
    
    'ace' => 'lblog-cache',


    第二步,为了方便,把自己的类文件放在 src/Ace 目录下,使用 Ace 作为命名空间。
    1.在 app 的同级目录创建目录 src/Ace。

    2.打开 composer.json 文件,修改 autoload 节,在 classmap 下面用 psr-0 或者 psr-4 来自动加载文件。

    "autoload": {
    
        "classmap": [
    
            // autoload class
    
        ],
    
        "psr-4": {
    
          "Ace\\": "src/Ace"
    
        }
    
    },

    创建 src/Ace/AceMemcachedStore.php 文件,代码如下:

    <?php
    
     
    
    namespace Ace;
    
    use Illuminate\Cache\StoreInterface;
    
    use Illuminate\Cache\TaggableStore;
    
     
    
    class AceMemcachedStore extends TaggableStore implements StoreInterface {
    
     
    
        protected $memcached;
    
        protected $prefix;
    
     
    
        public function __construct($space, $prefix = '') {
    
            $this->memcached = \Alibaba::Cache($space);
    
            $this->prefix = strlen($prefix) > 0 ? $prefix.':' : '';
    
        }
    
     
    
        /**
    
         * Retrieve an item from the cache by key.
    
         *
    
         * @param  string $key
    
         * @return mixed
    
         */
    
        public function get($key)
    
        {
    
            $value = $this->memcached->get($this->prefix.$key);
    
            if(is_bool($value) && $value === false) {
    
                return null;
    
            }
    
            return $value;
    
        }
    
     
    
        /**
    
         * Store an item in the cache for a given number of minutes.
    
         *
    
         * @param  string $key
    
         * @param  mixed $value
    
         * @param  int $minutes
    
         * @return boolean
    
         */
    
        public function put($key, $value, $minutes)
    
        {
    
            return $this->memcached->set($this->prefix.$key, $value, $minutes);
    
        }
    
     
    
        /**
    
         * Increment the value of an item in the cache.
    
         *
    
         * @param  string $key
    
         * @param  mixed $value
    
         * @return boolean
    
         */
    
        public function increment($key, $value = 1)
    
        {
    
            return $this->memcached->increment($this->prefix.$key, $value);
    
        }
    
     
    
        /**
    
         * Decrement the value of an item in the cache.
    
         *
    
         * @param  string $key
    
         * @param  mixed $value
    
         * @return boolean
    
         */
    
        public function decrement($key, $value = 1)
    
        {
    
            return $this->memcached->decrement($this->prefix.$key, $value);
    
        }
    
     
    
        /**
    
         * Store an item in the cache indefinitely.
    
         *
    
         * @param  string $key
    
         * @param  mixed $value
    
         * @return boolean
    
         */
    
        public function forever($key, $value)
    
        {
    
            return $this->memcached->set($key, $value, 0);
    
        }
    
     
    
        /**
    
         * Remove an item from the cache.
    
         *
    
         * @param  string $key
    
         * @return boolean
    
         */
    
        public function forget($key)
    
        {
    
            return $this->memcached->delete($this->prefix.$key);
    
        }
    
     
    
        /**
    
         * Remove all items from the cache.
    
         *
    
         * @return void
    
         */
    
        public function flush()
    
        {
    
            //$this->memcached->flush();
    
            return false;
    
        }
    
     
    
        public function getMemcached()
    
        {
    
            return $this->memcached;
    
        }
    
        /**
    
         * Get the cache key prefix.
    
         *
    
         * @return string
    
         */
    
        public function getPrefix()
    
        {
    
            return $this->prefix;
    
        }
    
    }

    这段代码比较简单,不过要特别注意一下 get($key) 方法的实现。标准 memcached 以及 ACE 的缓存对象的 get 方法都是key有效时返回对应的缓存值,否则返回false,而在 Laravel 4 中,是通过检测 get 方法返回的是否 null 来做判断,所以这里需要处理一下,返回缓存值或者null。

    AceMemcachedStore类已经创建好了,接下来在 bootstrap/start.php 文件中扩展 Cache:http://www.lai18.com/content/368670.html

    打开 bootstrap/start.php, 添加以下代码:

    // 扩展名为 ace 的缓存驱动
    
    Cache::extend('ace', function($app)
    
    {
    
        // 从 app/config/cache.php 文件中读取 "ace" 的值
    
        $space = $app['config']['cache.ace'];
    
         
    
        // 从 app/config/cache.php 文件中读取 "prefix" 的值
    
        $prefix = $app['config']['cache.prefix'];
    
         
    
        // 创建 \Ace\AceMemcachedStore 对象
    
        $store = new \Ace\AceMemcachedStore($space, $prefix);
    
         
    
        // 创建并返回 \Illuminate\Cache\Repository 对象
    
        return new \Illuminate\Cache\Repository($store);
    
     
    
    });

    指定系统使用 'ace' 作为缓存驱动:打开 app/config/cache.php,找到 'driver' => '...' 所在行,修改为:'driver' => 'ace'.

    使用和限制

    通过以上操作,就可以在 Laravel 4 中调用 ACE 的缓存服务,使用上与平常的用法完全一致,比如:

    // 添加缓存,有效时间10分钟
    
    Cache::put('my_key', 'my value', 10);
    
     
    
    // 读取缓存
    
    Cache::get('my_key')
    
     
    
    // 判断缓存是否存在
    
    Cache::has('my_key')
    
     
    
    // 数据查询缓存
    
    $users = DB::table('users')->remember(10)->get();

    但是由于 ACE 缓存对象本身的限制,只能删除指定 key 的缓存对象,不能遍历、全量操作,因此 Cache::flush() 方法就不能使用。在上面的 AceMemcachedStore 对象中,flush 方法没有做任何操作,只是返回 false. 


    延伸阅读

    1Laravel教程:laravel 4安装及入门

    2Laravel4中文手册下载

    3Laravel配置教程

    4Laravel生命周期介绍

    5Laravel路由教程

    6Laravel请求和输入

    7Laravel响应和视图

    8Laravel控制器

    9Laravel框架路由配置总结、设置技巧大全

    10Laravel框架数据库CURD操作、连贯操作总结

    11PHP开发框架Laravel数据库操作方法总结

    12Laravel框架表单验证详解

    13Laravel框架中扩展函数、扩展自定义类的方法

    14跟我学Laravel之请求(Request)的生命周期

    15跟我学Laravel之路由

    16跟我学Laravel之视图 & Response

    17跟我学Laravel之配置Laravel

    18跟我学Laravel之请求与输入

    19Laravel框架学习笔记(二)项目实战之模型(Models)

    20Laravel框架学习笔记(一)环境搭建

    21跟我学Laravel之安装Laravel

    22跟我学Laravel之快速入门

    23laravel 4安装及入门图文教程

    24laravel安装和配置教程

    25推荐几款用 Sublime Text 开发 Laravel 所用到的插件

    26Laravel 4.2 中队列服务(queue)使用感受

    27Laravel 4 初级教程之安装及入门

    28Laravel 4 初级教程之视图、命名空间、路由

    29初识Laravel

    30Laravel 4 初级教程之Pages、表单验证

    31PHP开发框架流行度排名:Laravel居首

    32Laravel实现用户注册和登录

    33Laravel中使用自己编写类库的3种方法

    34Laravel 5.0 发布 新版本特性详解

    35Laravel框架中实现使用阿里云ACE缓存服务

    36Laravel中使用阿里云OSS Composer包分享

    37Laravel模板引擎Blade中section的一些标签的区别介绍

    38PHP框架Laravel的小技巧两则

    39laravel安装zend opcache加速器教程

    40PHP Laravel框架路由配置及设置技巧全解

    41分享一个Laravel好用的Cache宏

    42laravel容器延迟加载以及auth扩展详解

    43laravel 5 实现模板主题功能(续)

    44laravel 5 实现模板主题功能

    45Laravel5中contracts详解

    46初识laravel5

    47Laravel 5 学习笔记

    48PHP开发框架laravel安装与配置教程

    49让PHPStorm支持友好的Laravel代码提示

    50PHP IDE PHPStorm配置支持友好Laravel代码提示方法

    51Sublime Text 插件推荐系列 —— 用 Sublime 开发 Laravel


    展开全文
  • struts2框架如何使用websocket实现web程序消息推送博主近期正在学用struts2开发web程序,突然想到想在自己的web程序里实现站内消息推送的功能,也就是根据需要,后端根据需要向前端推送消息,经过一番在网上查找资料...

    struts2框架如何使用websocket实现web程序消息推送

    博主近期正在学用struts2开发web程序,突然想到想在自己的web程序里实现站内消息推送的功能,也就是根据需要,后端根据需要向前端推送消息,经过一番在网上查找资料,了解到可以通过websocket来实现消息推送,但发现网上大多数的示例代码要嘛有错,要嘛不全,终于找到一个好一点的实例代码,现在分享给大家,献给同样有需求的人,避免走弯路~

    websocket + struts2实现消息推送其实很简单,示例代码如下:

    java代码:

    @ServerEndpoint("/ws/websocket")  
    public class WebSocketTest {  
    
        @OnMessage  
        public void onMessage(String message,Session session)  
                throws IOException, InterruptedException  
           {  
            System.out.println("***************");  
            session.getBasicRemote().sendText("  this is  message");  
            int sentMessage = 0;  
            while(sentMessage < 3){  
                Thread.sleep(5000);  
                session.getBasicRemote().sendText(" this is one mess " + sentMessage);  
                sentMessage++;  
            }  
            session.getBasicRemote().sendText(" message send over ");  
        }  
    
        @OnOpen  
        public void onOpen(){  
            System.out.println(" client connected ");  
        }  
    
        @OnClose  
        public void onClose(){  
            System.out.println(" connection closed ");  
        }  
    }

    使用@ServerEndpoint(“/ws/websocket”)即可进行访问

    前端jsp代码如下:

    <!DOCTYPE html>  
    <html>  
    <head>  
    <title>Testing websockets</title>  
    </head>  
    <body>  
      <div>  
        <input type="submit" value="Start" onclick="start()" />  
      </div>  
      <div id="messages"></div>  
      <script type="text/javascript">  
        var webSocket;  
        if ('WebSocket' in window) {  
            webSocket = new WebSocket("ws://localhost:8080/Backstage/ws/websocket");  
        } else if ('MozWebSocket' in window) {  
            webSocket = new MozWebSocket("ws://localhost:8080/websocket");  
        } else {  
            alert("js");  
            webSocket = new SockJS("http://localhost:8080/Origami/sockjs/webSocketServer");  
        }  
    
        webSocket.onerror = function(event) {  
          onError(event)  
        };  
    
        webSocket.onopen = function(event) {  
          onOpen(event)  
        };  
    
        webSocket.onmessage = function(event) {  
          onMessage(event)  
        };  
    
        function onMessage(event) {  
          document.getElementById('messages').innerHTML  
            += '<br />' + event.data;  
        }  
    
        function onOpen(event) {  
          document.getElementById('messages').innerHTML  
            = 'Connection established';  
        }  
    
        function onError(event) {  
            //console.log(event);  
            //console.log(event.data);  
          alert(event.data);  
        }  
    
        function start() {  
          webSocket.send('hello');  
          return false;  
        }  
      </script>  
    </body>  
    </html> 

    运行结果:
    这里写图片描述

    可能有的人会碰到这样的问题:
    浏览器无法建立到 ws://localhost:8080/XXXXX/ws/websocket 服务器的连接。(XXXXX为你的项目名称)

    webSocket = new WebSocket(“ws://localhost:8080/XXXXX/ws/websocket”);

    出现这个是因为使用了struts2过滤器,web.xml中配置了struts2 过滤为/*,所以导致所有的请求都被拦截了。解决办法也很简单:
    struts.xml文件中加上

    <constant name="struts.action.excludePattern" value="/ws/.*,ws://.*"></constant>

    过滤掉ws://请求即可

    OK!搞定~

    展开全文
  • vant框架如何使用sku商品规格

    千次阅读 2019-09-28 00:46:40
    <template> <div> <div> ...直接上代码 vant官方文档写的不是很清楚 不知道简书怎么使用代码块 代码可能有点乱 到时候格式化就好了 记得替换api成自己的使用
        

    <template> <div> <div> <van-sku v-model="show" :sku="sku" :goods="goods" :hide-stock="sku.hide_stock" @buy-clicked="onBuyClicked" @add-cart="onAddCartClicked" /> <van-swipe class="goods-swipe" :autoplay="3000"> <van-swipe-item v-for="thumb in goods.thumb" :key="thumb.url"> <img :src="thumb.src" /> </van-swipe-item> </van-swipe> <van-cell-group> <van-cell> <div class="goods-title">{{ goods.title }}</div> <div class="goods-price">{{ formatPrice(goods.price) }}</div> </van-cell> <van-cell class="goods-express"> <van-col span="10">运费:{{ goods.express }}</van-col> <van-col span="14">剩余:{{ goods.remain }}</van-col> </van-cell> </van-cell-group> <van-cell-group class="goods-cell-group"> <van-cell value="进入店铺" icon="shop-o" is-link @click="sorry"> <template slot="title"> <span class="van-cell-text">领军者旗舰店</span> <van-tag class="goods-tag" type="danger">旗舰店</van-tag> </template> </van-cell> </van-cell-group> <van-cell-group class="goods-cell-group"> <van-cell title="查看商品详情" is-link @click="sorry" /> </van-cell-group> <van-goods-action> <van-goods-action-icon icon="chat-o" @click="sorry">客服</van-goods-action-icon> <van-goods-action-icon icon="cart-o" @click="show = true">购物车</van-goods-action-icon> <van-goods-action-button type="warning" @click="show = true">加入购物车</van-goods-action-button> <van-goods-action-button type="danger" @click="sorry">立即购买</van-goods-action-button> </van-goods-action> </div> </div></template><script>import { Tag, Col, Icon, Cell, CellGroup, Swipe, Toast, SwipeItem, GoodsAction, GoodsActionIcon, GoodsActionButton} from "vant";export default { components: { [Tag.name]: Tag, [Col.name]: Col, [Icon.name]: Icon, [Cell.name]: Cell, [CellGroup.name]: CellGroup, [Swipe.name]: Swipe, [SwipeItem.name]: SwipeItem, [GoodsAction.name]: GoodsAction, [GoodsActionIcon.name]: GoodsActionIcon, [GoodsActionButton.name]: GoodsActionButton }, data() { return { goods: { title: "美国伽力果(约680g/3个)", price: 2680, express: "免运费", remain: 19, thumb: [], }, id: this.$route.params.id , show: false, sku: { tree: [ { k: "选择", // skuKeyName:规格类目名称 v: [ { id: "1215", name: "手机", imgUrl: "http://demo.dtcms.net/upload/201504/20/thumb_201504200046594439.jpg" } ], k_s: "s1" // skuKeyStr:sku 组合列表(下方 list)中当前类目对应的 key 值,value 值会是从属于当前类目的一个规格值 id } ], // 所有 sku 的组合列表,比如红色、M 码为一个 sku 组合,红色、S 码为另一个组合 list: [ { id: 2259, // skuId,下单时后端需要 price: 100, // 价格(单位分) s1: "1215", // 规格类目 k_s 为 s1 的对应规格值 id stock_num: 10 // 当前 sku 组合对应的库存 } ], price: "1.00", // 默认价格(单位元) stock_num: 17, // 商品总库存 collection_id: 2261, // 无规格商品 skuId 取 collection_id,否则取所选 sku 组合对应的 id none_sku: false, // 是否无规格商品 hide_stock: false // 是否隐藏剩余库存 } }; },created() { this.getLunbotu(); }, methods: { onBuyClicked(data) { this.$toast("buy:" + JSON.stringify(data)); console.log(JSON.stringify(data)); }, onAddCartClicked(data) { this.$toast("add cart:" + JSON.stringify(data)); }, formatPrice() { return "¥" + (this.goods.price / 100).toFixed(2); }, onClickCart() { this.$router.push("cart"); }, getLunbotu() { console.log(this.id) this.$http.get("api/getthumimages/" + this.id).then(result => { if (result.body.status === 0) { this.goods.thumb = result.body.message; } }); } }};</script><style lang="less">.van-sku-messages { display: none;}.demo-sku { .sku-container { padding: 0 15px; }}.goods { padding-bottom: 50px; &-swipe { img { width: 100%; display: block; } } &-title { font-size: 16px; } &-price { color: #f44; } &-express { color: #999; font-size: 12px; padding: 5px 15px; } &-cell-group { margin: 15px 0; .van-cell__value { color: #999; } } &-tag { margin-left: 5px; }}</style>

    直接上代码 vant官方文档写的不是很清楚 不知道简书怎么使用代码块 代码可能有点乱 到时候格式化就好了


    19088858-60883f99f40e8c08.png
    19088858-7657843dc944bf40.png

    记得替换api成自己的使用

    展开全文
  • Symfony框架如何使用的笔记(symfony4.2)

    千次阅读 2018-09-27 18:37:28
    已经有半年没用过了,今天把最新版4.2的使用笔记记录下来,方便自己和他人对symfony有更深的理解。(未完) composer安装Symfony框架 下载Composer最新版本:v1.7.3 Windows Installer 安装程序将为您下载...

    之前用过symfony2.8系列的版本开发过在线教育的购课网站,所以对这个框架不是太陌生。已经有半年没用过了,今天把最新版4.2的使用笔记记录下来,方便自己和他人对symfony有更深的理解。(未完)

    composer安装Symfony框架

     

    下载Composer 最新版本:v1.7.3

    Windows Installer

    安装程序将为您下载composer并设置PATH环境变量,以便您可以composer从任何目录中进行调用。

    下载并运行Composer-Setup.exe - 它将在执行时安装最新的composer版本。

    安装的时候需要选择你的PHP位置

    用默认的就一路确定即可

    cmd打开

    composer --version回车查看版本

    然后进入你要下载symfony的位置

    1. composer create-project symfony/website-skeleton my-project

    在开发时,您应该使用Nginx或Apache等Web服务器(请参阅配置Web服务器以运行Symfony)。 但是对于开发来说,使用Symfony PHP Web服务器更加容易。

    首先,进入你的新项目并安装服务器:

    1. 要启动服务器,请运行:php bin/console server:run
    2. 如果退出就Ctrl+C

    一、路由

    1.配置

    如果使用的是apache或者nginx,得配置根目录到public目录下

    2.测试访问首页

    3.测试路由 symfony的路由配置方法有很多种,使用起来有多牛逼有多牛逼,这里只配置常用的两种简单的demo。ps:太复杂的我也没玩过=-=

    1. 使用confg目录下的routes.yaml配置路由

       

    2. 使用注释的方法配置路由(去掉上面routes.yaml的路由配置)

    二、渲染模板

    symfony自带twig模板引擎,不会twig语法的可以先去https://blog.csdn.net/sinat_15955423/article/details/81236499看看

    1.测试视图页

    首先得确保LuckyController继承Symfony的基类AbstractController

    2.查看所有路由

    在控制台输入:php bin/console 获取所有命令列表

    php bin/console debug:router 可以获取当前所有的路由

    3.创建路由

    symfony有很多种创建路由方法,比如在控制器上注释路由,还有控制器生成路由,还有从模板生成...

    用法很多,这里还是只做控制器注释路由。

    测试同一个路由,有无参数时指向不同控制器的方法:

    4.重定向路由

    return $this->redirectToRoute('app_lucky_home',['max'=>10]);

    三、生成控制器

    1.为了节省时间,您可以安装Symfony Maker并告诉Symfony生成一个新的控制器类:

     php bin/console make:controller BrandNewController

    创建控制器会自动生成相应的模板:

     并且把控制器和模板的基础代码给写进去:

    2.如果要从Doctrine 实体生成整个CRUD ,请使用:

    php bin/console make:crud Product

    如果没有实体前运行上面的创建crud会报错:(意思就是你还没创建链接上数据库)

     

    3.安装数据库和Doctrine ORM(实体映射)

    1)首先,通过ORM包以及MakerBundle安装Doctrine支持,这可以自动生成一些代码:

    composer require symfony/orm-pack
    composer require symfony/maker-bundle --dev

    2) 配置数据库

    找到并自定义.env

    3)生成数据库

    上面已经设置了连接参数,Doctrine可以创建数据库自定义名symfony:

    php bin/console doctrine:database:create

     

    4.创建实体类

    如果你还没想好数据库是什么样的,您已经知道需要一个Product对象来表示这些产品。

    您可以使用该make:entity命令创建此类以及所需的任何字段。该命令会问你一些问题 - 操作如下:

    php bin/console make:entity

    上面就会自动生成出实体类文件Product.php和数据库储存文件ProductRepository.php

    该类称为“实体”。很快,您将能够将Product对象保存和查询到product数据库中的表。Product 实体中的每个属性都可以映射到该表中的列。这通常使用注释完成:@ORM\...您在每个属性上方看到的注释:

    5.迁移:创建数据库表/模式

    Product班是完全配置好并保存到一个product表。如果您刚刚定义了此类,那么您的数据库实际上还没有该product 表。要添加它,您可以利用已安装的DoctrineMigrationsBundle

    php bin/console make:migration

    如果您打开此文件,它将包含更新数据库所需的SQL!要运行该SQL,请执行迁移:

    php bin/console doctrine:migrations:migrate

     

    6.迁移和添加更多字段

    但是如果你需要添加一个新的字段属性Product,比如description?您可以编辑该类以添加新属性。但是,你也可以make:entity 再次使用:

     php bin/console make:entity
    Class name of the entity to create or update
    > Product
    
     to stop adding fields):
    > description
    
    Field type (enter ? to see all types) [string]:
    > text
    
    Can this field be null in the database (nullable) (yes/no) [no]:
    > no
    
     to stop adding fields):
    >
    (press enter again to finish)
    

    这会添加新description属性getDescription()setDescription() 方法:


    新属性已映射,但在product表中尚不存在。没问题!生成新迁移:

     

     php bin/console make:migration
    

    这次,生成的文件中的SQL将如下所示:

    1
    ALTER TABLE product ADD description LONGTEXT NOT NULL
    

    迁移系统很聪明。它将所有实体与数据库的当前状态进行比较,并生成同步它们所需的SQL!像以前一样,执行迁移:

     php bin/console doctrine:migrations:migrate
    

    这只会执行一个新的迁移文件,因为DoctrineMigrationsBundle知道第一次迁移已经在之前执行过。在幕后,它管理一个migration_versions表来跟踪这个。

    每次更改模式时,运行这两个命令以生成迁移,然后执行它。确保提交迁移文件并在部署时执行它们。

    7.将对象保留到数据库

    是时候将Product对象保存到数据库了!让我们创建一个新的控制器进行实验:

    php bin/console make:controller ProductController

    把生成的Product.php文件内容换成如下:

    <?php
    
    namespace App\Controller;
    
    use App\Entity\Product;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
    
    class ProductController extends AbstractController
    {
        /**
         * @Route("/product", name="product")
         */
        public function index()
        {
            $entityManager = $this->getDoctrine()->getManager();
    
            $product = new Product();
            $product->setName('Keyboard');
            $product->setPrice(1999);
            $product->setDescription('Ergonomic and stylish!');
    
            // tell Doctrine you want to (eventually) save the Product (no queries yet)
            $entityManager->persist($product);
    
            // actually executes the queries (i.e. the INSERT query)
            $entityManager->flush();
    
            return new Response('Saved new product with id '.$product->getId());
           /* return $this->render('product/index.html.twig', [
                'controller_name' => 'ProductController',
            ]);*/
        }
    }
    

    更新日期:2019年04月28日

    今天准备用symfony做api写个vue博客,使用的是Linux系统,继续写一下Linux上面如何使用symfony:

    一、composer方式安装

    composer create-project symfony/skeleton my_project

    显示报错,因为symfony4.2需要更新的composer版本,我的版本太低

     

    更新一下composer,你的如果比较新就不用管了

    /usr/bin/composer self-update 

    二、创建微服务

    composer create-project symfony/skeleton my_project

    权限不够的话得前面加sudo

     

     

     

    展开全文
  • golang gin http.handler 中间件
  • 是需要单独在引入push.js文件吗,使用上要怎么使用?我在ratchet文档上复制的代码,没有切换效果。 如何实现?新手求问
  • 如何使用bootstrap框架

    千次阅读 2018-10-27 23:38:57
    使用bootstrap框架 第一步就是引入bootstarp的两个必要的文件,一个是CSS文件,而另一个就是JS文件,bootstrap里面的组件和样式都是基于这两个文件才生效的。常用的安装bootstrap有两种,第一种方式就是使用线上的...
  • 如何在Spring框架使用RMI技术

    千次阅读 2015-01-25 05:50:18
    如何在Spring框架使用RMI技术
  • 如题,我看了bootstrap、easy-ui,感觉很不爽,大量依赖class和自定义属性,关键是名字太长,大牛们你们是如何学习这些框架的?有没有更好的选择?
  • Android Studio中如何使用SlidingMenu框架

    千次阅读 2016-09-09 15:32:18
    Android Studio中如何使用SlidingMenu框架
  • xampp 如何使用 ThinkPHP 框架

    万次阅读 2012-11-23 20:21:31
    xampp 如何使用 ThinkPHP 框架,其实很简单, 在xampp/htdocs/下建立App,将thinkPHP目录放到App下 在App目录下新建index.php 写入 //加载框架入口文件 require './ThinkPHP/ThinkPHP.php'; ?> 然后...
  • uni-app框架如何使用Websocket

    万次阅读 多人点赞 2019-10-23 08:50:47
    uni-app框架websocket测试发现:【APP端无法同时开多个websocket----这个问题等待解决!!!H5端没问题】 测试发现问题所在:uni.connectSocket(OBJECT)创建出来的对象socketTask在浏览器中是一个实例对象【支持...
  • 论新手如何使用scrapy框架?

    千次阅读 2020-09-11 20:09:48
    论新手如何使用scrapy框架?区别基本使用(一)创建项目基本命令操作案例 --->虎扑篮球新闻(一) 安装模块(二) 项目建立(三)目录介绍(四)修改settings.py(五)编写item(六) 保存数据(七)效果图 区别 基本使用 (一...
  • 里面有两种session的使用方法:1是php的原始的session使用方法,这个很简单,$_SESSION['name']="name",...下面就详细讲解如何使用这个有点点复杂的方法:  首先,在\ci\application\config下面的config.php文件中
  • 如何在VUE框架使用ztree插件

    万次阅读 2018-09-26 21:40:30
    一切还是以需求为导向!如下图所示:这是要求作出的...相信大家遇到的第一个问题就是如何使用ztree插件,没错!那自然要跑到ztree官网去看文档,熟读文档是必不可少的!读完文档后,那怎么在vue框架中配置ztree...
  • 使用sqlx进行dao操作,比原生的sql更加方便 main.go package main import ( _ "github.com/lib/pq" "github.com/jmoiron/sqlx" "fmt" "time" "runtime"...
  • 如何使用Maven搭建SSM框架

    千次阅读 2018-09-09 20:40:06
     跟着老师学习了两个月的java语言,现在学习到了框架的部分,一直想在博客上写点东西的,只是自己一直没有时间,其实到底也是懒,鲁迅说过:"时间就像海绵里的水,只要愿意去挤还是有的",所以废话不多说,...
  • 如何使用ssm框架实现验证码功能?

    千次阅读 2019-07-10 17:08:20
    为期2周多的实训终于结束,收获满满,在这里,我将与大家分享使用ssm框架如何实现验证码功能! 1首先.肯定是要搭建好ssm框架,前面文章已经写过如何搭建,这里不再啰嗦, 2.新建一个validatecode.jsp文件,里面内容如下: <...
  • SSM框架如何在普通类里使用注解

    千次阅读 2017-12-25 09:49:17
    使用SSH框架的过程中,想要在普通的类或者工具类里使用Service时,不能使用new方法,必须使用注解,而直接在类里使用注解的话,又不会起作用,需要在工具类的上面添加@Component注解,在调用工具类的的时候使用@...
  • 用scrapy做了一个单机爬虫。如果要发布的话则需要搞一个web框架,选择了flask但不知道如何使用,谷歌好久也没找到相关博客,希望有大神解答
  • vant框架中的event如何使用

    千次阅读 2019-12-24 18:54:19
    作为一个好奇心比较强的人,就喜欢什么都搞一搞,从13年毕业,...但是在学习vue的过程中发现了vant的这个框架,原来前端开发也可以这么简单啊,对于后台开发人员来说太方便了 但是学习过程中遇到了一个问题,就是...
  • Spring Security 在SSM框架如何使用

    千次阅读 2018-10-19 22:24:59
    概述:Spring Security 的前身是 Acegi Security ,是 Spring 项目组中用来提供安全认证服务的框架 ​ 1 认证: 验证用户名密码是否正确的过程 ​ 2授权: 对用户所能访问的资源进行控制 使用步骤: ​ 1.引入依赖 ...
  • 看了下饿了么团队开发的PC端vue ui框架Element ui之后,顺便看了看同团队开发的移动端的vue ui框架mint ui,那么在vue项目中应该如何使用mint ui呢?以下做简单的记录。 首先安装mint: $ npm install mint-ui...
  • 如何使用Maven搭建SSM框架(2)

    千次阅读 2017-10-09 11:57:42
    上篇文章讲解了如何创建Maven工程和SSM框架所需的基本配置如何使用Maven搭建SSM框架(1) 三.SSM框架工程结构创建 经过之前的步骤,我们已经完成了Maven工程的创建和SSM框架项目的配置文件。目前工程结构如下: 目前...
  • android之如何使用Android的搜索框架

    千次阅读 2013-08-17 18:07:48
    当你需要在你的应用程序中提供搜索服务时,通过使用Android的搜索框架,应用程序将显示一个自定义搜索对话框来处理用户的搜索请求。通过一个简单的搜索按钮或从您的应用程序中调用API,搜索对话框就会显示在屏幕的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 49,717
精华内容 19,886
关键字:

框架如何使用