バージョン5.4.Xを前提に、開発中に遭遇しやすい問題とその回避策を紹介します。
1. ルーティング設計の柔軟性
コントローラへのアクセスには明示的なルート定義が必要です。自動ルーティングも可能ですが、ルールマッチングによる内部転送が発生します。小〜中規模プロジェクトでは、ルートグループ化により異なる開発スタイルにも対応可能です。自動ルーティングが必ずしも悪手というわけではありません。
2. スケジュールタスクの実装と分離設計
コンソールとWebルートは独立しているため、ビジネスロジックはRepositoryやService層に切り出す必要があります。以下はクローリングタスクの例です:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Services\CrawlerService;
class CrawlJob extends Command
{
protected $signature = 'crawl:run';
protected $description = '定期的にデータをクロール';
protected $crawler;
public function __construct()
{
parent::__construct();
$this->crawler = new CrawlerService();
}
public function handle()
{
$this->crawler->executeAll();
}
}
カーネルに登録:
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
protected $commands = [
\App\Console\Commands\CrawlJob::class,
];
protected function schedule(Schedule $schedule)
{
$schedule->command('crawl:run')->daily();
}
}
テスト時はLinux環境推奨。Windowsでは予期せぬ挙動が発生することがあります:
php artisan schedule:run
エラー確認用にはeveryMinute()を一時的に使用:
$schedule->command('crawl:run')->everyMinute();
本番環境でのcron設定:
* * * * * /usr/bin/php /var/www/project/artisan schedule:run >> /dev/null 2>&1
ログ出力やメール通知もサポートされています:
$schedule->command('emails:send')
->daily()
->appendOutputTo('/var/log/laravel.log')
->emailOutputTo('admin@example.com');
3. 外部ライブラリの統合方法
TCPDFのような非Composerライブラリを導入する場合、composer.jsonにクラスパスを追加:
"autoload": {
"classmap": [
"app/Libraries/tcpdf"
]
}
その後、オートロードを再生成:
composer dump-autoload
使用例:
use TCPDF;
$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
4. 数値型変換の落とし穴
大きな整数値(例:2018011900012)が負数に変換されることがあります。VARCHARカラムには明示的に(string)でキャストして対応してください。
5. Nginx設定の注意点
間違った設定:
location / {
try_files /$uri /$uri/ /index.php?\$query_string;
}
正しい設定:
location / {
try_files $uri $uri/ /index.php?$query_string;
}
誤った設定ではクエリパラメータが正しく解析されません。
6. 権限関連の偶発的エラー
スケジュールタスク実行ユーザーとPHPプロセスユーザーが異なる場合、ファイル書き込みで権限エラーが発生することがあります。解決策:
@chmod($this->url, 0777);
またはcronをPHPユーザーで実行:
crontab -e -u www-data
7. mews/captcha v5.6の変更点
以前のバージョンではコントローラ経由で生成していましたが、v5.6では直接/captchaにアクセスすれば設定ファイルに基づいて自動生成されます。古い方式で実装すると設定が反映されません。
8. よくあるHTTPエラー
405 Method Not Allowed:ルート定義のHTTPメソッド(GET/POST)が一致していない
419 unknown status:CSRFトークンがリクエストに含まれていない