标签: laravel

  • Laravel Eloquent 中的一对一,一对多,多对多

    一对一使用 hasOne   反向 belongsTo
    一对多使用 hasMany反向 belongsTo
    多对多使用 belongsToMany反向 BelongsToMany

  • Laravel网站根目录权限设置

    for directories

    find . -type d -print0 | xargs -0 chmod 0755

    for files

    find . -type f -print0 | xargs -0 chmod 0644
    chown -R www-data:www-data *

    把当前文件夹也加入php-fpm用户组

    chown -R www-data:www-data .

    更改 storage 文件夹权限

    chmod -R 0755 storage

     

  • 使用 Composer 升级 Laravel Installer

    安装laravel installer, 如果已经安装了,这一步略过

    composer global require laravel/installer

    更新larvel installer

    composer global update laravel/installer

    查看全局安装了哪些包以及相关信息

    composer global show

    也可以用

    laravel --version

    查看安装器的版本

  • Hello, Laravel

    经过一周的紧张开发,又一个面向银行的内部系统总算完成了。这个系统本来打算是用 .NET 来做,但这段时间一直心心念念 Laravel 框架,就像所有趁手好用的工具一样,只要用过一次,就忘不掉她的好。

    经过简单分析,发现这个系统其实并没有复杂的业务和计算,由于是内部系统,也不存在高并发的可能,所以,对于 Laravel 是适用的。本来 .NET 开发的系统已经完成了 70% ,花了一周不到的时间就用 Laravel 重写完成了,不得不感慨开发速度之快,同时开发体验拉满。

    这么多年来,虽说 PHP 也在断断续续的用,但从没怎么把它当回事,一般的项目主要还是使用 .NET 来做。对于自由开发者来说,.NET 可谓是相当的万金油,既可以做桌面开发,也可以做 Web 开发,关键时刻还可以拿来写一写安卓移动应用。由于是静态编译型语言,性能基本够用,配合 SQL Server 数据库,基本没有做不了的项目。

    但是,自从知道 Laravel 框架后,就在慢慢地在不断了解,越了解就越被她的优雅所打动,这里我也用了优雅这个词,因为实在没有想到更好的词能描述那种感觉。直到去年,尝试用她开发了一个小项目,由于当时对 Eloquent 了解还不够深入,甚至多对多、一对多这种关系的用法还不太清楚,就强行上了,结果也还行,顺顺利利的开发完成。

    这次的项目开发,在彻底弄清了 Eloquent 之后,就果断切换到 Laravel 来开发,真的是太好用了,再也不用定义 ASP.NET 里面的那一堆堆的实体类,再也不再需要 AutoMapper,再也不用那蹩脚的表单验证,再也不用等待编译生成,等等好处无法一一言说。总之就是开发轻量了,保存即生效,刷新即可看效果,整个过程轻松加愉快,身心愉悦!

    当然,Laravel 并不是完美的,并不适用于所有场景,比如高并发场景,计算密集、IO密集型应用,对于这些场景和应用,Laravel 不是不能做,而是不够好,性能不够高!当然,这不能怪 Laravel,这是 PHP 的问题,什么时候等 PHP 进化出高性能的运行模式,那 Laravel 就是完美的。

    最后,程序语言、程序框架始终是工具,只有根据需求和场景选择合适的工具才是真理。

    后记:该项目最终使用ASP.NET Core重新开发,重业务的项目还是要使用强类型语言,懂得都懂,不解释。

  • Laravel 9 安装中文语言包

    首先使用 composer 安装依赖包:

    composer require laravel-lang/publisher laravel-lang/lang laravel-lang/attributes --dev

    注意 laravel-lang/publisher 这个包需要 php 8.1 版本才行,如果是 php 8.1 以下版本,要使用如下命令来安装旧版:

    composer require laravel-lang/publisher:^13.0 laravel-lang/lang:^10.9 laravel-lang/attributes:^1.1

    然后使用下面的命令把中文语言包添加到 lang 目录下:

    php artisan lang:add zh_CN

    最后修改配置文件 config/app.php,来使用中文。

    'locale' => 'zh_CN',

    注:本文基于 Laravel Framework 9.33.0 版本测试通过。

    参考链接:

    https://github.com/Laravel-Lang/lang

    https://publisher.laravel-lang.com/installation/

  • 更新laravel框架

    composer update laravel/framework

  • 在blade中获取route名称

    在laravel的blade视图中,想要获取route名称,可以使用下面的代码:

    Route::currentRouteName()

  • Laravel无法加载.env的问题

    在万网虚拟主机上,发现laravel无法加载.env中配置的信息,然后一路跟踪发现,问题出在PHPDotEnv这个库上
    在Loader.php里有一个函数如下:

    public function setEnvironmentVariable($name, $value = null)
    {
        list($name, $value) = $this->normaliseEnvironmentVariable($name, $value);
    
        // Don't overwrite existing environment variables if we're immutable
        // Ruby's dotenv does this with `ENV[key] ||= value`.
        if ($this->immutable && $this->getEnvironmentVariable($name) !== null) {
            return;
        }
    
        putenv("$name=$value");
    
        $_ENV[$name] = $value;
        $_SERVER[$name] = $value;
    }

    里面使用了putenv函数,这个函数是用于设置或修改环境变量的,目的是把.env里面的配置放到环境变量里面。通过var_dump查看返回值发现都是NULL, 可以猜测万网虚拟主机应该是禁用了putenv这个函数。

    解决办法就是放弃使用.env文件,把里面的一些配置信息放到config/app.php里面去。

  • Laravel不同设备使用不同的视图

    使用composer添加第三方库jenssegers/agent

    // language: bash
    composer require jenssegers/agent

    然后在app/config/app.php 里的服务提供者数组里添加该库, 并添加别名

    // language: php
    'providers' => [
         Jenssegers\Agent\AgentServiceProvider::class,
    ]
    
    'aliases' => [
         'Agent'    => Jenssegers\Agent\Facades\Agent::class,    
    ]

    使用artisan创建一个服务提供者类
    php artisan make:provider ResponseMacroServiceProvider

    同样要在app.php里面配置

    // language: php
    'providers' => [
         App\Providers\ResponseMacroServiceProvider::class,    
    ]
    // 别名用不到,不用配置了

    修改app/Providers/ResponseMacroServiceProvider.phpboot方法

    // language: php
    public function boot(ResponseFactory $factory)
    {
        $factory->macro('ress', function ($viewname) use ($factory) {
            if ( Agent::isMobile() ) {
                return view()->make($viewname . "_mobile");
            } else {
                return view()->make($viewname . "_web");
            }
        });
    }

    在Controller中可以这样使用

    // language: php
    class HomeController extends Controller
    {
        public function index()
        {
            return response()->ress('home.index');
            //return view('home.index');
        }
    
        public function article()
        {
            return response()->ress('home.article');
        }
    }

    最后就是把视图名改为 _web.blade.php 和 _mobile.blade.php