精华内容
下载资源
问答
  • cakephp_4CakePHP 4-源码

    2021-02-16 00:07:21
    使用 4.x创建应用程序的框架。 框架源代码可以在这里找到: 。 安装 下载或更新composer self-update 。 运行php composer.phar create-project --prefer-dist cakephp/app [app_name] 。 如果Composer已全局...
  • CakePHP 4社交网络 入门 这是Cakephp 4的一个培训项目。该代码是免费提供的。 测试(alpha访问):( ) 建于 -CakePHP使现代PHP 7框架使构建Web应用程序更简单,更快,同时所需的代码更少。 最受欢迎的数据库...
  • CakeLTE:CakePHP 4.x的AdminLTE插件 安装 您可以使用将此插件安装到CakePHP应用程序中。 推荐的安装作曲家软件包的方法是: composer require arodu/cakelte 依存关系 ,在CakePHP 4中透明地使用Bootstrap 4。 ...
  • CakePHP4-vue-源码

    2021-02-17 18:11:39
    実行方法 docker-compose初回启动时はjavascriptのパッケージを取得できていない为手表コンテナーは起动に失败する。 docker-compose up -d docker exec -it app composer install docker exec -it app npm ...
  • I am already using cakephp 4.x and would like to use your crud plugin, but composer refuses installation :-((( <p>Problem 1 - friendsofcake/crud 5.4.0 requires cakephp/cakephp ^3.5 -> satisfiable ...
  • // Or the following if you want to use the Bootstrap 4 version (alpha) composer require holt59/cakephp3-bootstrap-helpers:dev-4.0.1-alpha 将插件加载到您的config/bootstrap.php : Plugin :: load ( '...
  • cakephp分页.docx

    2019-06-08 10:15:48
    cakephp分页,cakephp框架的分页的方法的文档,是cakephp框架的内容。
  • 对于CakePHP 4.x,请使用master分支或2.x版本 介绍 在任何MVC框架中,经验法则基本上都是“胖模型,瘦控制器”。 尽管这很好用,但可以通过将DB操作与实际分开来更好地进行抽象。 大多数Cake开发人员可能会将表对象...
  • cakephp中文手册

    2016-12-16 15:17:21
    cakephp中文手册
  • CakePHP 3.4 开发手册文档 CakePHP Cookbook Documentation Release 3.4
  • 主要介绍了Nginx配置PHP的Yii与CakePHP框架的rewrite规则示例,是这两款高人气框架使用Nginx的关键配置点,需要的朋友可以参考下
  • 该分支与CakePHP 4.x一起使用。 有关详细信息,请参见。 安装 您可以使用将此插件安装到CakePHP应用程序中。 运行以下命令 composer require cakephp/migrations 配置 您可以使用shell命令加载插件: bin/cake ...
  • CakePHP Solr 数据源 SolPHP的CakePHP数据源实现所有CRUD方法 依赖关系 PHP 5.4 蛋糕PHP 2.5.7 Solr 5.0.0 日光浴室 3.3.0 安装 假设您至少有 PHP 5.4(用于数组括号注释) 假设您已经至少运行了 CakePHP 2.5.7...
  • 正在寻找CakePHP 4? 检查出cake-4分支。 它是什么? 因此,我需要一种在上传图像的方法,由于找不到喜欢的东西,我决定以与为CakePHP 2编写插件类似的方式编写自己的图像。 要求 PHP 5.6以上 数据库 CakePHP 3 ...
  • CakePHP中的批量保存及批量更新

    千次阅读 2017-06-21 23:05:24
    CakePHP中,批量保存及批量更新主要用到 newEntities() 、patchEntities()、saveMany()及updateAll()方法。

    在CakePHP中,批量保存及批量更新主要用到 Cake\ORM\Table::newEntities(array $data, array $options[])Cake\ORM\Table::patchEntities(array|Traversable $entities , array $data , array $options[])Cake\ORM\Table::saveMany(array|Cake\ORM\ResultSet $entities , array|ArrayAccess $options[]) 等方法;

    批量保存

    假如有一张 articles 数据表,其中有 id title content published等字段,那么在ArticlesController的方法中进行批量保存,代码大致如下:

    //数组数据
    $data = [
        [
            'title' => 'First Article',
            'content' => 'This is the first article.',
            'published' => 1
        ],
        [
            'title' => 'Second Article',
            'content' => 'This is the second article.',
            'published' => 1
        ],
        ...
    ];
    //批量保存
    $entities = $this->Articles->newEntities($data);
    $rows = $this->Articles->saveMany($entities); //返回批量保存的条数

    批量更新

    假如要把所有title中包含Article的文章下线('published' => 0),则在ArticlesController的方法中:

    //查询需要更新的数据
    $articles = $this->Articles->find('all', [
        'conditions' => [
            'title LIKE' => "%Article%"
        ]
    ]);
    //设置更新后的值
    foreach($articles as $article) {
        $data[] = array(
            'id' => $article->id, //必须,用主键id进行识别
            'published' => 0
        );
    }
    //批量更新
    $articles = $this->Articles->patchEntities($articles, $data);
    $rows = $this->Articles->saveMany($articles); //返回批量更新的条数

    批量更新还可以使用如下两种方式:

    $this->Articles->updateAll(
        ['published' => 0], //需要更新的字段值
        ['title LIKE' => '%Article%'] //查询条件
    );

    $this->Articles->query()
                   ->update()
                   ->set(['published' => 0])
                   ->where(['title LIKE' => '%Article%'])
                   ->execute();
    展开全文
  • 初品cakephp 入门基础

    2020-12-18 22:47:39
    首先来看一下cakephp的的执行流程(从百度百科借来的图片): 1:首先你的服务器必须支持rewrite,如果是不支持rewrite的虚拟主机的话cakephp是不能正常运行的。 2:将所有的请求定向到cakephp框架后就进入了框架的...
  • CakePHP系列(一)----CakePHP3.4一览

    千次阅读 2017-02-23 15:50:23
    一、CakePHP一览 CakePHP旨在使常见的Web开发任务简单,容易。 通过提供一个一体化工具箱,您可以开始使用CakePHP的各个部分一起或单独工作。 本概述的目标是介绍CakePHP中的一般概念,并快速概述这些概念如何...
    一、CakePHP一览

    CakePHP旨在使常见的Web开发任务简单,容易。 通过提供一个一体化工具箱,您可以开始使用CakePHP的各个部分一起或单独工作。

    本概述的目标是介绍CakePHP中的一般概念,并快速概述这些概念如何在CakePHP中实现。 如果您想开始开发项目,可以从教程开始 ,或者深入了解文档


    二、约定优于配置


    CakePHP提供了一个基本的组织结构,涵盖类名,文件名,数据库表名和其他约定。 虽然约定需要一些时间来学习,通过遵循CakePHP提供的约定,您可以避免不必要的配置,并使统一的应用程序结构,使工作与各种项目简单。 约定章节涵盖CakePHP使用的各种约定。


    三、模型层


    Model层表示实现业务逻辑的应用程序的一部分。 它负责检索数据并将其转换为应用程序中的主要有意义的概念。 这包括处理,验证,关联或与处理数据相关的其他任务。

    在社交网络的情况下,Model层将负责诸如保存用户数据,保存朋友的关联,存储和检索用户照片,找到对新朋友的建议等任务。模型对象可以被认为是“朋友”,“用户”,“评论”或“照片”。 如果我们想从users表中加载一些数据,我们可以做:


    use Cake\ORM\TableRegistry;
    
    $users = TableRegistry::get('Users');
    $query = $users->find();
    foreach ($query as $row) {
        echo $row->username;
    }

    您可能会注意到,在我们开始使用我们的数据之前,我们不需要编写任何代码。 通过使用约定,CakePHP将为尚未定义的表和实体类使用标准类。

    如果我们想创建一个新用户并保存它(使用验证),我们会做:


    use Cake\ORM\TableRegistry;
    
    $users = TableRegistry::get('Users');
    $user = $users->newEntity(['email' => 'mark@example.com']);
    $users->save($user);



    四、视图层


    View层渲染建模数据的呈现。 与Model对象分离,它负责使用可用的信息来生成应用程序可能需要的任何呈现界面。

    例如,视图可以使用模型数据来呈现包含它的HTML视图模板,或者使用XML格式的结果供其他人使用:


    // In a view template file, we'll render an 'element' for each user.
    <?php foreach ($users as $user): ?>
        <li class="user">
            <?= $this->element('user', ['user' => $user]) ?>
        </li>
    <?php endforeach; ?>


    View层提供了一些扩展点,例如View Templates ElementsView Cells ,让你重用你的表示逻辑。

    视图层不仅限于数据的HTML或文本表示。 它可以用于提供常见的数据格式,如JSON,XML,并通过可插入架构任何其他格式,如CSV可能需要。


    五、控制器层


    Controller层处理来自用户的请求。 它负责在模型层和视图层的帮助下渲染响应。

    控制器可以被看作是一个管理器,确保完成任务所需的所有资源都被委派给正确的工作者。 它等待来自客户端的请求,根据认证或授权规则检查其有效性,向模型委派数据获取或处理,选择客户端正在接受的呈现数据的类型,并且最终将呈现过程委托给View层。 用户注册控制器的示例将是:


    public function add()
    {
        $user = $this->Users->newEntity();
        if ($this->request->is('post')) {
            $user = $this->Users->patchEntity($user, $this->request->getData());
            if ($this->Users->save($user, ['validate' => 'registration'])) {
                $this->Flash->success(__('You are now registered.'));
            } else {
                $this->Flash->error(__('There were some problems.'));
            }
        }
        $this->set('user', $user);
    }



    六、CakePHP请求周期


    现在您已经熟悉CakePHP中的不同图层,让我们了解一下请求周期在CakePHP中的工作原理:





    典型的CakePHP请求周期从用户请求应用程序中的页面或资源开始。 在高级别,每个请求通过以下步骤:


    1.Web服务器重写规则将请求定向到webroot / index.php 。
    2.您的应用程序已加载并绑定到HttpServer 。
    3.应用程序的中间件已初始化。
    4.请求和响应通过您的应用程序使用的PSR-7中间件分派。 通常这包括错误捕获和路由。
    5.如果没有从中间件返回响应并且请求包含路由信息,则选择控制器和动作。
    6.调用控制器的操作,控制器与所需的模型和组件交互。
    7.控制器将响应创建委派给视图,以生成从模型数据产生的输出。
    8.该视图使用Helpers和Cells来生成响应主体和标头。
    9.响应通过中间件返回
    10.HttpServer向HttpServer发出响应。


    七、这只是个开始


    希望这个快速概述引起了您的兴趣。 CakePHP中的其他一些重要功能包括:

       ● 集成Memcached,Redis和其他后端的缓存框架。
       ● 强大的代码生成工具 ,让您可以立即开始。
       ● 集成测试框架 ,所以你可以确保你的代码工作完美。


    下一个明显的步骤是下载CakePHP ,阅读教程并构建一些了不起的东西 。


    八、附加阅读


      ● 在哪里获得帮助

      ● CakePHP约定

      ● CakePHP文件夹结构

    展开全文
  • 用于CakePHP的Rest插件 该插件简化了CakePHP 3应用程序的REST API开发。 它只是将控制器的输出转换为JSON响应。 安装 您可以使用将此插件安装到CakePHP应用程序中。 推荐的安装作曲家软件包的方法是: composer ...
  • cakephp-源码

    2021-02-17 14:12:35
    CakePHP CakePHP是PHP的快速开发框架,它使用Active Record,关联数据映射,Front Controller和MVC等众所周知的设计模式。 我们的主要目标是提供一个结构化的框架,该框架使所有级别PHP用户都可以快速开发健壮的Web...
  • OpenShift上的CakePHP示例应用程序 这是OpenShift v3的快速入门CakePHP应用程序,您可以以此为起点来开发自己的应用程序并将其部署在集群上。 如果您要安装它,请按照。 本文档中的步骤假定您有权访问可以在其上...
  • CakePHP是一个用PHP编写的开源Web应用框架,不过其模型是用Ruby on Rails设计的。作为PHP世界的Rails,...在cakephp.org站点的Sites in the wild页面可以看到当前使用CakePHP框架的网站列表。 CakePHP 是一个运用
  • CakePHP的LoginAttempts插件 要求 CakePHP> = 3.5 安装 您可以使用将此插件安装到CakePHP应用程序中。 推荐的安装作曲家软件包的方法是: composer require nojimage/cakephp-login-attempts 加载插件 (CakePHP> ...
  • 对于CakePHP 4.x 作曲家需要--dev vierge-noire / cakephp-test-migrator“ ^ 2.0” 介绍 CakePHP固定装置以与默认数据库并行的方式处理测试数据库架构。 一方面,您将为默认数据库编写迁移。 另一方面,您可以通过...
  • CakePHP 2.2+ 的验证码支持 使用随机文本alpha|math生成需要人工验证的图像。 这是为了防止自动垃圾邮件和垃圾邮件机器人。 特征: 多种验证码类型alpha|math 支持文字旋转 可以设置图像的宽度和高度尺寸 字体...
  • 一个 CakePHP (4+) 插件,用于在您的应用程序中使用激活 cors 域。 对于蛋糕 3.3+ 使用分支 要求 PHP 7.2 或更高版本 CakePhp 4.0 或更高版本 安装 您可以使用将此插件安装到您的 CakePHP 应用程序中。 安装 ...
  • CakePHP系列(五)----路由

    千次阅读 2017-02-25 10:12:16
    CakePHP中的路由还包括反向路由的想法,其中参数数组可以转换为URL字符串。 通过使用反向路由,您可以重新考虑应用程序的网址结构,而无需更新所有代码。 快速浏览 本节将通过示例介绍...

    路由


    class Cake\Routing\


    路由提供了将URL映射到控制器操作的工具。 通过定义路由,您可以分离应用程序的实现方式与其URL的结构。

    在CakePHP中的路由还包括反向路由的想法,其中参数数组可以转换为URL字符串。 通过使用反向路由,您可以重新考虑应用程序的网址结构,而无需更新所有代码。


    快速浏览

    本节将通过示例介绍CakePHP路由器的最常见用法。 通常,您希望将某些内容显示为目标网页,因此您需要将其添加到routes.php文件中:

    use Cake\Routing\Router;
    
    // Using the scoped route builder.
    Router::scope('/', function ($routes) {
        $routes->connect('/', ['controller' => 'Articles', 'action' => 'index']);
    });
    
    // Using the static method.
    Router::connect('/', ['controller' => 'Articles', 'action' => 'index']);

    Router提供两个接口用于连接路由。 静态方法是向后兼容的接口,而作用域构建器在构建多个路由时提供更简洁的语法,并提供更好的性能。

    当你的网站的主页被访问时,这将执行ArticlesController的索引方法。 有时候,您需要接受多个参数的动态路由,例如,查看文章内容的路由就是这种情况:

    Router::connect('/articles/*', ['controller' => 'Articles', 'action' => 'view']);

    上述路由将接受任何看起来像/articles/15 URL,并调用ArticlesController的方法view(15) 。 但这不会阻止人们尝试访问看起来像/articles/foobar网址。 如果你愿意,你可以限制一些参数符合正则表达式:

    Router::connect(
        '/articles/:id',
        ['controller' => 'Articles', 'action' => 'view'],
        ['id' => '\d+', 'pass' => ['id']]
    );

    上一个示例将星座匹配器更改为一个新的占位符:id 。 使用占位符允许我们验证URL的部分,在这种情况下,我们使用\d+正则表达式,以便只有数字匹配。 最后,我们告诉路由器通过指定pass选项将id占位符作为view()函数的函数参数。 稍后再使用此选项。

    CakePHP路由器还可以反向匹配路由。 这意味着,从包含匹配参数的数组,它能够生成一个URL字符串:

    use Cake\Routing\Router;
    
    echo Router::url(['controller' => 'Articles', 'action' => 'view', 'id' => 15]);
    // Will output
    /articles/15

    路由还可以标记为唯一的名称,这允许您在构建链接时快速引用它们,而不是指定每个路由参数:

    use Cake\Routing\Router;
    
    Router::connect(
        '/login',
        ['controller' => 'Users', 'action' => 'login'],
        ['_name' => 'login']
    );
    
    echo Router::url(['_name' => 'login']);
    // Will output
    /login

    为了帮助保持路由代码干燥,路由器具有“范围”的概念。 范围定义公共路径段,并且可选地路由默认值。 在范围内连接的任何路由将从其包装范围继承路径/默认值:

    Router::scope('/blog', ['plugin' => 'Blog'], function ($routes) {
        $routes->connect('/', ['controller' => 'Articles']);
    });

    上述路由将匹配/blog/并发送到Blog\Controller\ArticlesController::index() 。

    应用程序框架带有几个路由,让您开始。 添加自己的路由后,如果不需要,可以删除默认路由。

    连接路由


    static Cake\Routing\Router:: connect  $ route , $ defaults = [] , $ options = [] 

    为了保持代码干燥,你应该使用“路由范围”。 路由范围不仅让你保持你的代码DRY,他们还帮助路由器优化其操作。 如上所示,你也可以使用Router::connect()连接路由。 此方法默认为/ scope。 要创建一个范围并连接一些路由,我们将使用scope()方法:

    // In config/routes.php
    use Cake\Routing\Route\DashedRoute;
    
    Router::scope('/', function ($routes) {
        $routes->fallbacks(DashedRoute::class);
    });
    

    connect()方法最多需要三个参数:您要匹配的URL模板,路由元素的默认值和路由选项。 选项经常包括正则表达式规则,以帮助路由器匹配URL中的元素。

    路由定义的基本格式为:

    $routes->connect(
        'URL template',
        ['default' => 'defaultValue'],
        ['option' => 'matchingRegex']
    );

    第一个参数用于告诉路由器您尝试控制哪种类型的URL。 URL是正常的斜线分隔字符串,但也可以包含通配符(*)或路由元素 。 使用通配符告诉路由器您愿意接受任何提供的附加参数。 没有*的路由仅匹配提供的确切模板模式。

    一旦你指定了一个URL,你使用connect()的最后两个参数来告诉CakePHP在一个请求匹配后如何处理。 第二个参数是关联数组。 数组的键应以URL模板表示的路由元素命名。 数组中的值是这些键的默认值。 让我们看看一些基本的例子,我们开始使用connect()的第三个参数:

    $routes->connect(
        '/pages/*',
        ['controller' => 'Pages', 'action' => 'display']
    );

    此路由在用CakePHP分发的routes.php文件中找到。 它匹配以/pages/开头的任何URL,并将它转移到PagesControllerdisplay()操作。 /pages/products请求将映射到PagesController->display('products') 。

    除了贪婪的星/*还有/**结尾的星号语法。 使用结尾双星,将捕获URL的剩余部分作为单个传递的参数。 当您想要使用包含/的参数时,这是有用的:

    $routes->connect(
        '/pages/**',
        ['controller' => 'Pages', 'action' => 'show']
    );

    /pages/the-example-/-and-proof的传入URL将导致一个传递the-example-/-and-proof 。

    您可以使用connect()的第二个参数提供由路由的默认值组成的任何路由参数:

    $routes->connect(
        '/government',
        ['controller' => 'Pages', 'action' => 'display', 5]
    );

    此示例显示如何使用connect()的第二个参数定义默认参数。 如果您构建了一个网站,其中包含针对不同类别客户的产品,则可以考虑创建路由。 这允许您链接到/government而不是/pages/display/5 。

    路由器的另一个常见用途是为控制器定义“别名”。 让我们说,不是访问/users/some_action/5的常规URL,我们希望能够通过/cooks/some_action/5访问它。 以下路由处理:

    $routes->connect(
        '/cooks/:action/*', ['controller' => 'Users']
    );

    这告诉路由器任何以/cooks/开头的URL都应该发送给用户控制器。 调用的操作将取决于:action参数的值。 通过使用路由元素 ,您可以创建可变路由,接受用户输入或变量。 上述路线也使用贪婪星。 贪婪的星标表示Router这个路由应该接受任何额外的位置参数给定。 这些参数将在Passed Arguments数组中可用 。

    当生成URL时,也使用路由。 如果上述路由是找到的第一个匹配['controller' => 'Users', 'action' =>'some_action', 5]使用['controller' => 'Users', 'action' => 'some_action', 5]作为URL将输出/cooks/some_action/5 。

    路由元素

    您可以指定自己的路由元素,这样您就可以在URL中定义控制器操作的参数所在的位置。 当发出请求时,这些路由元素的值在控制器的$this->request->getParam()中找到。 当定义自定义路由元素时,您可以选择指定正则表达式 - 这告诉CakePHP如何知道URL是否正确形成。 如果选择不提供正则表达式,则任何非字符将被视为参数的一部分:

    $routes->connect(
        '/:controller/:id',
        ['action' => 'view'],
        ['id' => '[0-9]+']
    );

    上面的例子说明了如何创建一个快速的方法来从任何控制器通过创建一个看起来像/controllername/:id的URL来查看模型。 提供给connect()的URL指定两个路由元素:controller:id 。 :controller元素是CakePHP默认路由元素,因此路由器知道如何匹配和识别URL中的控制器名称。 :id元素是自定义路由元素,必须通过在connect()的第三个参数中指定匹配的正则表达式来进一步澄清。

    当使用:controller参数时,CakePHP不会自动生成小写和虚线的URL。 如果你需要这个,上面的例子可以这样改写:

    use Cake\Routing\Route\DashedRoute;
    
    $routes->connect(
        '/:controller/:id',
        ['action' => 'view'],
        ['id' => '[0-9]+', 'routeClass' => DashedRoute::class]
    );

    DashedRoute类将确保:controller:plugin参数正确地小写和虚线。

    如果在从CakePHP 2.x应用程序迁移时需要低阶和低字节URL,则可以使用InflectedRoute类。

    ▲ 注意: 用于路线元素的模式不能包含任何捕获组。 如果它们,路由器将无法正常工作。

    一旦定义了这个路由,请求/apples/5将调用ApplesController的view()方法。 在view()方法中,您需要访问$this->request->getParam('id')传递的ID。

    如果应用程序中有单个控制器,并且不希望控制器名称显示在URL中,则可以将所有URL映射到控制器中的操作。 例如,要将所有URL映射到home控制器的操作,例如具有/demo而不是/home/demo URL,您可以执行以下操作:

    $routes->connect('/:action', ['controller' => 'Home']);

    如果您想提供不区分大小写的网址,可以使用正则表达式内联修饰符:

    $routes->connect(
        '/:userShortcut',
        ['controller' => 'Teachers', 'action' => 'profile', 1],
        ['userShortcut' => '(?i:principal)']
    );

    再举一个例子,你会成为一个路由专家:

    $routes->connect(
        '/:controller/:year/:month/:day',
        ['action' => 'index'],
        [
            'year' => '[12][0-9]{3}',
            'month' => '0[1-9]|1[012]',
            'day' => '0[1-9]|[12][0-9]|3[01]'
        ]
    );

    这是相当参与,但显示如何强大的路线可以。 提供的URL具有四个路由元素。 第一个是我们熟悉的:它是一个默认路由元素,它告诉CakePHP期望一个控制器名称。

    接下来,我们指定一些默认值。 不管控制器如何,我们想要调用index()动作。

    最后,我们指定将以数字形式匹配年,月和日的一些正则表达式。 请注意,正则表达式中不支持括号(分组)。 您仍然可以指定替代项,如上所述,但不能用括号分组。

    一旦定义,此路由将匹配/articles/2007/02/01 , /articles/2004/11/16 2004/11/16,将请求传递到各自控制器的index()动作,日期参数在$this->request->getParam()

    在CakePHP中有几个具有特殊含义的路由元素,除非你想要特殊的含义,否则不应该使用

    • controller用于为路由命名控制器。
    • action用于为路由命名控制器操作。
    • plugin用于命名控制器所在的插件。
    • prefix用于前缀路由
    • _ext用于文件扩展路由 。
    • _base设置为false以从生成的URL中删除基本路径。 如果您的应用程序不在根目录中,这可以用于生成“蛋糕相对”的URL。
    • _scheme设置以在不同的方案(如webcalftp)上创建链接。 默认为当前方案。
    • _host设置要用于链接的主机。 默认为当前主机。
    • _port如果需要在非标准端口上创建链接,请设置端口。
    • _full如果为true , FULL_BASE_URL常数将添加到生成的URL前。
    • #允许您设置URL哈希碎片。
    • _ssl设置为true可将生成的URL转换为https或false以强制使用http。
    • _method定义要使用的HTTP动词/方法。 在使用创建RESTful路由时很有用。
    • _name路由名称。 如果您设置了命名路由,您可以使用此键指定它。

    将参数传递给Action

    当使用Route Elements连接路由时,你可能想让routes元素传递参数。 pass选项将所有路由元素也作为参数传递到控制器函数中:

    // src / Controller / BlogsController.php
     public function view ( $ articleId = null , $ slug = null )
     {
         //这里有一些代码...
     }}
    
     // routes.php
     Router :: scope ( '/' , function ( $ routes ) {
         $ routes - > connect (
             '/ blog /:id-:slug' , // Eg / blog / 3-CakePHP_Rocks
             [ 'controller' => 'Blogs' , 'action' => 'view' ],
             [
                 //在路由模板中定义路由元素
                 //作为函数参数传递。  订单从这以来重要
                 //将简单地将“:id”映射到您的操作中的$ articleId
                 'pass' => [ 'id' , 'slug' ],
                 //定义一个'id'必须匹配的模式。
                 'id' => '[0-9] +'
             ]]
         );
     });

    现在感谢反向路由功能,您可以传入如下的URL数组,CakePHP将知道如何形成在路由中定义的URL:

    // view.ctp
    // This will return a link to /blog/3-CakePHP_Rocks
    echo $this->Html->link('CakePHP Rocks', [
        'controller' => 'Blog',
        'action' => 'view',
        'id' => 3,
        'slug' => 'CakePHP_Rocks'
    ]);
    
    // You can also used numerically indexed parameters.
    echo $this->Html->link('CakePHP Rocks', [
        'controller' => 'Blog',
        'action' => 'view',
        3,
        'CakePHP_Rocks'
    ]);

    使用命名路径

    有时你会发现输入一个路由的所有URL参数太详细,或者你想利用命名路由的性能改进。 当连接路由时,您可以指定_name选项,此选项可用于反向路由,以标识要使用的路由:

    // Connect a route with a name.
    $routes->connect(
        '/login',
        ['controller' => 'Users', 'action' => 'login'],
        ['_name' => 'login']
    );
    
    // Generate a URL using a named route.
    $url = Router::url(['_name' => 'login']);
    
    // Generate a URL using a named route,
    // with some query string args.
    $url = Router::url(['_name' => 'login', 'username' => 'jimmy']);

    如果你的路由模板包含任何路由元素,如:controller你需要提供这些作为选项到Router::url() 。


    ▲ 注意: 整个应用程序中的路径名称必须是唯一的。 相同的_name不能使用两次,即使名称出现在不同的路由范围内。

    在构建命名路由时,您可能希望遵守路由名称的一些约定。 CakePHP通过允许您在每个作用域中定义名称前缀,使构建路由名称变得更容易:

    Router::scope('/api', ['_namePrefix' => 'api:'], function ($routes) {
        // This route's name will be `api:ping`
        $routes->connect('/ping', ['controller' => 'Pings'], ['_name' => 'ping']);
    });
    // Generate a URL for the ping route
    Router::url(['_name' => 'api:ping']);
    
    // Use namePrefix with plugin()
    Router::plugin('Contacts', ['_namePrefix' => 'contacts:'], function ($routes) {
        // Connect routes.
    });
    
    // Or with prefix()
    Router::prefix('Admin', ['_namePrefix' => 'admin:'], function ($routes) {
        // Connect routes.
    });

    您还可以在嵌套作用_namePrefix使用_namePrefix选项,它的工作原理如下:

    Router::plugin('Contacts', ['_namePrefix' => 'contacts:'], function ($routes) {
        $routes->scope('/api', ['_namePrefix' => 'api:'], function ($routes) {
            // This route's name will be `contacts:api:ping`
            $routes->connect('/ping', ['controller' => 'Pings'], ['_name' => 'ping']);
        });
    });
    
    // Generate a URL for the ping route
    Router::url(['_name' => 'contacts:api:ping']);

    在命名的作用域中连接的路由只有在路由也被命名时才添加名称。 无名路由不会有_namePrefix应用于它们。

    前缀路由


    static Cake\Routing\Router:: prefix ( $ name , $ callback )


    许多应用程序需要一个管理部分,特权用户可以进行更改。 这通常通过特殊URL(如/admin/users/edit/5 。 在CakePHP中,可以使用prefix作用域方法启用前缀路由:

    use Cake\Routing\Route\DashedRoute;
    
    Router::prefix('admin', function ($routes) {
        // All routes here will be prefixed with `/admin`
        // And have the prefix => admin route element added.
        $routes->fallbacks(DashedRoute::class);
    });

    前缀被映射到应用程序的Controller命名空间中的子Controller空间。 通过将前缀作为单独的控制器,您可以创建更小和更简单的控制器。 前缀和非前缀控制器通用的行为可以使用继承, 组件或traits封装 。 使用我们的用户示例,访问URL/admin/users/edit/5将调用src / Controller / Admin / UsersController.php传递5的edit()方法作为第一个参数。 所使用的视图文件将是src / Template / Admin / Users / edit.ctp

    您可以使用以下路由将URL / admin映射到页面控制器的index()操作:

    Router::prefix('admin', function ($routes) {
        // Because you are in the admin scope,
        // you do not need to include the /admin prefix
        // or the admin route element.
        $routes->connect('/', ['controller' => 'Pages', 'action' => 'index']);
    });

    创建前缀路由时,可以使用$options参数设置其他路由参数:

    Router::prefix('admin', ['param' => 'value'], function ($routes) {
        // Routes connected here are prefixed with '/admin' and
        // have the 'param' routing key set.
        $routes->connect('/:controller');
    });


    您还可以在插件作用域中定义前缀:

    Router::plugin('DebugKit', function ($routes) {
        $routes->prefix('admin', function ($routes) {
            $routes->connect('/:controller');
        });
    });

    以上将创建一个路由模板,如/manager/admin/:controller 。 连接的路由将prefix route元素设置为manager/admin 。

    当前前缀将从控制器方法通过$this->request->getParam('prefix')

    当使用前缀路由时,设置前缀选项很重要。 以下是使用HTML帮助构建此链接的​​方法:

    // Go into a prefixed route.
    echo $this->Html->link(
        'Manage articles',
        ['prefix' => 'manager', 'controller' => 'Articles', 'action' => 'add']
    );
    
    // Leave a prefix
    echo $this->Html->link(
        'View Post',
        ['prefix' => false, 'controller' => 'Articles', 'action' => 'view', 5]
    );

    ▲ 注意: 在连接回退路由之前,应连接前缀路由。

    插件路由

    static Cake\Routing\Router:: plugin ( $ name , $ options = [] , $ callback )

    应使用plugin()方法创建插件的路由。 此方法为插件的路由创建一个新的路由范围:
    Router::plugin('DebugKit', function ($routes) {
        // Routes connected here are prefixed with '/debug_kit' and
        // have the plugin route element set to 'DebugKit'.
        $routes->connect('/:controller');
    });

    创建插件作用域时,您可以自定义与path选项一起使用的路径元素:

    Router::plugin('DebugKit', ['path' => '/debugger'], function ($routes) {
        // Routes connected here are prefixed with '/debugger' and
        // have the plugin route element set to 'DebugKit'.
        $routes->connect('/:controller');
    });

    以上将创建一个看起来像/admin/debug_kit/:controller 。 它将设置prefixplugin路由元素。

    您可以通过将插件键添加到URL数组来创建指向插件的链接:

    Router::prefix('admin', function ($routes) {
        $routes->plugin('DebugKit', function ($routes) {
            $routes->connect('/:controller');
        });
    });

    相反,如果活动请求是一个插件请求,并且您想创建一个没有插件的链接,您可以执行以下操作:

    echo $this->Html->link(
        'New todo',
        ['plugin' => 'Todo', 'controller' => 'TodoItems', 'action' => 'create']
    );

    通过设置plugin => null你告诉路由器,你想创建一个不是插件的一部分的链接。

    SEO友好路由

    有些开发者更喜欢在网址中使用破折号,因为它被认为可以提供更好的搜索引擎排名。 DashedRoute类可以在您的应用程序中使用,能够将插件,控制器和骆驼化动作名称路由到虚线URL。

    例如,如果我们有一个ToDo插件,一个TodoItems控制器和一个showItems()动作,可以通过以下路由器连接访问/to-do/todo-items/show-items :

    use Cake\Routing\Route\DashedRoute;
    
    Router::plugin('ToDo', ['path' => 'to-do'], function ($routes) {
        $routes->fallbacks(DashedRoute::class);
    });

    匹配特定的HTTP方法

    路由可以使用_method路由密钥匹配特定的HTTP方法:

    Router::scope('/', function($routes) {
        // This route only matches on POST requests.
        $routes->connect(
            '/reviews/start',
            ['controller' => 'Reviews', 'action' => 'start', '_method' => 'POST']
        );
    });

    您可以使用数组匹配多个HTTP方法。 因为_method参数是路由键,它参与URL解析和URL生成。

    匹配特定主机名

    路由可以使用_host选项仅匹配特定主机。 您可以使用*. 通配符匹配任何子域:

    Router::scope('/', function($routes) {
        // This route only matches on http://images.example.com
        $routes->connect(
            '/images/default-logo.png',
            ['controller' => 'Images', 'action' => 'default'],
            ['_host' => 'images.example.com']
        );
    
        // This route only matches on http://*.example.com
        $routes->connect(
            '/images/old-log.png',
            ['controller' => 'Images', 'action' => 'oldLogo'],
            ['_host' => '*.example.com']
        );
    });

    _host选项也用于URL生成。 如果您的_host选项指定了确切的域,则该域将包含在生成的URL中。 但是,如果您使用通配符,则需要在生成URL时提供_host参数:

    // If you have this route
    $routes->connect(
        '/images/old-log.png',
        ['controller' => 'Images', 'action' => 'oldLogo'],
        ['_host' => '*.example.com']
    );
    
    // You need this to generate a url
    echo Router::url([
        'controller' => 'Images',
        'action' => 'oldLogo',
        '_host' => 'images.example.com'
    ]);

    路由文件扩展名


    static Cake\Routing\Router:: extensions ( string | array | null $ extensions , $ merge = true )

    要使用路由处理不同的文件扩展名,您可以将以下内容添加到路由文件中:

    Router::scope('/', function ($routes) {
        $routes->extensions(['json', 'xml']);
        ...
    });

    这将启用在extensions()调用之后连接的所有路由的命名扩展。 在其之前连接的任何路由将不会继承扩展。


    ▲ 注意: 设置扩展应该是你在范围内做的第一件事,因为扩展只会应用于在扩展设置后连接的路由。

    通过使用扩展,您告诉路由器删除任何匹配的文件扩展名,然后解析剩余的。 如果您要创建/page/title-of-page.html等网址,则可以使用以下方式创建路线:

    Router::scope('/page', function ($routes) {
        $routes->extensions(['json', 'xml', 'html']);
        $routes->connect(
            '/:title',
            ['controller' => 'Pages', 'action' => 'view'],
            [
                'pass' => ['title']
            ]
        );
    });

    然后创建映射回路由的链接只需使用:

    $this->Html->link(
        'Link title',
        ['controller' => 'Pages', 'action' => 'view', 'title' => 'super-article', '_ext' => 'html']
    );

    请求处理使用文件扩展名根据内容类型进行自动视图切换。

    创建RESTful路由

     路由器使您能够轻松地为控制器生成RESTful路由。 当您为应用程序创建API端点时,RESTful路由很有用。 如果我们想允许REST访问配方控制器,我们会这样做:

    // In config/routes.php...
    
    Router::scope('/', function ($routes) {
        $routes->extensions(['json']);
        $routes->resources('Recipes');
    });

    第一行设置了一些默认路由以方便REST访问,其中方法指定所需的结果格式(例如xml,json,rss)。 这些路由是HTTP请求方法敏感的。

    HTTP format URL.format Controller action invoked
    GET /recipes.format RecipesController::index()
    GET /recipes/123.format RecipesController::view(123)
    POST /recipes.format RecipesController::add()
    PUT /recipes/123.format RecipesController::edit(123)
    PATCH /recipes/123.format RecipesController::edit(123)
    DELETE /recipes/123.format RecipesController::delete(123)

    CakePHP的Router类使用了许多不同的指标来检测正在使用的HTTP方法。 这里他们是优先级:

    1. _method POST变量
    2. X_HTTP_METHOD_OVERRIDE
    3. REQUEST_METHOD标头

    _method POST变量有助于将浏览器用作REST客户端(或任何其他可以执行POST的操作)。 只需将_method的值设置为要仿真的HTTP请求方法的名称。

    创建嵌套的资源路由

    一旦连接了作用域中的资源,您就可以连接子资源的路由。 子资源路由将以原始资源名称和id参数为前缀。 例如:

    Router::scope('/api', function ($routes) {
        $routes->resources('Articles', function ($routes) {
            $routes->resources('Comments');
        });
    });

    将为articlescomments生成资源路由。 评论路线将如下所示:

    /api/articles/:article_id/comments
    /api/articles/:article_id/comments/:id

    您可以通过以下article_id获取article_id中的CommentsController :

    $this->request->getParam('article_id');

    默认情况下,资源路由映射到包含作用域的相同前缀。 如果您有嵌套和非嵌套资源控制器,您可以使用前缀在每个上下文中使用不同的控制器:

    Router::scope('/api', function ($routes) {
        $routes->resources('Articles', function ($routes) {
            $routes->resources('Comments', ['prefix' => 'articles']);
        });
    });

    以上会将“注释”资源映射到App\Controller\Articles\CommentsController 。 使用单独的控制器可以使您的控制器逻辑更简单。 以这种方式创建的前缀与前缀路由兼容。

    ▲ 注意: 虽然您可以根据需要尽可能深入地嵌套资源,但不建议将超过2个资源嵌套在一起。

    限制创建的路由

    默认情况下,CakePHP将为每个资源连接6个路由。 如果您只想连接特定的资源路由,您可以使用only选项:

    $routes->resources('Articles', [
        'only' => ['index', 'view']
    ]);

    将创建只读资源路由。 路由名称为create , update , view , indexdelete 。

    更改控制器使用的操作

    您可能需要更改在连接路由时使用的控制器操作名称。 例如,如果您的edit()操作被调用put()您可以使用actions键重命名使用的actions :

    $routes->resources('Articles', [
        'actions' => ['update' => 'put', 'create' => 'create']
    ]);

    上面将使用put()作为edit()动作,而create()而不是add() 。

    映射其他资源路由

    您可以使用map选项映射其他资源方法:

    $routes->resources('Articles', [
       'map' => [
           'deleteAll' => [
               'action' => 'deleteAll',
               'method' => 'DELETE'
           ]
       ]
    ]);
    // This would connect /articles/deleteAll

    除了默认路由,这也将连接/ articles / delete_all的路由 。 默认情况下,路径段将匹配键名称。 您可以使用资源定义中的“path”键来自定义路径名:

    $routes->resources('Articles', [
        'map' => [
            'updateAll' => [
                'action' => 'updateAll',
                'method' => 'DELETE',
                'path' => '/update_many'
            ],
        ]
    ]);
    // This would connect /articles/update_many

    如果您定义“only”和“map”,请确保您映射的方法也在“仅”列表中。

    资源路由的自定义路由类

    您可以在resources()$options数组中提供connectOptions键,以提供connect()使用的自定义设置:

    Router::scope('/', function ($routes) {
        $routes->resources('Books', [
            'connectOptions' => [
                'routeClass' => 'ApiRoute',
            ]
        ];
    });

    资源路由的URL变形

    默认情况下,多字控制器的URL片断是控制器名称的下划线形式。 例如, BlogPostsController的URL片段将是/ blog_posts 。

    你可以通过改变选项指定一个替代的转折型:

    Router::scope('/', function ($routes) {
        $routes->resources('BlogPosts', [
            'inflect' => 'dasherize' // Will use ``Inflector::dasherize()``
        ];
    });

    上面将生成URL样式如: / blog-posts / * 。

    ▲ 注意: 从CakePHP 3.1起,官方应用程序框架使用DashedRoute作为其默认路由类。 'inflect' => 'dasherize'在连接资源路由时使用'inflect' => 'dasherize'选项来确保URL一致性。

    传递参数

    传递的参数是在发出请求时使用的附加参数或路径段。 它们通常用于将参数传递给控制器​​方法。

    http://localhost/calendars/view/recent/mark

    在上面的例子中, recentmark都传递给CalendarsController::view() 。 传递的参数以三种方式提供给您的控制器。 首先作为调用的动作方法的参数,其次它们在$this->request->getParam('pass')可用作数字索引数组。 当使用自定义路由时,您可以强制特定参数进入传递的参数。

    如果你访问前面提到的URL,并且你有一个控制器操作,看起来像:

    class CalendarsController extends AppController
    {
        public function view($arg1, $arg2)
        {
            debug(func_get_args());
        }
    }

    您将获得以下输出:

    Array
    (
        [0] => recent
        [1] => mark
    )

    这些相同的数据也可以在你的控制器,视图和助手的$this->request->getParam('pass') 。 传递数组中的值将根据它们在调用的URL中显示的顺序进行数字索引:

    debug($this->request->getParam('pass'));

    以上任一将输出:

    Array
    (
        [0] => recent
        [1] => mark
    )

    在生成URL时,使用路由数组 ,将传递的参数作为值添加到数组中,而不带字符串键:

    ['controller' => 'Articles', 'action' => 'view', 5]

    由于5有一个数字键,它被视为传递的参数。

    生成网址

    static Cake\Routing\Router:: url  $ url = null , $ full = false 

    生成URL或反向路由是CakePHP中的一个功能,用于允许您更改URL结构,而无需修改所有代码。 通过使用路由数组定义URL,您可以稍后配置路由,生成的URL将自动更新。

    如果您使用以下字符串创建网址:

    $this->Html->link('View', '/articles/view/' . $id);

    再后来决定/articles应该被称为'文章',而不是,你必须通过你的整个应用程序的URL重命名。不过,如果你定义你的链接,如:

    $this->Html->link(
        'View',
        ['controller' => 'Articles', 'action' => 'view', $id]
    );


    然后,当你决定改变你的网址,你可以通过定义路由这样做。这将同时更改传入URL映射,以及生成的URL。

    当使用数组的URL,可以使用特殊键同时定义查询字符串参数和文件片段:

    Router::url([
        'controller' => 'Articles',
        'action' => 'index',
        '?' => ['page' => 1],
        '#' => 'top'
    ]);
    
    // Will generate a URL like.
    /articles/index?page=1#top

    路由器也将转换任何未知参数在路由数组查询字符串参数。?供使用旧版本的CakePHP的向后兼容性。

    生成URL时,也可以使用任何特殊的路由元素:

    • _ext用于路由文件扩展路由。
    • _base设置为false从生成的URL删除的基本路径。如果你的应用是不是在根目录下,这可以用来生成是“蛋糕亲属”的网址。
    • _scheme将创建不同的方式,如链接webcalftp默认为当前方案。
    • _host设置为用于链接的主机。默认为当前主机。
    • _port 如果你需要创建非标准端口的链接设置端口。
    • _full如果trueFULL_BASE_URL常数将被追加到生成的URL。
    • _ssl设置为true将生成的URL转换为HTTPS或false强制HTTP。
    • _name路线名称。如果您已经安装命名路由,您可以使用此键来指定。

    重定向路由

    重定向路由允许您发出HTTP状态30倍重定向传入的路线,并在不同的URL指向他们。当你想通知资源已经被移动客户端应用程序,你不希望暴露两个网址为相同的内容,这非常有用。

    仿佛找到匹配的,他们执行实际的头重定向路由重定向从正常的途径不同。重定向,则可能对您的应用程序或外部位置中的一个目的地:

    Router::scope('/', function ($routes) {
        $routes->redirect(
            '/home/*',
            ['controller' => 'Articles', 'action' => 'view'],
            ['persist' => true]
            // Or ['persist'=>['id']] for default routing where the
            // view action expects $id as an argument.
        );
    })


    重定向/home/*/articles/view并传递参数/articles/view。使用数组作为重定向目的地,您可以使用其他途径来定义URL字符串应该被重定向到。您可以重定向到使用字符串的URL作为目标外部位置:


    Router::scope('/', function ($routes) {
        $routes->redirect('/articles/*', 'http://google.com', ['status' => 302]);
    });

    这将重定向/articles/*http://google.com与302 HTTP状态。

    自定义路由类

    自定义路由类,可以扩展和更改路由如何解析个人请求和处理反向路由。路线班有几个约定:

    • 路线类可望在可以找到Routing\\Route你的应用程序或插件的命名空间。
    • 路线类应该扩展Cake\Routing\Route
    • 路线类应实现的一个或两个match()和/或parse()

    parse()方法用于分析传入的URL。应产生的,可以拆分成一个控制器及动作请求参数的阵列。返回false从这个方法来指示匹配失败。

    match()方法用于匹配的URL参数数组,并创建一个字符串的URL。如果URL参数不匹配的路径false应返回。

    通过使路由时,可以使用自定义的路由类routeClass选项:

    $routes->connect(
         '/:slug',
         ['controller' => 'Articles', 'action' => 'view'],
         ['routeClass' => 'SlugRoute']
    );

    这条路线将创建一个实例SlugRoute,让你实现自定义的参数处理。您可以使用使用标准插件路线类插件的语法

    默认路由类

      Cake\Routing\Router::  defaultRouteClass    $ routeClass = NULL 

    如果你要使用的所有路由的备用路由类除了默认的Route,你可以通过调用这么做Router::defaultRouteClass()设置任何路由前,避免指定routeClass每个路由选项。例如使用:

    use Cake\Routing\Route\InflectedRoute;
    
    Router::defaultRouteClass(InflectedRoute::class);

    会导致在此之后连接到使用的所有路由InflectedRoute的路由类。调用该方法不带参数将返回当前的默认路由类。

    回退法

    Cake\Routing\Router::  fallbacks    $ routeClass = NULL 

    该回退的方法是定义默认路由一个简单快捷。该方法使用传递的路由类所定义的规则,如果没有类提供了由返回的类Router::defaultRouteClass()使用。

    调用像这样回退:

    use Cake\Routing\Route\DashedRoute;
    
    $routes->fallbacks(DashedRoute::class);

    相当于下列显式调用:

    use Cake\Routing\Route\DashedRoute;
    
    $routes->connect('/:controller', ['action' => 'index'], ['routeClass' => DashedRoute:class]);
    $routes->connect('/:controller/:action/*', [], ['routeClass' => DashedRoute:class]);

    ▲ 注意: 使用默认路由类(Route)与回退,或任何与路线:plugin和/或:controller路线的元素将导致不一致的URL的情况下。

    创建持久URL参数

    您可以使用URL过滤功能挂钩到URL生成过程。过滤函数被调用之前的网址会根据路由匹配,这可以让你的路由之前准备的URL。

    回调的过滤功能应该期望以下参数:

    • $params 该网址参数正在处理中。
    • $request 当前的请求。

    该URL过滤功能应始终返回PARAMS即使不变。

    URL过滤器,可以实现像执着参数功能:

    Router::addUrlFilter(function ($params, $request) {
        if ($request->getParam('lang') && !isset($params['lang'])) {
            $params['lang'] = $request->getParam('lang');
        }
        return $params;
    });

    过滤功能在它们所连接的顺序应用。

    另一种使用情况正在改变运行时某条路(例如插件路线):

    Router::addUrlFilter(function ($params, $request) {
        if (empty($params['plugin']) || $params['plugin'] !== 'MyPlugin' || empty($params['controller'])) {
            return $params;
        }
        if ($params['controller'] === 'Languages' && $params['action'] === 'view') {
            $params['controller'] = 'Locations';
            $params['action'] = 'index';
            $params['language'] = $params[0];
            unset($params[0]);
        }
        return $params;
    });

    这将改变以下路线:

    Router::url(['plugin' => 'MyPlugin', 'controller' => 'Languages', 'action' => 'view', 'es']);

    进入:

    Router::url(['plugin' => 'MyPlugin', 'controller' => 'Locations', 'action' => 'index', 'language' => 'es']);

    在处理的URL命名参数


    虽然命名参数是在CakePHP的3.0删除,应用程序可能已发布的U​​RL包含它们。您可以继续接受包含命名参数的URL。

    在你的控制器的beforeFilter()方法,你可以打电话parseNamedParams()来提取传递的参数的命名参数:

    public function beforeFilter(Event $event)
    {
        parent::beforeFilter($event);
        Router::parseNamedParams($this->request);
    }

    这将填充$this->request->getParam('named')在传递的参数中找到的任何命名参数。这被解读为一个命名参数的任何传递参数,它将传递的参数列表中删除。



    展开全文
  • CakePHP PostgreSQL 实用程序 PgUtils 提供了一小组对处理 Postgres 数据源有用的行为。 要求 master 分支有以下要求: CakePHP 2.2.0 或更高版本。 PHP 5.3.0 或更高版本。 特征 搜索行为 - 在模型上执行文本搜索...
  • CakePHP PHP框架 v3.9.2

    2020-09-28 08:56:36
    为您提供CakePHP PHP框架下载,CakePHP是一个快速开发PHP的框架,其中使用了一些常见的设计模式如ActiveRecord,Association Data Mapping,Front Controller以及MVC。其主要目标在于提供一个令任意水平的PHP开发...
  • CakePHP路由

    2019-03-06 15:23:39
    CakePHP路由,连接路由 Router:: connect()方法用于连接路线........
  • 初学CAKEPHP 基础教程

    2020-10-29 15:11:01
    哈!很久没进来过了!今天又重新敲着键盘!把字打进我的BLOG!目的是计下我新学的内容!今天是看CAKEPHP教程的第一天!看完之后!也该写点什么!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,047
精华内容 4,018
关键字:

cakephp4